From b8b9bf6f791f4aec49f8e19f5c17c099b640481c Mon Sep 17 00:00:00 2001 From: Dmitri Plotnikov Date: Fri, 28 Jan 2022 12:41:41 -0800 Subject: [PATCH] Do not unparcel TimeInFreqMultiStateCounter with CPU freq count mismatch Bug: 216740045 Test: atest FrameworksCoreTests:BatteryStatsTests Change-Id: I01847dbb025b0c1481066981156bf279240fdf32 --- .../android/internal/os/BatteryStatsImpl.java | 66 +++++++++---------- 1 file changed, 32 insertions(+), 34 deletions(-) diff --git a/core/java/com/android/internal/os/BatteryStatsImpl.java b/core/java/com/android/internal/os/BatteryStatsImpl.java index 7c203fbbba3bf..d305a23b8c2c2 100644 --- a/core/java/com/android/internal/os/BatteryStatsImpl.java +++ b/core/java/com/android/internal/os/BatteryStatsImpl.java @@ -1853,17 +1853,15 @@ public class BatteryStatsImpl extends BatteryStats { private final TimeBase mTimeBase; private final LongArrayMultiStateCounter mCounter; - private TimeInFreqMultiStateCounter(TimeBase timeBase, Parcel in, long timestampMs) { - mTimeBase = timeBase; - mCounter = LongArrayMultiStateCounter.CREATOR.createFromParcel(in); - mCounter.setEnabled(mTimeBase.isRunning(), timestampMs); - timeBase.add(this); - } - private TimeInFreqMultiStateCounter(TimeBase timeBase, int stateCount, int cpuFreqCount, long timestampMs) { + this(timeBase, new LongArrayMultiStateCounter(stateCount, cpuFreqCount), timestampMs); + } + + private TimeInFreqMultiStateCounter(TimeBase timeBase, LongArrayMultiStateCounter counter, + long timestampMs) { mTimeBase = timeBase; - mCounter = new LongArrayMultiStateCounter(stateCount, cpuFreqCount); + mCounter = counter; mCounter.setEnabled(mTimeBase.isRunning(), timestampMs); timeBase.add(this); } @@ -1872,6 +1870,19 @@ public class BatteryStatsImpl extends BatteryStats { mCounter.writeToParcel(out, 0); } + @Nullable + private static TimeInFreqMultiStateCounter readFromParcel(Parcel in, TimeBase timeBase, + int stateCount, int cpuFreqCount, long timestampMs) { + // Read the object from the Parcel, whether it's usable or not + LongArrayMultiStateCounter counter = + LongArrayMultiStateCounter.CREATOR.createFromParcel(in); + if (counter.getStateCount() != stateCount + || counter.getArrayLength() != cpuFreqCount) { + return null; + } + return new TimeInFreqMultiStateCounter(timeBase, counter, timestampMs); + } + @Override public void onTimeStarted(long elapsedRealtimeUs, long baseUptimeUs, long baseRealtimeUs) { mCounter.setEnabled(true, elapsedRealtimeUs / 1000); @@ -10492,25 +10503,18 @@ public class BatteryStatsImpl extends BatteryStats { stateCount = in.readInt(); if (stateCount != 0) { - // Read the object from the Parcel, whether it's usable or not - TimeInFreqMultiStateCounter counter = new TimeInFreqMultiStateCounter( - mBsi.mOnBatteryTimeBase, in, timestampMs); - if (stateCount == PROC_STATE_TIME_COUNTER_STATE_COUNT) { - mProcStateTimeMs = counter; - } + mProcStateTimeMs = TimeInFreqMultiStateCounter.readFromParcel(in, + mBsi.mOnBatteryTimeBase, PROC_STATE_TIME_COUNTER_STATE_COUNT, + mBsi.getCpuFreqCount(), mBsi.mClock.elapsedRealtime()); } else { mProcStateTimeMs = null; } stateCount = in.readInt(); if (stateCount != 0) { - // Read the object from the Parcel, whether it's usable or not - TimeInFreqMultiStateCounter counter = - new TimeInFreqMultiStateCounter( - mBsi.mOnBatteryScreenOffTimeBase, in, timestampMs); - if (stateCount == PROC_STATE_TIME_COUNTER_STATE_COUNT) { - mProcStateScreenOffTimeMs = counter; - } + mProcStateScreenOffTimeMs = TimeInFreqMultiStateCounter.readFromParcel(in, + mBsi.mOnBatteryScreenOffTimeBase, PROC_STATE_TIME_COUNTER_STATE_COUNT, + mBsi.getCpuFreqCount(), mBsi.mClock.elapsedRealtime()); } else { mProcStateScreenOffTimeMs = null; } @@ -16867,12 +16871,10 @@ public class BatteryStatsImpl extends BatteryStats { stateCount = in.readInt(); if (stateCount != 0) { - // Read the object from the Parcel, whether it's usable or not - TimeInFreqMultiStateCounter counter = new TimeInFreqMultiStateCounter( - mOnBatteryTimeBase, in, mClock.elapsedRealtime()); - if (stateCount == PROC_STATE_TIME_COUNTER_STATE_COUNT) { - u.mProcStateTimeMs = counter; - } + detachIfNotNull(u.mProcStateTimeMs); + u.mProcStateTimeMs = TimeInFreqMultiStateCounter.readFromParcel(in, + mOnBatteryTimeBase, PROC_STATE_TIME_COUNTER_STATE_COUNT, + getCpuFreqCount(), mClock.elapsedRealtime()); } detachIfNotNull(u.mProcStateScreenOffTimeMs); @@ -16881,13 +16883,9 @@ public class BatteryStatsImpl extends BatteryStats { stateCount = in.readInt(); if (stateCount != 0) { detachIfNotNull(u.mProcStateScreenOffTimeMs); - // Read the object from the Parcel, whether it's usable or not - TimeInFreqMultiStateCounter counter = - new TimeInFreqMultiStateCounter( - mOnBatteryScreenOffTimeBase, in, mClock.elapsedRealtime()); - if (stateCount == PROC_STATE_TIME_COUNTER_STATE_COUNT) { - u.mProcStateScreenOffTimeMs = counter; - } + u.mProcStateScreenOffTimeMs = TimeInFreqMultiStateCounter.readFromParcel(in, + mOnBatteryScreenOffTimeBase, PROC_STATE_TIME_COUNTER_STATE_COUNT, + getCpuFreqCount(), mClock.elapsedRealtime()); } if (in.readInt() != 0) {