Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 0f064de8 authored by Kenny Root's avatar Kenny Root Committed by Android Git Automerger
Browse files

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

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

* commit '27358a69':
  Only allow 8 OBBs to be mounted by a UID
parents 6ce5f60c 27358a69
Loading
Loading
Loading
Loading
+32 −0
Original line number Diff line number Diff line
@@ -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);
                }
            }
        }
    }