From 10ba60a4a11801ccb3ddd5aaa8c1afc464e4ac28 Mon Sep 17 00:00:00 2001 From: Paul Jensen Date: Fri, 20 Jun 2014 13:58:14 -0400 Subject: [PATCH] Use return values from JNI functions binding sockets and processes to networks. bug:15757549 Change-Id: If23b14febc923b9a0348f0cf9029fd4bf6e8d725 --- .../java/android/net/ConnectivityManager.java | 12 +++---- core/java/android/net/Network.java | 5 ++- core/java/android/net/NetworkUtils.java | 10 +++--- core/jni/android_net_NetUtils.cpp | 35 ++++++++++--------- 4 files changed, 32 insertions(+), 30 deletions(-) diff --git a/core/java/android/net/ConnectivityManager.java b/core/java/android/net/ConnectivityManager.java index b68ce367ee..396efff928 100644 --- a/core/java/android/net/ConnectivityManager.java +++ b/core/java/android/net/ConnectivityManager.java @@ -2372,12 +2372,10 @@ public class ConnectivityManager { */ public static boolean setProcessDefaultNetwork(Network network) { if (network == null) { - NetworkUtils.unbindProcessToNetwork(); + return NetworkUtils.unbindProcessToNetwork(); } else { - NetworkUtils.bindProcessToNetwork(network.netId); + return NetworkUtils.bindProcessToNetwork(network.netId); } - // TODO fix return value - return true; } /** @@ -2404,11 +2402,9 @@ public class ConnectivityManager { */ public static boolean setProcessDefaultNetworkForHostResolution(Network network) { if (network == null) { - NetworkUtils.unbindProcessToNetworkForHostResolution(); + return NetworkUtils.unbindProcessToNetworkForHostResolution(); } else { - NetworkUtils.bindProcessToNetworkForHostResolution(network.netId); + return NetworkUtils.bindProcessToNetworkForHostResolution(network.netId); } - // TODO hook up the return value. - return true; } } diff --git a/core/java/android/net/Network.java b/core/java/android/net/Network.java index 0a422c654f..9a22d78256 100644 --- a/core/java/android/net/Network.java +++ b/core/java/android/net/Network.java @@ -24,6 +24,7 @@ import java.io.IOException; import java.net.InetAddress; import java.net.InetSocketAddress; import java.net.Socket; +import java.net.SocketException; import java.net.UnknownHostException; import javax.net.SocketFactory; @@ -148,7 +149,9 @@ public class Network implements Parcelable { // Query a property of the underlying socket to ensure the underlying // socket exists so a file descriptor is available to bind to a network. socket.getReuseAddress(); - NetworkUtils.bindSocketToNetwork(socket.getFileDescriptor$().getInt$(), mNetId); + if (!NetworkUtils.bindSocketToNetwork(socket.getFileDescriptor$().getInt$(), mNetId)) { + throw new SocketException("Failed to bind socket to network."); + } return socket; } } diff --git a/core/java/android/net/NetworkUtils.java b/core/java/android/net/NetworkUtils.java index 15c0a71aa2..c4b17b6046 100644 --- a/core/java/android/net/NetworkUtils.java +++ b/core/java/android/net/NetworkUtils.java @@ -118,13 +118,13 @@ public class NetworkUtils { * is by design so an application doesn't accidentally use sockets it thinks are still bound to * a particular {@code Network}. */ - public native static void bindProcessToNetwork(int netId); + public native static boolean bindProcessToNetwork(int netId); /** * Clear any process specific {@code Network} binding. This reverts a call to * {@link #bindProcessToNetwork}. */ - public native static void unbindProcessToNetwork(); + public native static boolean unbindProcessToNetwork(); /** * Return the netId last passed to {@link #bindProcessToNetwork}, or NETID_UNSET if @@ -138,7 +138,7 @@ public class NetworkUtils { * * @deprecated This is strictly for legacy usage to support startUsingNetworkFeature(). */ - public native static void bindProcessToNetworkForHostResolution(int netId); + public native static boolean bindProcessToNetworkForHostResolution(int netId); /** * Clears any process specific {@link Network} binding for host resolution. This does @@ -146,13 +146,13 @@ public class NetworkUtils { * * @deprecated This is strictly for legacy usage to support startUsingNetworkFeature(). */ - public native static void unbindProcessToNetworkForHostResolution(); + public native static boolean unbindProcessToNetworkForHostResolution(); /** * Explicitly binds {@code socketfd} to the network designated by {@code netId}. This * overrides any binding via {@link #bindProcessToNetwork}. */ - public native static void bindSocketToNetwork(int socketfd, int netId); + public native static boolean bindSocketToNetwork(int socketfd, int netId); /** * Convert a IPv4 address from an integer to an InetAddress. diff --git a/core/jni/android_net_NetUtils.cpp b/core/jni/android_net_NetUtils.cpp index bc5e1b3237..6f898000bb 100644 --- a/core/jni/android_net_NetUtils.cpp +++ b/core/jni/android_net_NetUtils.cpp @@ -214,7 +214,8 @@ static jboolean android_net_utils_runDhcp(JNIEnv* env, jobject clazz, jstring if return android_net_utils_runDhcpCommon(env, clazz, ifname, info, false); } -static jboolean android_net_utils_runDhcpRenew(JNIEnv* env, jobject clazz, jstring ifname, jobject info) +static jboolean android_net_utils_runDhcpRenew(JNIEnv* env, jobject clazz, jstring ifname, + jobject info) { return android_net_utils_runDhcpCommon(env, clazz, ifname, info, true); } @@ -252,14 +253,14 @@ static void android_net_utils_markSocket(JNIEnv *env, jobject thiz, jint socket, } } -static void android_net_utils_bindProcessToNetwork(JNIEnv *env, jobject thiz, jint netId) +static jboolean android_net_utils_bindProcessToNetwork(JNIEnv *env, jobject thiz, jint netId) { - setNetworkForProcess(netId); + return (jboolean) !setNetworkForProcess(netId); } -static void android_net_utils_unbindProcessToNetwork(JNIEnv *env, jobject thiz) +static jboolean android_net_utils_unbindProcessToNetwork(JNIEnv *env, jobject thiz) { - setNetworkForProcess(NETID_UNSET); + return (jboolean) !setNetworkForProcess(NETID_UNSET); } static jint android_net_utils_getNetworkBoundToProcess(JNIEnv *env, jobject thiz) @@ -267,19 +268,21 @@ static jint android_net_utils_getNetworkBoundToProcess(JNIEnv *env, jobject thiz return getNetworkForProcess(); } -static void android_net_utils_bindProcessToNetworkForHostResolution(JNIEnv *env, jobject thiz, jint netId) +static jboolean android_net_utils_bindProcessToNetworkForHostResolution(JNIEnv *env, jobject thiz, + jint netId) { - setNetworkForResolv(netId); + return (jboolean) !setNetworkForResolv(netId); } -static void android_net_utils_unbindProcessToNetworkForHostResolution(JNIEnv *env, jobject thiz) +static jboolean android_net_utils_unbindProcessToNetworkForHostResolution(JNIEnv *env, jobject thiz) { - setNetworkForResolv(NETID_UNSET); + return (jboolean) !setNetworkForResolv(NETID_UNSET); } -static void android_net_utils_bindSocketToNetwork(JNIEnv *env, jobject thiz, jint socket, jint netId) +static jboolean android_net_utils_bindSocketToNetwork(JNIEnv *env, jobject thiz, jint socket, + jint netId) { - setNetworkForSocket(netId, socket); + return (jboolean) !setNetworkForSocket(netId, socket); } // ---------------------------------------------------------------------------- @@ -299,12 +302,12 @@ static JNINativeMethod gNetworkUtilMethods[] = { { "releaseDhcpLease", "(Ljava/lang/String;)Z", (void *)android_net_utils_releaseDhcpLease }, { "getDhcpError", "()Ljava/lang/String;", (void*) android_net_utils_getDhcpError }, { "markSocket", "(II)V", (void*) android_net_utils_markSocket }, - { "bindProcessToNetwork", "(I)V", (void*) android_net_utils_bindProcessToNetwork }, + { "bindProcessToNetwork", "(I)Z", (void*) android_net_utils_bindProcessToNetwork }, { "getNetworkBoundToProcess", "()I", (void*) android_net_utils_getNetworkBoundToProcess }, - { "unbindProcessToNetwork", "()V", (void*) android_net_utils_unbindProcessToNetwork }, - { "bindProcessToNetworkForHostResolution", "(I)V", (void*) android_net_utils_bindProcessToNetworkForHostResolution }, - { "unbindProcessToNetworkForHostResolution", "()V", (void*) android_net_utils_unbindProcessToNetworkForHostResolution }, - { "bindSocketToNetwork", "(II)V", (void*) android_net_utils_bindSocketToNetwork }, + { "unbindProcessToNetwork", "()Z", (void*) android_net_utils_unbindProcessToNetwork }, + { "bindProcessToNetworkForHostResolution", "(I)Z", (void*) android_net_utils_bindProcessToNetworkForHostResolution }, + { "unbindProcessToNetworkForHostResolution", "()Z", (void*) android_net_utils_unbindProcessToNetworkForHostResolution }, + { "bindSocketToNetwork", "(II)Z", (void*) android_net_utils_bindSocketToNetwork }, }; int register_android_net_NetworkUtils(JNIEnv* env)