Bug 1270348 - Favicon decoder can return null Bitmaps r?sebastian draft
authorAndrzej Hunt <ahunt@mozilla.com>
Thu, 05 May 2016 12:24:41 -0700
changeset 363865 1411160ae3905299d5f70e6c51ee4bb0124a2244
parent 363864 eacfa3e222b31ad989e8d6689808b4fe1b7e67c7
child 520155 625ac8c12f202656aaa3e52c36a2400e39220e6b
push id17327
push userahunt@mozilla.com
push dateThu, 05 May 2016 19:25:45 +0000
reviewerssebastian
bugs1270348
milestone49.0a1
Bug 1270348 - Favicon decoder can return null Bitmaps r?sebastian MozReview-Commit-ID: LHcx3Ne5nLX
mobile/android/base/java/org/mozilla/gecko/favicons/LoadFaviconTask.java
--- a/mobile/android/base/java/org/mozilla/gecko/favicons/LoadFaviconTask.java
+++ b/mobile/android/base/java/org/mozilla/gecko/favicons/LoadFaviconTask.java
@@ -440,21 +440,33 @@ public class LoadFaviconTask {
                 saveFaviconToDb(db, loadedBitmaps.getBytesForDatabaseStorage());
                 return pushToCacheAndGetResult(loadedBitmaps);
             } else {
                 final Map<Integer, Bitmap> iconMap = new HashMap<>();
                 final List<Integer> sizes = new ArrayList<>();
 
                 while (loadedBitmaps.getBitmaps().hasNext()) {
                     final Bitmap b = loadedBitmaps.getBitmaps().next();
-                    iconMap.put(b.getWidth(), b);
-                    sizes.add(b.getWidth());
+
+                    // It's possible to receive null, most likely due to OOM or a zero-sized image,
+                    // from BitmapUtils.decodeByteArray(byte[], int, int, BitmapFactory.Options)
+                    if (b != null) {
+                        iconMap.put(b.getWidth(), b);
+                        sizes.add(b.getWidth());
+                    }
                 }
 
                 int bestSize = Favicons.selectBestSizeFromList(sizes, targetWidthAndHeight);
+
+                if (bestSize == -1) {
+                    // No icons found: this could occur if we weren't able to process any of the
+                    // supplied icons.
+                    return null;
+                }
+
                 return iconMap.get(bestSize);
             }
         }
 
         if (isUsingDefaultURL) {
             Favicons.putFaviconInFailedCache(faviconURL);
             return null;
         }