From 4bd445a0665e51a1de8fb3a3eff453dccb505f65 Mon Sep 17 00:00:00 2001 From: Ricky Wai Date: Fri, 19 Jan 2018 23:54:12 +0000 Subject: [PATCH] Fix dumpsys network_watchlist NPE when watchlist xml is not ready yet Bug: 63908748 Test: dumpsys network_watchlist won't cause NPE anymore Change-Id: I4e15516cc3b0efa113a00acc90179f7008fc1525 --- .../server/net/watchlist/WatchlistConfig.java | 20 +++++++++++++------ .../net/watchlist/WatchlistConfigTests.java | 12 +++++++++++ 2 files changed, 26 insertions(+), 6 deletions(-) diff --git a/services/core/java/com/android/server/net/watchlist/WatchlistConfig.java b/services/core/java/com/android/server/net/watchlist/WatchlistConfig.java index fbf11fce08eb2..7387ad4f90ff5 100644 --- a/services/core/java/com/android/server/net/watchlist/WatchlistConfig.java +++ b/services/core/java/com/android/server/net/watchlist/WatchlistConfig.java @@ -161,7 +161,7 @@ class WatchlistConfig { public boolean containsDomain(String domain) { final CrcShaDigests domainDigests = mDomainDigests; if (domainDigests == null) { - Slog.wtf(TAG, "domainDigests should not be null"); + // mDomainDigests is not initialized return false; } // First it does a quick CRC32 check. @@ -177,7 +177,7 @@ class WatchlistConfig { public boolean containsIp(String ip) { final CrcShaDigests ipDigests = mIpDigests; if (ipDigests == null) { - Slog.wtf(TAG, "ipDigests should not be null"); + // mIpDigests is not initialized return false; } // First it does a quick CRC32 check. @@ -234,12 +234,20 @@ class WatchlistConfig { public void dump(FileDescriptor fd, PrintWriter pw, String[] args) { pw.println("Domain CRC32 digest list:"); - mDomainDigests.crc32Digests.dump(fd, pw, args); + if (mDomainDigests != null) { + mDomainDigests.crc32Digests.dump(fd, pw, args); + } pw.println("Domain SHA256 digest list:"); - mDomainDigests.sha256Digests.dump(fd, pw, args); + if (mDomainDigests != null) { + mDomainDigests.sha256Digests.dump(fd, pw, args); + } pw.println("Ip CRC32 digest list:"); - mIpDigests.crc32Digests.dump(fd, pw, args); + if (mIpDigests != null) { + mIpDigests.crc32Digests.dump(fd, pw, args); + } pw.println("Ip SHA256 digest list:"); - mIpDigests.sha256Digests.dump(fd, pw, args); + if (mIpDigests != null) { + mIpDigests.sha256Digests.dump(fd, pw, args); + } } } diff --git a/services/tests/servicestests/src/com/android/server/net/watchlist/WatchlistConfigTests.java b/services/tests/servicestests/src/com/android/server/net/watchlist/WatchlistConfigTests.java index 851d2c62e87e8..654acc20328df 100644 --- a/services/tests/servicestests/src/com/android/server/net/watchlist/WatchlistConfigTests.java +++ b/services/tests/servicestests/src/com/android/server/net/watchlist/WatchlistConfigTests.java @@ -33,12 +33,15 @@ import org.junit.Test; import org.junit.runner.RunWith; import java.io.BufferedReader; +import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.io.InputStreamReader; +import java.io.PrintWriter; import java.util.Arrays; + /** * runtest frameworks-services -c com.android.server.net.watchlist.WatchlistConfigTests */ @@ -117,6 +120,15 @@ public class WatchlistConfigTests { assertEquals(TEST_XML_1_HASH, HexDump.toHexString(config.getWatchlistConfigHash())); } + @Test + public void testWatchlistConfig_testDumpDoesNotCrash() throws Exception { + WatchlistConfig config = new WatchlistConfig(new File("/not_exist_path.xml")); + ByteArrayOutputStream bs = new ByteArrayOutputStream(2048); + PrintWriter pw = new PrintWriter(bs); + // Make sure dump still works even watchlist does not exist + config.dump(null, pw, null); + } + private static void copyWatchlistConfigXml(Context context, String xmlAsset, File outFile) throws IOException { writeToFile(outFile, readAsset(context, xmlAsset));