am 27358a69: Only allow 8 OBBs to be mounted by a UID

Merge commit '27358a69b33eaa268ee75ef778ec824c8085adcc' into gingerbread-plus-aosp

* commit '27358a69b33eaa268ee75ef778ec824c8085adcc':
  Only allow 8 OBBs to be mounted by a UID
This commit is contained in:
Kenny Root
2010-09-30 17:30:33 -07:00
committed by Android Git Automerger

View File

@@ -76,6 +76,8 @@ class MountService extends IMountService.Stub
private static final String VOLD_TAG = "VoldConnector";
protected static final int MAX_OBBS = 8;
/*
* Internal vold volume state constants
*/
@@ -154,6 +156,7 @@ class MountService extends IMountService.Stub
* Mounted OBB tracking information. Used to track the current state of all
* OBBs.
*/
final private Map<Integer, Integer> mObbUidUsage = new HashMap<Integer, Integer>();
final private Map<IObbActionListener, List<ObbState>> mObbMounts = new HashMap<IObbActionListener, List<ObbState>>();
final private Map<String, ObbState> mObbPathToStateMap = new HashMap<String, ObbState>();
@@ -1576,6 +1579,12 @@ class MountService extends IMountService.Stub
}
final int callerUid = Binder.getCallingUid();
final Integer uidUsage = mObbUidUsage.get(callerUid);
if (uidUsage != null && uidUsage > MAX_OBBS) {
throw new IllegalStateException("Maximum number of OBBs mounted!");
}
obbState = new ObbState(filename, token, callerUid);
addObbState(obbState);
}
@@ -1637,6 +1646,15 @@ class MountService extends IMountService.Stub
}
obbStates.add(obbState);
mObbPathToStateMap.put(obbState.filename, obbState);
// Track the number of OBBs used by this UID.
final int uid = obbState.callerUid;
final Integer uidUsage = mObbUidUsage.get(uid);
if (uidUsage == null) {
mObbUidUsage.put(uid, 1);
} else {
mObbUidUsage.put(uid, uidUsage + 1);
}
}
}
@@ -1650,6 +1668,20 @@ class MountService extends IMountService.Stub
mObbMounts.remove(obbState.token);
}
mObbPathToStateMap.remove(obbState.filename);
// Track the number of OBBs used by this UID.
final int uid = obbState.callerUid;
final Integer uidUsage = mObbUidUsage.get(uid);
if (uidUsage == null) {
Slog.e(TAG, "Called removeObbState for UID that isn't in map: " + uid);
} else {
final int newUsage = uidUsage - 1;
if (newUsage == 0) {
mObbUidUsage.remove(uid);
} else {
mObbUidUsage.put(uid, newUsage);
}
}
}
}