From 9e4ff6ef9125d6316786cb90bd0b977a9009d84d Mon Sep 17 00:00:00 2001 From: Chia-chi Yeh Date: Thu, 14 Jul 2011 16:19:19 -0700 Subject: [PATCH] VPN: close the socket in protectVpn() to avoid leaking descriptors. Change-Id: Idda0c2ea1770abc490566e894711bcb08f60b354 --- .../android/net/IConnectivityManager.aidl | 2 +- .../android/server/ConnectivityService.java | 32 ++++++++++--------- 2 files changed, 18 insertions(+), 16 deletions(-) diff --git a/core/java/android/net/IConnectivityManager.aidl b/core/java/android/net/IConnectivityManager.aidl index d6f564351e..d95fc8de70 100644 --- a/core/java/android/net/IConnectivityManager.aidl +++ b/core/java/android/net/IConnectivityManager.aidl @@ -100,7 +100,7 @@ interface IConnectivityManager void setDataDependency(int networkType, boolean met); - void protectVpn(in ParcelFileDescriptor socket); + boolean protectVpn(in ParcelFileDescriptor socket); boolean prepareVpn(String oldPackage, String newPackage); diff --git a/services/java/com/android/server/ConnectivityService.java b/services/java/com/android/server/ConnectivityService.java index 85891a2d42..bf5deb7231 100644 --- a/services/java/com/android/server/ConnectivityService.java +++ b/services/java/com/android/server/ConnectivityService.java @@ -2528,8 +2528,23 @@ public class ConnectivityService extends IConnectivityManager.Stub { * @hide */ @Override - public void protectVpn(ParcelFileDescriptor socket) { - mVpn.protect(socket, getDefaultInterface()); + public boolean protectVpn(ParcelFileDescriptor socket) { + try { + int type = mActiveDefaultNetwork; + if (ConnectivityManager.isNetworkTypeValid(type)) { + mVpn.protect(socket, mNetTrackers[type].getLinkProperties().getInterfaceName()); + return true; + } + } catch (Exception e) { + // ignore + } finally { + try { + socket.close(); + } catch (Exception e) { + // ignore + } + } + return false; } /** @@ -2577,19 +2592,6 @@ public class ConnectivityService extends IConnectivityManager.Stub { return mVpn.getLegacyVpnInfo(); } - private String getDefaultInterface() { - if (ConnectivityManager.isNetworkTypeValid(mActiveDefaultNetwork)) { - NetworkStateTracker tracker = mNetTrackers[mActiveDefaultNetwork]; - if (tracker != null) { - LinkProperties properties = tracker.getLinkProperties(); - if (properties != null) { - return properties.getInterfaceName(); - } - } - } - throw new IllegalStateException("No default interface"); - } - /** * Callback for VPN subsystem. Currently VPN is not adapted to the service * through NetworkStateTracker since it works differently. For example, it