From patchwork Sat Jan 27 23:01:13 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Karsten Otto X-Patchwork-Id: 7427 Delivered-To: ffmpegpatchwork@gmail.com Received: by 10.2.156.27 with SMTP id q27csp2288582jak; Sat, 27 Jan 2018 15:01:41 -0800 (PST) X-Google-Smtp-Source: AH8x22689Wu3feKsqXcYAgg4oICJ/9/rD3C/ZPWrRsRZM2mbNZPxAUFFxr76XhpnNkQz9tKUnvhV X-Received: by 10.223.152.172 with SMTP id w41mr15336662wrb.12.1517094101213; Sat, 27 Jan 2018 15:01:41 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1517094101; cv=none; d=google.com; s=arc-20160816; b=EBJ8Lve3kfq3APkuSlImk8Y9u7hCQPsqQxdrZMnil8kTWnYHgAA/Zcd9HNxVZ099RZ IGAI2+YodDKTXn6oqzxzGoPVKn/m50Z7+/t7W5AfX+0+7QJR1W18LOWEyDo22oF3drpe hvr9jAakqAoLkaZRAUZW5Pwh0HL6Vajy+hkcE6BD6kGF5xUm5h3gbV/G/wZyLTiIjWtp 1WdWkVhQGKTiRcvQ2F9JzmjWLqS6GFipU40/WjPt6eLHIpSHXwnyvZNgTYPREO+Rt6kn gY2WYkoFUMAE8rLxEF3OOky8KAmz3HufnS6zmt+zOusq81IZiPDu8hkQ/aRrD42rczyX xXXQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:mime-version:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:references:in-reply-to:message-id:date :to:from:dkim-signature:delivered-to:arc-authentication-results; bh=xkFerp60zLaa9NgceNlEi6dq2RS6PVJiUV/qpCAxyJc=; b=JzsbgHRpeGkbU6PfrAk5zvGwHsasGqTOWGEz4qIIBB9D+DpRV0onBaCxL3jNId4Ten puUv/JfSISzgLHv1DJI4jKTFqO9yF+JFqHO8Tx17s+XaYGzQ+x/DeKBPaWcfUtz9gK4N 9WLZbTty6ajiQM1Vnz5xqSEHwmY61Kea+nz+/5vHdlxonSgeGjbCVgc2D2mTrMv1fgsX t03RZJb2Nxgt4cSrBkEXO7sl9EBQDaSLdSfiAPuNVokbo6G58wrQrYLlayMtvSvD1eEn k2zVdn5Woz0r95gZ3t6QnbbBMYOkOipmVmuqqCYF7Wt14H3RIGAc+pjLxVuU5+qmhJMO Djpg== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@posteo.de header.s=2017 header.b=EPV/gSz1; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id q5si7586747wrg.10.2018.01.27.15.01.40; Sat, 27 Jan 2018 15:01:41 -0800 (PST) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@posteo.de header.s=2017 header.b=EPV/gSz1; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 08481680475; Sun, 28 Jan 2018 01:01:35 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mout01.posteo.de (mout01.posteo.de [185.67.36.65]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id A81CF680360 for ; Sun, 28 Jan 2018 01:01:28 +0200 (EET) Received: from submission (posteo.de [89.146.220.130]) by mout01.posteo.de (Postfix) with ESMTPS id C8B4D20EB5 for ; Sun, 28 Jan 2018 00:01:31 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=posteo.de; s=2017; t=1517094091; bh=c79sFbYr4DpAKH1riebCGFfeQJiWpvV2goTsXzPhCHg=; h=From:To:Subject:Date:From; b=EPV/gSz1ykf1Nvn4XtXZSckEQyfE+jIvGYsZjxb1JwLuS+2tJ+Sb5Pu4CPhgeRB9f CIH3u9tHiCQZUFX3U233HbPk+WaOcFn8XG2bEQc4Et6ihT183Om4/Tzq5jkfJQLoxw uy0v5HfMNitEasmgC9yeFg0lNp8XPsixo6g1811agjnE+ryFHhwi9ogjQuCNrqWGAN dtMVMRRwzW9ehRFOBI+N7tkc0fRQP9han7Nde1qSRFqbtsifit8sK8BKtGIefKY2f2 OJe2LsClOPljn+/ebV5xjJMrLiDnDJB+p4etHOqCFrbh9wsSKdzP7c1YNrsCe2+0OC gUpS3wLCrjcBw== Received: from customer (localhost [127.0.0.1]) by submission (posteo.de) with ESMTPSA id 3zTWVM2dSVz9rxK for ; Sun, 28 Jan 2018 00:01:31 +0100 (CET) From: Karsten Otto To: ffmpeg-devel@ffmpeg.org Date: Sun, 28 Jan 2018 00:01:13 +0100 Message-Id: <20180127230114.82506-2-ottoka@posteo.de> X-Mailer: git-send-email 2.14.3 (Apple Git-98) In-Reply-To: <20180127230114.82506-1-ottoka@posteo.de> References: <20180127230114.82506-1-ottoka@posteo.de> Subject: [FFmpeg-devel] [PATCH 1/2] aadec: improve eof detection 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 MIME-Version: 1.0 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Remember the end position of audio content in the file and check it during read_packet. There always seems to be other data beyond it, which could be misinterpreted as more audio. Also add some extra avio_read error checks, to bail early in case of a broken/truncated file. --- libavformat/aadec.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/libavformat/aadec.c b/libavformat/aadec.c index 8d39b1d9ba..d6b6c125da 100644 --- a/libavformat/aadec.c +++ b/libavformat/aadec.c @@ -46,6 +46,7 @@ typedef struct AADemuxContext { struct AVTEA *tea_ctx; uint8_t file_key[16]; int64_t current_chapter_size; + int64_t content_end; } AADemuxContext; static int get_second_size(char *codec_name) @@ -197,6 +198,7 @@ static int aa_read_header(AVFormatContext *s) } start = TOC[largest_idx].offset; avio_seek(pb, start, SEEK_SET); + c->content_end = start + largest_size; c->current_chapter_size = 0; return 0; @@ -214,6 +216,11 @@ static int aa_read_packet(AVFormatContext *s, AVPacket *pkt) int ret; AADemuxContext *c = s->priv_data; + // are we at the end of the audio content? + if (avio_tell(s->pb) >= c->content_end) { + return AVERROR_EOF; + } + // are we at the start of a chapter? if (c->current_chapter_size == 0) { c->current_chapter_size = avio_rb32(s->pb); @@ -234,7 +241,7 @@ static int aa_read_packet(AVFormatContext *s, AVPacket *pkt) // decrypt c->current_codec_second_size bytes blocks = c->current_codec_second_size / TEA_BLOCK_SIZE; for (i = 0; i < blocks; i++) { - avio_read(s->pb, src, TEA_BLOCK_SIZE); + if (avio_read(s->pb, src, TEA_BLOCK_SIZE) < 0) return AVERROR_EOF; av_tea_init(c->tea_ctx, c->file_key, 16); av_tea_crypt(c->tea_ctx, dst, src, 1, NULL, 1); memcpy(buf + written, dst, TEA_BLOCK_SIZE); @@ -242,7 +249,7 @@ static int aa_read_packet(AVFormatContext *s, AVPacket *pkt) } trailing_bytes = c->current_codec_second_size % TEA_BLOCK_SIZE; if (trailing_bytes != 0) { // trailing bytes are left unencrypted! - avio_read(s->pb, src, trailing_bytes); + if (avio_read(s->pb, src, trailing_bytes) < 0) return AVERROR_EOF; memcpy(buf + written, src, trailing_bytes); written = written + trailing_bytes; }