OSDN Git Service

UsageStats: Gracefully handle corrupt filenames
authorAdam Lesinski <adamlesinski@google.com>
Wed, 22 Jul 2015 23:01:45 +0000 (16:01 -0700)
committerAdam Lesinski <adamlesinski@google.com>
Wed, 22 Jul 2015 23:01:45 +0000 (16:01 -0700)
Not sure how useful this is, since renames should be atomic. If the filesystem
is corrupt I'm sure other parts of the system will break. Good to be safe though!

Bug:22172659
Change-Id: Iad339be2869d170bcf736c59feb93830a51905e1

services/usage/java/com/android/server/usage/UsageStatsDatabase.java
services/usage/java/com/android/server/usage/UsageStatsXml.java

index 4498b84..0a7091e 100644 (file)
@@ -191,7 +191,11 @@ class UsageStatsDatabase {
 
                 for (File f : files) {
                     final AtomicFile af = new AtomicFile(f);
-                    mSortedStatFiles[i].put(UsageStatsXml.parseBeginTime(af), af);
+                    try {
+                        mSortedStatFiles[i].put(UsageStatsXml.parseBeginTime(af), af);
+                    } catch (IOException e) {
+                        Slog.e(TAG, "failed to index file: " + f, e);
+                    }
                 }
             }
         }
@@ -506,7 +510,14 @@ class UsageStatsDatabase {
                 if (path.endsWith(BAK_SUFFIX)) {
                     f = new File(path.substring(0, path.length() - BAK_SUFFIX.length()));
                 }
-                long beginTime = UsageStatsXml.parseBeginTime(f);
+
+                long beginTime;
+                try {
+                    beginTime = UsageStatsXml.parseBeginTime(f);
+                } catch (IOException e) {
+                    beginTime = 0;
+                }
+
                 if (beginTime < expiryTime) {
                     new AtomicFile(f).delete();
                 }
index 186813e..543f361 100644 (file)
@@ -33,11 +33,11 @@ public class UsageStatsXml {
     private static final String VERSION_ATTR = "version";
     static final String CHECKED_IN_SUFFIX = "-c";
 
-    public static long parseBeginTime(AtomicFile file) {
+    public static long parseBeginTime(AtomicFile file) throws IOException {
         return parseBeginTime(file.getBaseFile());
     }
 
-    public static long parseBeginTime(File file) {
+    public static long parseBeginTime(File file) throws IOException {
         String name = file.getName();
 
         // Eat as many occurrences of -c as possible. This is due to a bug where -c
@@ -47,7 +47,12 @@ public class UsageStatsXml {
         while (name.endsWith(CHECKED_IN_SUFFIX)) {
             name = name.substring(0, name.length() - CHECKED_IN_SUFFIX.length());
         }
-        return Long.parseLong(name);
+
+        try {
+            return Long.parseLong(name);
+        } catch (NumberFormatException e) {
+            throw new IOException(e);
+        }
     }
 
     public static void read(AtomicFile file, IntervalStats statsOut) throws IOException {