From de772cfbf0031f6a44f9959ffe1b78f3f30a8025 Mon Sep 17 00:00:00 2001 From: Tolriq Date: Mon, 1 May 2023 12:32:40 +0200 Subject: [PATCH] Catch errors and OOM when decoding ID3 frames. Invalid frames have no impact on ExoPlayer ability to play the media and should not fail on errors. Some tools can add 100Mb images in the tags that will trigger recoverable OOM with this fix. --- .../extractor/metadata/id3/Id3Decoder.java | 29 ++++++++++++------- 1 file changed, 18 insertions(+), 11 deletions(-) diff --git a/libraries/extractor/src/main/java/androidx/media3/extractor/metadata/id3/Id3Decoder.java b/libraries/extractor/src/main/java/androidx/media3/extractor/metadata/id3/Id3Decoder.java index b05717e947..9954764f14 100644 --- a/libraries/extractor/src/main/java/androidx/media3/extractor/metadata/id3/Id3Decoder.java +++ b/libraries/extractor/src/main/java/androidx/media3/extractor/metadata/id3/Id3Decoder.java @@ -372,8 +372,9 @@ public final class Id3Decoder extends SimpleMetadataDecoder { frameSize = removeUnsynchronization(id3Data, frameSize); } + String error = ""; + Id3Frame frame = null; try { - Id3Frame frame; if (frameId0 == 'T' && frameId1 == 'X' && frameId2 == 'X' @@ -430,18 +431,24 @@ public final class Id3Decoder extends SimpleMetadataDecoder { String id = getFrameId(majorVersion, frameId0, frameId1, frameId2, frameId3); frame = decodeBinaryFrame(id3Data, frameSize, id); } - if (frame == null) { - Log.w( - TAG, - "Failed to decode frame: id=" - + getFrameId(majorVersion, frameId0, frameId1, frameId2, frameId3) - + ", frameSize=" - + frameSize); - } - return frame; - } finally { + } catch (Exception e) { + error = ",error=" + e.getMessage(); + } catch (OutOfMemoryError e) { + error = ",error=" + e.getMessage(); + } + finally { id3Data.setPosition(nextFramePosition); } + if (frame == null) { + Log.w( + TAG, + "Failed to decode frame: id=" + + getFrameId(majorVersion, frameId0, frameId1, frameId2, frameId3) + + ", frameSize=" + + frameSize + + error); + } + return frame; } @Nullable