From bbf1861fdd2ba250354c060fe70f0ee7cbe93877 Mon Sep 17 00:00:00 2001 From: Mikael Gullstrand Date: Fri, 13 Dec 2013 10:44:50 +0100 Subject: Null pointer exception in FileRotator.java Sometimes a null pointer exception is thrown when examining files managed by the file rotator. The logs from the test show that the Wifi state is changed a large number of times. On every state change, a write operation is initiated on the file system. This will eventually result in out of memory and the call to mBasePath.list() in the maybeRotate(...) method in FileRotator.java will return null so the iteration will throw a NullPointerException. Change-Id: I5d5980d9593bc9ec75281169ca27ee591809903f --- core/java/com/android/internal/util/FileRotator.java | 7 ++++++- .../src/com/android/internal/util/FileRotatorTest.java | 13 +++++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/core/java/com/android/internal/util/FileRotator.java b/core/java/com/android/internal/util/FileRotator.java index 26235f13deab..71550be1c8d7 100644 --- a/core/java/com/android/internal/util/FileRotator.java +++ b/core/java/com/android/internal/util/FileRotator.java @@ -336,7 +336,12 @@ public class FileRotator { final long deleteBefore = currentTimeMillis - mDeleteAgeMillis; final FileInfo info = new FileInfo(mPrefix); - for (String name : mBasePath.list()) { + String[] baseFiles = mBasePath.list(); + if (baseFiles == null) { + return; + } + + for (String name : baseFiles) { if (!info.parse(name)) continue; if (info.isActive()) { diff --git a/core/tests/coretests/src/com/android/internal/util/FileRotatorTest.java b/core/tests/coretests/src/com/android/internal/util/FileRotatorTest.java index 95f0e67c0f7a..0e3c13a0e655 100644 --- a/core/tests/coretests/src/com/android/internal/util/FileRotatorTest.java +++ b/core/tests/coretests/src/com/android/internal/util/FileRotatorTest.java @@ -43,7 +43,10 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.Random; +import junit.framework.Assert; + import libcore.io.IoUtils; +import libcore.io.Libcore; /** * Tests for {@link FileRotator}. @@ -367,6 +370,16 @@ public class FileRotatorTest extends AndroidTestCase { assertReadAll(rotate, "bar"); } + public void testFileSystemInaccessible() throws Exception { + File inaccessibleDir = null; + String dirPath = getContext().getFilesDir() + File.separator + "inaccessible"; + inaccessibleDir = new File(dirPath); + final FileRotator rotate = new FileRotator(inaccessibleDir, PREFIX, SECOND_IN_MILLIS, SECOND_IN_MILLIS); + + // rotate should not throw on dir not mkdir-ed (or otherwise inaccessible) + rotate.maybeRotate(TEST_TIME); + } + private void touch(String... names) throws IOException { for (String name : names) { final OutputStream out = new FileOutputStream(new File(mBasePath, name)); -- cgit v1.2.3-59-g8ed1b