From patchwork Sat Jul 20 13:13:08 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: James Almer X-Patchwork-Id: 14004 Return-Path: X-Original-To: patchwork@ffaux-bg.ffmpeg.org Delivered-To: patchwork@ffaux-bg.ffmpeg.org Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by ffaux.localdomain (Postfix) with ESMTP id 0958C448983 for ; Sat, 20 Jul 2019 16:20:59 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id DD2D168A857; Sat, 20 Jul 2019 16:20:58 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-qk1-f194.google.com (mail-qk1-f194.google.com [209.85.222.194]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id A837168A77B for ; Sat, 20 Jul 2019 16:20:52 +0300 (EEST) Received: by mail-qk1-f194.google.com with SMTP id r6so25392649qkc.0 for ; Sat, 20 Jul 2019 06:20:52 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:subject:date:message-id:mime-version :content-transfer-encoding; bh=NAr1XjKYGCqfP/0L+EE0CQxjvDm+WSGj/d7+vNDjTxo=; b=NecmcUruSlVS5py6oZjSdLfEC2wDBm3l8j6EFGQz6jXeTe6gVrB5tNkRSkuHEylyY3 DVopVWoXXL8HLOp1iZcit/OVCoT3/ALEzNeiYRJqen/Z7hNmHTXcHas65kdgyUBTy1YE trtuxjFamzXgLSa05q/IFLdTQ8HbMrqJNhIafQaJoA0vGOLaPzhV5d8qGOhGBcgGoMa6 PRFtIYFLHOWYre7cvw+Sqkv+tOoTTVAm4SPEMo+p8xeMFm+VXOgEXxjwQmRMKYDCoCfJ ucK/ZgfiMGl2Iy7ePEqU2IEPOC3xznCurBI8NcTMGOHGllk15FNaXGxeAsht/FIfEAYB MhgQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:mime-version :content-transfer-encoding; bh=NAr1XjKYGCqfP/0L+EE0CQxjvDm+WSGj/d7+vNDjTxo=; b=YE9REHMDL7kG91C6gYxcRb6Y3/vvIuqa6NayLRTj5lKIJkexMKSt7nowrdrG3/AoMV pFSHtbGRdAJJbwLe34Jw2kPNXQJWzNEkdrLOy9OZjJWSL0v97d4+0vFieNxvWRghj3LM zcRo9fltaqdXY/YvsEDzOIVtR9klBiJrbX+KhYFLK+nBIJAnFbOEYhjAO1RsU7iPJCAZ NPAkudYH4j0NGTyHN+P2iTdSwQpCtHMVp3HuSX3iVi/dlwuOia28zSXplwL3qGd0ahOj I5UI5PP+pwo2C3Y3mLrsELBfCELDxvDURcPav9vLhjHh9r4Lblkh5nV6ExgRKCIPSZiZ +qOA== X-Gm-Message-State: APjAAAWcK6QkAC/rP0j3Y7DGCKtuMv5n8uvzI2qWc+wWPyiOblgopkDP AI3lsDqEcs77sKX1mffm0pf5xZIf X-Google-Smtp-Source: APXvYqyIaAFOMCMgyjeMRQIKD6BVU4aLropbazVHxAJ2uveaRv0rWLnx6AayFacyg0h2CxteDS5j+g== X-Received: by 2002:ae9:f409:: with SMTP id y9mr19939276qkl.244.1563628448988; Sat, 20 Jul 2019 06:14:08 -0700 (PDT) Received: from localhost.localdomain ([181.23.90.19]) by smtp.gmail.com with ESMTPSA id d9sm15486911qke.136.2019.07.20.06.14.07 for (version=TLS1_3 cipher=AEAD-AES256-GCM-SHA384 bits=256/256); Sat, 20 Jul 2019 06:14:08 -0700 (PDT) From: James Almer To: ffmpeg-devel@ffmpeg.org Date: Sat, 20 Jul 2019 10:13:08 -0300 Message-Id: <20190720131308.1040-1-jamrial@gmail.com> X-Mailer: git-send-email 2.22.0 MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH] avformat/aacdec: resync to the next aac sample on invalid data instead of aborting X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: FFmpeg development discussions and patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: FFmpeg development discussions and patches Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Should fix ticket #6634 Signed-off-by: James Almer --- libavformat/aacdec.c | 44 +++++++++++++++++++++++++++++--------------- 1 file changed, 29 insertions(+), 15 deletions(-) diff --git a/libavformat/aacdec.c b/libavformat/aacdec.c index 8a5450880b..5b00b3f664 100644 --- a/libavformat/aacdec.c +++ b/libavformat/aacdec.c @@ -80,10 +80,31 @@ static int adts_aac_probe(const AVProbeData *p) return 0; } +static int adts_aac_resync(AVFormatContext *s) +{ + uint16_t state; + + // skip data until an ADTS frame is found + state = avio_r8(s->pb); + while (!avio_feof(s->pb) && avio_tell(s->pb) < s->probesize) { + state = (state << 8) | avio_r8(s->pb); + if ((state >> 4) != 0xFFF) + continue; + avio_seek(s->pb, -2, SEEK_CUR); + break; + } + if (s->pb->eof_reached) + return AVERROR_EOF; + if ((state >> 4) != 0xFFF) + return AVERROR_INVALIDDATA; + + return 0; +} + static int adts_aac_read_header(AVFormatContext *s) { AVStream *st; - uint16_t state; + int ret; st = avformat_new_stream(s, NULL); if (!st) @@ -101,17 +122,9 @@ static int adts_aac_read_header(AVFormatContext *s) avio_seek(s->pb, cur, SEEK_SET); } - // skip data until the first ADTS frame is found - state = avio_r8(s->pb); - while (!avio_feof(s->pb) && avio_tell(s->pb) < s->probesize) { - state = (state << 8) | avio_r8(s->pb); - if ((state >> 4) != 0xFFF) - continue; - avio_seek(s->pb, -2, SEEK_CUR); - break; - } - if ((state >> 4) != 0xFFF) - return AVERROR_INVALIDDATA; + ret = adts_aac_resync(s); + if (ret < 0) + return ret; // LCM of all possible ADTS sample rates avpriv_set_pts_info(st, 64, 1, 28224000); @@ -177,9 +190,10 @@ retry: } if (!ff_id3v2_match(pkt->data, ID3v2_DEFAULT_MAGIC)) { av_packet_unref(pkt); - return AVERROR_INVALIDDATA; - } - ret = handle_id3(s, pkt); + ret = adts_aac_resync(s); + } else + ret = handle_id3(s, pkt); + if (ret < 0) return ret;