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

Commit 93a867ff authored by Adam Lesinski's avatar Adam Lesinski Committed by The Android Automerger
Browse files

Fix Array Index Out of Bounds in BatteryStatsImpl

If the power profile was not set yet, the default sizes of
cpu freq arrays could have been too small.

Bug:24244089
Change-Id: Ic17a1e8f2058c51fbdda14db35b7b62f4880be00
parent c99b3935
Loading
Loading
Loading
Loading
+13 −4
Original line number Diff line number Diff line
@@ -8044,6 +8044,10 @@ public final class BatteryStatsImpl extends BatteryStats {
     * wakelocks. If the screen is on, we just assign the actual cpu time an app used.
     */
    public void updateCpuTimeLocked() {
        if (mPowerProfile == null) {
            return;
        }

        if (DEBUG_ENERGY_CPU) {
            Slog.d(TAG, "!Cpu updating!");
        }
@@ -8131,14 +8135,19 @@ public final class BatteryStatsImpl extends BatteryStats {

                        // Add the cpu speeds to this UID. These are used as a ratio
                        // for computing the power this UID used.
                        if (u.mCpuClusterSpeed == null) {
                            u.mCpuClusterSpeed = new LongSamplingCounter[clusterSpeeds.length][];
                        final int numClusters = mPowerProfile.getNumCpuClusters();
                        if (u.mCpuClusterSpeed == null || u.mCpuClusterSpeed.length !=
                                numClusters) {
                            u.mCpuClusterSpeed = new LongSamplingCounter[numClusters][];
                        }

                        for (int cluster = 0; cluster < clusterSpeeds.length; cluster++) {
                            if (u.mCpuClusterSpeed[cluster] == null) {
                            final int speedsInCluster = mPowerProfile.getNumSpeedStepsInCpuCluster(
                                    cluster);
                            if (u.mCpuClusterSpeed[cluster] == null || speedsInCluster !=
                                    u.mCpuClusterSpeed[cluster].length) {
                                u.mCpuClusterSpeed[cluster] =
                                        new LongSamplingCounter[clusterSpeeds[cluster].length];
                                        new LongSamplingCounter[speedsInCluster];
                            }

                            final LongSamplingCounter[] cpuSpeeds = u.mCpuClusterSpeed[cluster];