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

Commit dc0a5b1f authored by Juan Yescas's avatar Juan Yescas
Browse files

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
parent 2949179f
Loading
Loading
Loading
Loading
+6 −0
Original line number Diff line number Diff line
@@ -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);
            }
        }
    }

+40 −0
Original line number Diff line number Diff line
@@ -215,6 +215,46 @@ public class ProcFileReaderTest {
        assertFalse(reader.hasMoreData());
    }

    @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");