Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 1ba38b60 authored by Ray Chen's avatar Ray Chen
Browse files

Fix 2655246 file descriptor leak when accessing thumbnails

http://b/2655246

Moved from kraken to master (https://android-git.corp.google.com/g/#change,51691)

Change-Id: I7d0cffd745311d073415d597eb141e26fe1edcce
parent 03f02927
Loading
Loading
Loading
Loading
+20 −20
Original line number Diff line number Diff line
@@ -317,7 +317,10 @@ public final class MediaStore {
            // Log.v(TAG, "getThumbnail: origId="+origId+", kind="+kind+", isVideo="+isVideo);
            // If the magic is non-zero, we simply return thumbnail if it does exist.
            // querying MediaProvider and simply return thumbnail.
            MiniThumbFile thumbFile = MiniThumbFile.instance(baseUri);
            MiniThumbFile thumbFile = new MiniThumbFile(isVideo ? Video.Media.EXTERNAL_CONTENT_URI
                    : Images.Media.EXTERNAL_CONTENT_URI);
            Cursor c = null;
            try {
                long magic = thumbFile.getMagic(origId);
                if (magic != 0) {
                    if (kind == MICRO_KIND) {
@@ -331,8 +334,6 @@ public final class MediaStore {
                        return bitmap;
                    } else if (kind == MINI_KIND) {
                        String column = isVideo ? "video_id=" : "image_id=";
                    Cursor c = null;
                    try {
                        c = cr.query(baseUri, PROJECTION, column + origId, null, null);
                        if (c != null && c.moveToFirst()) {
                            bitmap = getMiniThumbFromFile(c, baseUri, cr, options);
@@ -340,17 +341,13 @@ public final class MediaStore {
                                return bitmap;
                            }
                        }
                    } finally {
                        if (c != null) c.close();
                    }
                    }
                }

            Cursor c = null;
            try {
                Uri blockingUri = baseUri.buildUpon().appendQueryParameter("blocking", "1")
                        .appendQueryParameter("orig_id", String.valueOf(origId))
                        .appendQueryParameter("group_id", String.valueOf(groupId)).build();
                if (c != null) c.close();
                c = cr.query(blockingUri, PROJECTION, null, null, null);
                // This happens when original image/video doesn't exist.
                if (c == null) return null;
@@ -397,6 +394,9 @@ public final class MediaStore {
                Log.w(TAG, ex);
            } finally {
                if (c != null) c.close();
                // To avoid file descriptor leak in application process.
                thumbFile.deactivate();
                thumbFile = null;
            }
            return bitmap;
        }