Use return values from JNI functions binding sockets and processes to networks.
bug:15757549
Change-Id: If23b14febc923b9a0348f0cf9029fd4bf6e8d725
diff --git a/core/java/android/net/ConnectivityManager.java b/core/java/android/net/ConnectivityManager.java
index b68ce36..396efff 100644
--- a/core/java/android/net/ConnectivityManager.java
+++ b/core/java/android/net/ConnectivityManager.java
@@ -2372,12 +2372,10 @@
*/
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 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 0a422c6..9a22d78 100644
--- a/core/java/android/net/Network.java
+++ b/core/java/android/net/Network.java
@@ -24,6 +24,7 @@
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 @@
// 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 15c0a71..c4b17b6 100644
--- a/core/java/android/net/NetworkUtils.java
+++ b/core/java/android/net/NetworkUtils.java
@@ -118,13 +118,13 @@
* 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 @@
*
* @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 @@
*
* @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 bc5e1b3..6f89800 100644
--- a/core/jni/android_net_NetUtils.cpp
+++ b/core/jni/android_net_NetUtils.cpp
@@ -214,7 +214,8 @@
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_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 @@
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 @@
{ "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)