summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJuan Yescas <jyescas@google.com>2024-05-03 22:19:21 -0700
committerJuan Yescas <jyescas@google.com>2024-05-06 12:20:10 -0700
commitdc0a5b1fb3ffbd481a073ec23ae12c24d7de529b (patch)
tree634285a290dd9f11bec1b48017182b49116045cd
parent2949179fa0be36238d850fce5d3357b7836f4918 (diff)
downloadbase-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.java6
-rw-r--r--core/tests/utiltests/src/com/android/internal/util/ProcFileReaderTest.java40
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");