Create a shared preference setting and use it before loading/unloading cache
and disable cache if file operations failed in the last launch.
A simple if check when reading buffer size from file
diff --git a/src/com/android/settings/ManageApplications.java b/src/com/android/settings/ManageApplications.java
index 0d4895e..9cb4217 100644
--- a/src/com/android/settings/ManageApplications.java
+++ b/src/com/android/settings/ManageApplications.java
@@ -27,6 +27,7 @@
 import android.content.DialogInterface;
 import android.content.Intent;
 import android.content.IntentFilter;
+import android.content.SharedPreferences;
 import android.content.pm.ApplicationInfo;
 import android.content.pm.IPackageStatsObserver;
 import android.content.pm.PackageManager;
@@ -103,6 +104,8 @@
         DialogInterface.OnClickListener {
     // TAG for this activity
     private static final String TAG = "ManageApplications";
+    private static final String PREFS_NAME = "ManageAppsInfo.prefs";
+    private static final String PREF_DISABLE_CACHE = "disableCache";
     
     // Log information boolean
     private boolean localLOGV = Config.LOGV || false;
@@ -1533,7 +1536,7 @@
         private static final String mFileCacheName="ManageAppsInfo.txt";
         private static final int FILE_BUFFER_SIZE = 1024;
         private static final boolean DEBUG_CACHE = false;
-        private static final boolean DEBUG_CACHE_TIME = true;
+        private static final boolean DEBUG_CACHE_TIME = false;
         private Map<String, AppInfo> mAppPropCache = new HashMap<String, AppInfo>();
 
         private boolean isEmpty() {
@@ -1581,6 +1584,10 @@
                 while(fis.available() > 0) {
                     fis.read(lenBytes, 0, 2);
                     int buffLen = (lenBytes[0] << 8) | lenBytes[1];
+                    if ((buffLen <= 0) || (buffLen > byteBuff.length)) {
+                        err = true;
+                        break;
+                    }
                     // Buffer length cannot be great then max.
                     fis.read(byteBuff, 0, buffLen);
                     String buffStr = new String(byteBuff);
@@ -1617,17 +1624,18 @@
                         fis.close();
                     } catch (IOException e) {
                         Log.w(TAG, "Failed to close file " + cacheFile + " with exception : " +e);
+                        err = true;
                     }
                 }
-            }
-            if (err) {
-                Log.i(TAG, "Failed to load cache. Not using cache for now.");
-                // Clear cache and bail out
-                mAppPropCache.clear();
+                if (err) {
+                    Log.i(TAG, "Failed to load cache. Not using cache for now.");
+                    // Clear cache and bail out
+                    mAppPropCache.clear();
+                }
             }
         }
 
-        void writeToFile() {
+        boolean writeToFile() {
             File cacheFile = new File(getFilesDir(), mFileCacheName);
             FileOutputStream fos = null;
             try {
@@ -1662,34 +1670,58 @@
                         fos.write(byteBuff, 0, len);
                     } catch (IOException e) {
                         Log.w(TAG, "Failed to write to file : " + cacheFile + " with exception : " + e);
+                        return false;
                     }
                 }
                 if (DEBUG_CACHE_TIME) {
                     Log.i(TAG, "Took " + (SystemClock.uptimeMillis() - opStartTime) + " ms to write and process from file");
                 }
+                return true;
             } catch (FileNotFoundException e) {
                 Log.w(TAG, "Error opening file for write operation : " + cacheFile+
                         " with exception : " + e);
+                return false;
             } finally {
                 if (fos != null) {
                     try {
                         fos.close();
                     } catch (IOException e) {
                         Log.w(TAG, "Failed closing file : " + cacheFile + " with exception : " + e);
+                        return false;
                     }
                 }
             }
         }
         private void loadCache() {
-            if (FILE_CACHE) {
+             // Restore preferences
+            SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);
+            boolean disable = settings.getBoolean(PREF_DISABLE_CACHE, true);
+            if (disable) Log.w(TAG, "Cache has been disabled");
+            // Disable cache till the data is loaded successfully
+            SharedPreferences.Editor editor = settings.edit();
+            editor.putBoolean(PREF_DISABLE_CACHE, true);
+            editor.commit();
+            if (FILE_CACHE && !disable) {
                 readFromFile();
+                // Enable cache since the file has been read successfully
+                editor.putBoolean(PREF_DISABLE_CACHE, false);
+                editor.commit();
             }
         }
 
         private void updateCache() {
+            SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);
+            SharedPreferences.Editor editor = settings.edit();
+            editor.putBoolean(PREF_DISABLE_CACHE, true);
+            editor.commit();
             if (FILE_CACHE) {
-                writeToFile();
+                boolean writeStatus = writeToFile();
                 mAppPropCache.clear();
+                if (writeStatus) {
+                    // Enable cache since the file has been read successfully
+                    editor.putBoolean(PREF_DISABLE_CACHE, false);
+                    editor.commit();
+                }
             }
         }
     }