diff options
author | Juan Yescas <jyescas@google.com> | 2024-05-03 22:19:21 -0700 |
---|---|---|
committer | Juan Yescas <jyescas@google.com> | 2024-05-06 12:20:10 -0700 |
commit | dc0a5b1fb3ffbd481a073ec23ae12c24d7de529b (patch) | |
tree | 634285a290dd9f11bec1b48017182b49116045cd | |
parent | 2949179fa0be36238d850fce5d3357b7836f4918 (diff) | |
download | base-dc0a5b1fb3ffbd481a073ec23ae12c24d7de529b.tar.gz |
Consume consecutive delimiters at beginning of refilled buffer
This change makes sure that the consecutive delimiters at the
beginning of the just refilled buffer are consumed.
Previously, if there were consecutive delimiters at the beginning
of the just refilled buffer, they were not being consumed and were
causing parsing errors. This was also causing fatal exceptions.
```
04-22 12:37:53.077 607 707 E AndroidRuntime: *** FATAL EXCEPTION IN SYSTEM PROCESS: CachedAppOptimizerThread
04-22 12:37:53.077 607 707 E AndroidRuntime: java.lang.NumberFormatException: invalid long: READ
04-22 12:37:53.077 607 707 E AndroidRuntime: at com.android.internal.util.ProcFileReader.invalidLong(ProcFileReader.java:238)
04-22 12:37:53.077 607 707 E AndroidRuntime: at com.android.internal.util.ProcFileReader.parseAndConsumeLong(ProcFileReader.java:220)
04-22 12:37:53.077 607 707 E AndroidRuntime: at com.android.internal.util.ProcFileReader.nextLong(ProcFileReader.java:183)
04-22 12:37:53.077 607 707 E AndroidRuntime: at com.android.internal.util.ProcFileReader.nextLong(ProcFileReader.java:172)
04-22 12:37:53.077 607 707 E AndroidRuntime: at com.android.internal.util.ProcFileReader.nextInt(ProcFileReader.java:246)
04-22 12:37:53.077 607 707 E AndroidRuntime: at com.android.internal.os.ProcLocksReader.handleBlockingFileLocks(ProcLocksReader.java:111)
04-22 12:37:53.077 607 707 E AndroidRuntime: at com.android.server.am.CachedAppOptimizer$FreezeHandler.handleMessage(CachedAppOptimizer.java:2267)
04-22 12:37:53.077 607 707 E AndroidRuntime: at android.os.Handler.dispatchMessage(Handler.java:107)
04-22 12
```
Bug: 336208153
Bug: 338416108
Bug: 331988929
Test: atest --host-unit-test-only -c ProcFileReaderTest
Change-Id: I12813fa204d53d53687ffe6e8e3c0a85595b7e25
-rw-r--r-- | core/java/com/android/internal/util/ProcFileReader.java | 6 | ||||
-rw-r--r-- | core/tests/utiltests/src/com/android/internal/util/ProcFileReaderTest.java | 40 |
2 files changed, 46 insertions, 0 deletions
diff --git a/core/java/com/android/internal/util/ProcFileReader.java b/core/java/com/android/internal/util/ProcFileReader.java index 6cf241e65d00..ddbb586f150e 100644 --- a/core/java/com/android/internal/util/ProcFileReader.java +++ b/core/java/com/android/internal/util/ProcFileReader.java @@ -89,6 +89,12 @@ public class ProcFileReader implements Closeable { mTail -= count; if (mTail == 0) { fillBuf(); + + if (mTail > 0 && mBuffer[0] == ' ') { + // After filling the buffer, it contains more consecutive + // delimiters that need to be skipped. + consumeBuf(0); + } } } diff --git a/core/tests/utiltests/src/com/android/internal/util/ProcFileReaderTest.java b/core/tests/utiltests/src/com/android/internal/util/ProcFileReaderTest.java index 4c00c1667e3c..9785ca7face5 100644 --- a/core/tests/utiltests/src/com/android/internal/util/ProcFileReaderTest.java +++ b/core/tests/utiltests/src/com/android/internal/util/ProcFileReaderTest.java @@ -216,6 +216,46 @@ public class ProcFileReaderTest { } @Test + public void testBufferSizeWithConsecutiveDelimiters() throws Exception { + // Read numbers using very small buffer size, exercising fillBuf() + // Include more consecutive delimiters than the buffer size. + final ProcFileReader reader = + buildReader("1 21 3 41 5 61 7 81 9 10\n", 3); + + assertEquals(1, reader.nextInt()); + assertEquals(21, reader.nextInt()); + assertEquals(3, reader.nextInt()); + assertEquals(41, reader.nextInt()); + assertEquals(5, reader.nextInt()); + assertEquals(61, reader.nextInt()); + assertEquals(7, reader.nextInt()); + assertEquals(81, reader.nextInt()); + assertEquals(9, reader.nextInt()); + assertEquals(10, reader.nextInt()); + reader.finishLine(); + assertFalse(reader.hasMoreData()); + } + + @Test + public void testBufferSizeWithConsecutiveDelimitersAndMultipleLines() throws Exception { + final ProcFileReader reader = + buildReader("1 21 41 \n 5 7 81 \n 9 10 \n", 3); + + assertEquals(1, reader.nextInt()); + assertEquals(21, reader.nextInt()); + assertEquals(41, reader.nextInt()); + reader.finishLine(); + assertEquals(5, reader.nextInt()); + assertEquals(7, reader.nextInt()); + assertEquals(81, reader.nextInt()); + reader.finishLine(); + assertEquals(9, reader.nextInt()); + assertEquals(10, reader.nextInt()); + reader.finishLine(); + assertFalse(reader.hasMoreData()); + } + + @Test public void testIgnore() throws Exception { final ProcFileReader reader = buildReader("a b c\n"); |