From c5d583d425a6cf219af967d2ca1acc2cf8451968 Mon Sep 17 00:00:00 2001 From: M66B Date: Sun, 22 Oct 2017 08:00:08 +0200 Subject: [PATCH] Skip protect socket from Lollipop --- .../eu/faircode/netguard/ServiceSinkhole.java | 12 +++++++++--- app/src/main/jni/netguard/netguard.c | 15 ++++++++++++++- app/src/main/jni/netguard/netguard.h | 1 + 3 files changed, 24 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/eu/faircode/netguard/ServiceSinkhole.java b/app/src/main/java/eu/faircode/netguard/ServiceSinkhole.java index 7635d100..6368ec61 100644 --- a/app/src/main/java/eu/faircode/netguard/ServiceSinkhole.java +++ b/app/src/main/java/eu/faircode/netguard/ServiceSinkhole.java @@ -193,7 +193,7 @@ public class ServiceSinkhole extends VpnService implements SharedPreferences.OnS private static final String ACTION_SCREEN_OFF_DELAYED = "eu.faircode.netguard.SCREEN_OFF_DELAYED"; private static final String ACTION_WATCHDOG = "eu.faircode.netguard.WATCHDOG"; - private native void jni_init(); + private native void jni_init(int sdk); private native void jni_start(int tun, boolean fwd53, int rcode, int loglevel); @@ -1345,7 +1345,12 @@ public class ServiceSinkhole extends VpnService implements SharedPreferences.OnS } catch (PackageManager.NameNotFoundException ex) { Log.e(TAG, ex.toString() + "\n" + Log.getStackTraceString(ex)); } - else if (filter) + else if (filter) { + try { + builder.addDisallowedApplication(getPackageName()); + } catch (PackageManager.NameNotFoundException ex) { + Log.e(TAG, ex.toString() + "\n" + Log.getStackTraceString(ex)); + } for (Rule rule : listRule) if (!rule.apply || (!system && rule.system)) try { @@ -1354,6 +1359,7 @@ public class ServiceSinkhole extends VpnService implements SharedPreferences.OnS } catch (PackageManager.NameNotFoundException ex) { Log.e(TAG, ex.toString() + "\n" + Log.getStackTraceString(ex)); } + } // Build configure intent Intent configure = new Intent(this, ActivityMain.class); @@ -2164,7 +2170,7 @@ public class ServiceSinkhole extends VpnService implements SharedPreferences.OnS SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this); // Native init - jni_init(); + jni_init(Build.VERSION.SDK_INT); boolean pcap = prefs.getBoolean("pcap", false); setPcap(pcap, this); diff --git a/app/src/main/jni/netguard/netguard.c b/app/src/main/jni/netguard/netguard.c index b036af37..42cc2f73 100644 --- a/app/src/main/jni/netguard/netguard.c +++ b/app/src/main/jni/netguard/netguard.c @@ -101,12 +101,13 @@ void JNI_OnUnload(JavaVM *vm, void *reserved) { // JNI ServiceSinkhole JNIEXPORT void JNICALL -Java_eu_faircode_netguard_ServiceSinkhole_jni_1init(JNIEnv *env, jobject instance) { +Java_eu_faircode_netguard_ServiceSinkhole_jni_1init(JNIEnv *env, jobject instance, jint sdk) { loglevel = ANDROID_LOG_WARN; struct arguments args; args.env = env; args.instance = instance; + args.sdk = sdk; init(&args); *socks5_addr = 0; @@ -417,9 +418,21 @@ void report_error(const struct arguments *args, jint error, const char *fmt, ... static jmethodID midProtect = NULL; int protect_socket(const struct arguments *args, int socket) { + if (args->sdk >= 21) + return 0; + jclass cls = (*args->env)->GetObjectClass(args->env, args->instance); + if (cls == NULL) { + log_android(ANDROID_LOG_ERROR, "protect socket failed to get class"); + return -1; + } + if (midProtect == NULL) midProtect = jniGetMethodID(args->env, cls, "protect", "(I)Z"); + if (midProtect == NULL) { + log_android(ANDROID_LOG_ERROR, "protect socket failed to get method"); + return -1; + } jboolean isProtected = (*args->env)->CallBooleanMethod( args->env, args->instance, midProtect, socket); diff --git a/app/src/main/jni/netguard/netguard.h b/app/src/main/jni/netguard/netguard.h index b4d5affb..063cbf41 100644 --- a/app/src/main/jni/netguard/netguard.h +++ b/app/src/main/jni/netguard/netguard.h @@ -67,6 +67,7 @@ struct arguments { JNIEnv *env; jobject instance; + int sdk; int tun; jboolean fwd53; jint rcode;