From 27358a69b33eaa268ee75ef778ec824c8085adcc Mon Sep 17 00:00:00 2001 From: Kenny Root Date: Wed, 29 Sep 2010 19:27:20 -0700 Subject: Only allow 8 OBBs to be mounted by a UID Change-Id: I4f017c5408af903c6c9ba007a2cf7f488a7fcd27 --- services/java/com/android/server/MountService.java | 32 ++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/services/java/com/android/server/MountService.java b/services/java/com/android/server/MountService.java index ea280a54f230..62a989447f27 100644 --- a/services/java/com/android/server/MountService.java +++ b/services/java/com/android/server/MountService.java @@ -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 mObbUidUsage = new HashMap(); final private Map> mObbMounts = new HashMap>(); final private Map mObbPathToStateMap = new HashMap(); @@ -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); + } + } } } -- cgit v1.2.3-59-g8ed1b