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
diff --git a/core/java/com/android/internal/util/ProcFileReader.java b/core/java/com/android/internal/util/ProcFileReader.java
index 6cf241e..ddbb586 100644
--- a/core/java/com/android/internal/util/ProcFileReader.java
+++ b/core/java/com/android/internal/util/ProcFileReader.java
@@ -89,6 +89,12 @@
         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 4c00c16..9785ca7 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 @@
     }
 
     @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");