Skip to content

Commit f679d4c

Browse files
Wink SavilleAndroid (Google) Code Review
authored andcommitted
Merge "Fix FeatureUser leak in ConnectivityService" into honeycomb-LTE
2 parents bf361b5 + 3bed4c9 commit f679d4c

1 file changed

Lines changed: 37 additions & 15 deletions

File tree

services/java/com/android/server/ConnectivityService.java

Lines changed: 37 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -220,7 +220,7 @@ public class ConnectivityService extends IConnectivityManager.Stub {
220220

221221
// list of DeathRecipients used to make sure features are turned off when
222222
// a process dies
223-
private List mFeatureUsers;
223+
private List<FeatureUser> mFeatureUsers;
224224

225225
private boolean mSystemReady;
226226
private Intent mInitialBroadcast;
@@ -404,7 +404,7 @@ private ConnectivityService(Context context) {
404404
mNetRequestersPids[i] = new ArrayList();
405405
}
406406

407-
mFeatureUsers = new ArrayList();
407+
mFeatureUsers = new ArrayList<FeatureUser>();
408408

409409
mNumDnsEntries = 0;
410410

@@ -677,6 +677,20 @@ public void expire() {
677677
stopUsingNetworkFeature(this, false);
678678
}
679679

680+
public boolean isSameUser(FeatureUser u) {
681+
if (u == null) return false;
682+
683+
return isSameUser(u.mPid, u.mUid, u.mNetworkType, u.mFeature);
684+
}
685+
686+
public boolean isSameUser(int pid, int uid, int networkType, String feature) {
687+
if ((mPid == pid) && (mUid == uid) && (mNetworkType == networkType) &&
688+
TextUtils.equals(mFeature, feature)) {
689+
return true;
690+
}
691+
return false;
692+
}
693+
680694
public String toString() {
681695
return "FeatureUser("+mNetworkType+","+mFeature+","+mPid+","+mUid+"), created " +
682696
(System.currentTimeMillis() - mCreateTime) + " mSec ago";
@@ -727,16 +741,29 @@ public int startUsingNetworkFeature(int networkType, String feature,
727741
}
728742
}
729743

744+
int restoreTimer = getRestoreDefaultNetworkDelay(usedNetworkType);
745+
730746
synchronized(this) {
731-
mFeatureUsers.add(f);
747+
boolean addToList = true;
748+
if (restoreTimer < 0) {
749+
// In case there is no timer is specified for the feature,
750+
// make sure we don't add duplicate entry with the same request.
751+
for (FeatureUser u : mFeatureUsers) {
752+
if (u.isSameUser(f)) {
753+
// Duplicate user is found. Do not add.
754+
addToList = false;
755+
break;
756+
}
757+
}
758+
}
759+
760+
if (addToList) mFeatureUsers.add(f);
732761
if (!mNetRequestersPids[usedNetworkType].contains(currentPid)) {
733762
// this gets used for per-pid dns when connected
734763
mNetRequestersPids[usedNetworkType].add(currentPid);
735764
}
736765
}
737766

738-
int restoreTimer = getRestoreDefaultNetworkDelay(usedNetworkType);
739-
740767
if (restoreTimer >= 0) {
741768
mHandler.sendMessageDelayed(
742769
mHandler.obtainMessage(EVENT_RESTORE_DEFAULT_NETWORK, f), restoreTimer);
@@ -786,11 +813,9 @@ public int stopUsingNetworkFeature(int networkType, String feature) {
786813
boolean found = false;
787814

788815
synchronized(this) {
789-
for (int i = 0; i < mFeatureUsers.size() ; i++) {
790-
u = (FeatureUser)mFeatureUsers.get(i);
791-
if (uid == u.mUid && pid == u.mPid &&
792-
networkType == u.mNetworkType &&
793-
TextUtils.equals(feature, u.mFeature)) {
816+
for (FeatureUser x : mFeatureUsers) {
817+
if (x.isSameUser(pid, uid, networkType, feature)) {
818+
u = x;
794819
found = true;
795820
break;
796821
}
@@ -842,11 +867,8 @@ private int stopUsingNetworkFeature(FeatureUser u, boolean ignoreDups) {
842867
// do not pay attention to duplicate requests - in effect the
843868
// API does not refcount and a single stop will counter multiple starts.
844869
if (ignoreDups == false) {
845-
for (int i = 0; i < mFeatureUsers.size() ; i++) {
846-
FeatureUser x = (FeatureUser)mFeatureUsers.get(i);
847-
if (x.mUid == u.mUid && x.mPid == u.mPid &&
848-
x.mNetworkType == u.mNetworkType &&
849-
TextUtils.equals(x.mFeature, u.mFeature)) {
870+
for (FeatureUser x : mFeatureUsers) {
871+
if (x.isSameUser(u)) {
850872
if (DBG) log("ignoring stopUsingNetworkFeature as dup is found");
851873
return 1;
852874
}

0 commit comments

Comments
 (0)