Loading core/java/android/net/VpnService.java +4 −3 Original line number Diff line number Diff line Loading @@ -151,9 +151,10 @@ public class VpnService extends Service { } /** * Protect a socket from VPN connections. The socket will be bound to the * current default network interface, so its traffic will not be forwarded * through VPN. This method is useful if some connections need to be kept * Protect a socket from VPN connections. After protecting, data sent * through this socket will go directly to the underlying network, * so its traffic will not be forwarded through the VPN. * This method is useful if some connections need to be kept * outside of VPN. For example, a VPN tunnel should protect itself if its * destination is covered by VPN routes. Otherwise its outgoing packets * will be sent back to the VPN interface and cause an infinite loop. This Loading services/core/java/com/android/server/ConnectivityService.java +1 −2 Original line number Diff line number Diff line Loading @@ -3665,8 +3665,7 @@ public class ConnectivityService extends IConnectivityManager.Stub { int user = UserHandle.getUserId(Binder.getCallingUid()); if (ConnectivityManager.isNetworkTypeValid(type) && mNetTrackers[type] != null) { synchronized(mVpns) { mVpns.get(user).protect(socket, mNetTrackers[type].getLinkProperties().getInterfaceName()); mVpns.get(user).protect(socket); } return true; } Loading services/core/java/com/android/server/connectivity/Vpn.java +3 −7 Original line number Diff line number Diff line Loading @@ -284,13 +284,12 @@ public class Vpn extends BaseNetworkStateTracker { } /** * Protect a socket from routing changes by binding it to the given * interface. The socket is NOT closed by this method. * Protect a socket from VPN rules by binding it to the main routing table. * The socket is NOT closed by this method. * * @param socket The socket to be bound. * @param interfaze The name of the interface. */ public void protect(ParcelFileDescriptor socket, String interfaze) throws Exception { public void protect(ParcelFileDescriptor socket) throws Exception { PackageManager pm = mContext.getPackageManager(); int appUid = pm.getPackageUid(mPackage, mUserId); Loading @@ -304,8 +303,6 @@ public class Vpn extends BaseNetworkStateTracker { } finally { Binder.restoreCallingIdentity(token); } // bind the socket to the interface jniProtect(socket.getFd(), interfaze); } Loading Loading @@ -684,7 +681,6 @@ public class Vpn extends BaseNetworkStateTracker { private native int jniSetRoutes(String interfaze, String routes); private native void jniReset(String interfaze); private native int jniCheck(String interfaze); private native void jniProtect(int socket, String interfaze); private static RouteInfo findIPv4DefaultRoute(LinkProperties prop) { for (RouteInfo route : prop.getAllRoutes()) { Loading services/core/jni/com_android_server_connectivity_Vpn.cpp +0 −23 Original line number Diff line number Diff line Loading @@ -302,15 +302,6 @@ static int check_interface(const char *name) return ifr4.ifr_flags; } static int bind_to_interface(int socket, const char *name) { if (setsockopt(socket, SOL_SOCKET, SO_BINDTODEVICE, name, strlen(name))) { ALOGE("Cannot bind socket to %s: %s", name, strerror(errno)); return SYSTEM_ERROR; } return 0; } //------------------------------------------------------------------------------ static void throwException(JNIEnv *env, int error, const char *message) Loading Loading @@ -433,19 +424,6 @@ static jint check(JNIEnv *env, jobject thiz, jstring jName) return flags; } static void protect(JNIEnv *env, jobject thiz, jint socket, jstring jName) { const char *name = jName ? env->GetStringUTFChars(jName, NULL) : NULL; if (!name) { jniThrowNullPointerException(env, "name"); return; } if (bind_to_interface(socket, name) < 0) { throwException(env, SYSTEM_ERROR, "Cannot protect socket"); } env->ReleaseStringUTFChars(jName, name); } //------------------------------------------------------------------------------ static JNINativeMethod gMethods[] = { Loading @@ -455,7 +433,6 @@ static JNINativeMethod gMethods[] = { {"jniSetRoutes", "(Ljava/lang/String;Ljava/lang/String;)I", (void *)setRoutes}, {"jniReset", "(Ljava/lang/String;)V", (void *)reset}, {"jniCheck", "(Ljava/lang/String;)I", (void *)check}, {"jniProtect", "(ILjava/lang/String;)V", (void *)protect}, }; int register_android_server_connectivity_Vpn(JNIEnv *env) Loading Loading
core/java/android/net/VpnService.java +4 −3 Original line number Diff line number Diff line Loading @@ -151,9 +151,10 @@ public class VpnService extends Service { } /** * Protect a socket from VPN connections. The socket will be bound to the * current default network interface, so its traffic will not be forwarded * through VPN. This method is useful if some connections need to be kept * Protect a socket from VPN connections. After protecting, data sent * through this socket will go directly to the underlying network, * so its traffic will not be forwarded through the VPN. * This method is useful if some connections need to be kept * outside of VPN. For example, a VPN tunnel should protect itself if its * destination is covered by VPN routes. Otherwise its outgoing packets * will be sent back to the VPN interface and cause an infinite loop. This Loading
services/core/java/com/android/server/ConnectivityService.java +1 −2 Original line number Diff line number Diff line Loading @@ -3665,8 +3665,7 @@ public class ConnectivityService extends IConnectivityManager.Stub { int user = UserHandle.getUserId(Binder.getCallingUid()); if (ConnectivityManager.isNetworkTypeValid(type) && mNetTrackers[type] != null) { synchronized(mVpns) { mVpns.get(user).protect(socket, mNetTrackers[type].getLinkProperties().getInterfaceName()); mVpns.get(user).protect(socket); } return true; } Loading
services/core/java/com/android/server/connectivity/Vpn.java +3 −7 Original line number Diff line number Diff line Loading @@ -284,13 +284,12 @@ public class Vpn extends BaseNetworkStateTracker { } /** * Protect a socket from routing changes by binding it to the given * interface. The socket is NOT closed by this method. * Protect a socket from VPN rules by binding it to the main routing table. * The socket is NOT closed by this method. * * @param socket The socket to be bound. * @param interfaze The name of the interface. */ public void protect(ParcelFileDescriptor socket, String interfaze) throws Exception { public void protect(ParcelFileDescriptor socket) throws Exception { PackageManager pm = mContext.getPackageManager(); int appUid = pm.getPackageUid(mPackage, mUserId); Loading @@ -304,8 +303,6 @@ public class Vpn extends BaseNetworkStateTracker { } finally { Binder.restoreCallingIdentity(token); } // bind the socket to the interface jniProtect(socket.getFd(), interfaze); } Loading Loading @@ -684,7 +681,6 @@ public class Vpn extends BaseNetworkStateTracker { private native int jniSetRoutes(String interfaze, String routes); private native void jniReset(String interfaze); private native int jniCheck(String interfaze); private native void jniProtect(int socket, String interfaze); private static RouteInfo findIPv4DefaultRoute(LinkProperties prop) { for (RouteInfo route : prop.getAllRoutes()) { Loading
services/core/jni/com_android_server_connectivity_Vpn.cpp +0 −23 Original line number Diff line number Diff line Loading @@ -302,15 +302,6 @@ static int check_interface(const char *name) return ifr4.ifr_flags; } static int bind_to_interface(int socket, const char *name) { if (setsockopt(socket, SOL_SOCKET, SO_BINDTODEVICE, name, strlen(name))) { ALOGE("Cannot bind socket to %s: %s", name, strerror(errno)); return SYSTEM_ERROR; } return 0; } //------------------------------------------------------------------------------ static void throwException(JNIEnv *env, int error, const char *message) Loading Loading @@ -433,19 +424,6 @@ static jint check(JNIEnv *env, jobject thiz, jstring jName) return flags; } static void protect(JNIEnv *env, jobject thiz, jint socket, jstring jName) { const char *name = jName ? env->GetStringUTFChars(jName, NULL) : NULL; if (!name) { jniThrowNullPointerException(env, "name"); return; } if (bind_to_interface(socket, name) < 0) { throwException(env, SYSTEM_ERROR, "Cannot protect socket"); } env->ReleaseStringUTFChars(jName, name); } //------------------------------------------------------------------------------ static JNINativeMethod gMethods[] = { Loading @@ -455,7 +433,6 @@ static JNINativeMethod gMethods[] = { {"jniSetRoutes", "(Ljava/lang/String;Ljava/lang/String;)I", (void *)setRoutes}, {"jniReset", "(Ljava/lang/String;)V", (void *)reset}, {"jniCheck", "(Ljava/lang/String;)I", (void *)check}, {"jniProtect", "(ILjava/lang/String;)V", (void *)protect}, }; int register_android_server_connectivity_Vpn(JNIEnv *env) Loading