From patchwork Sat Jul 7 17:41:27 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Karsten Otto X-Patchwork-Id: 9643 Delivered-To: ffmpegpatchwork@gmail.com Received: by 2002:a02:104:0:0:0:0:0 with SMTP id c4-v6csp850297jad; Sat, 7 Jul 2018 10:41:49 -0700 (PDT) X-Google-Smtp-Source: AAOMgpfs3zz/hZXShgKEP0x7GXT0ZqE34/ShY1TeWZeQ3IHvHIhE35fu9vanhhLmCN50CGf3bueK X-Received: by 2002:a1c:ee5d:: with SMTP id m90-v6mr8802638wmh.113.1530985309459; Sat, 07 Jul 2018 10:41:49 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1530985309; cv=none; d=google.com; s=arc-20160816; b=kh2uCMoL1WI/+0Amwvrz2/PqTB8s3PyGLwvUzII5ILgGCwVGuPn5EgAoHNuDPo4Y1P YM+IDiYeLxaHnlP2Qs72PidKIZ2WnutPDdx5X3qTvqZ1Ec+PkrAd5yKsdqQw00x4XoIQ HQUBI5ZbOukA6E16pUxxU6Ny4zqRUbI38QMHYOdvCG8ifkVYRqYpikUMhaIngz4LUpQS dOPJ7lHITUkEecnWlrkrSYmPE5slEqcqXlxPUMnnp5xVWMDcX++NT/QhqAAj2Kj0JEDH wBG5Cil4TcLYTmj6jx2zqOMTR4gE5El4jmdZyEAKlEyzZ8bk/7TWBR9jEwZQP83UcKyW S2Lg== 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=/EI6yxh380WMUb9Bk0dzbJKvwvGMA6nBy3LVgiZYbqI=; b=NiWLlFG7o9TdEJSORc8UTQfXlxVriHdxevgsV5YY38EYPWDTfeIu4Tn6ynmf2VD+Hd yUuecZVEFgqdaDZ5OLiGGg/VSCDoLz/yZzbM/7pTMqtzZaMg2aKxsDYd53zXDiKKzmNt 6lXOYhFrI+sBiTxcQNIxLpgrLJfXxjiTONOBC/Vub4nWkOGdCFrHP+Ynl+1S7mL+NwYK DKBRWbq5nTrEH8A5WzbxrfO60j02ZgpUHX5Iju2vjHGBPmKHScQ5MvmGeTReaUnGeOcj nUWfx+OG1wVN9tc2ci9kY6TV1R/JBHOEbbxaxgYhQJi7NxWy9Solxbspfm+dg8+84LqE pu8Q== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@posteo.de header.s=2017 header.b=aTyCsUlq; 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; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=posteo.de Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id m2-v6si9688247wrn.238.2018.07.07.10.41.49; Sat, 07 Jul 2018 10:41:49 -0700 (PDT) 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=aTyCsUlq; 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; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=posteo.de Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 5B5FB68995B; Sat, 7 Jul 2018 20:41:32 +0300 (EEST) 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 09D0468825E for ; Sat, 7 Jul 2018 20:41:25 +0300 (EEST) Received: from submission (posteo.de [89.146.220.130]) by mout01.posteo.de (Postfix) with ESMTPS id 19AEB20DF4 for ; Sat, 7 Jul 2018 19:41:30 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=posteo.de; s=2017; t=1530985290; bh=oGCkw/YWB4jBOISoBqwXJbFo3o2HHqTEfob+9PdK/xg=; h=From:To:Subject:Date:From; b=aTyCsUlq6J1gAQCPC66vmVbsPmowmTKsQ9fph7r3vx7dWKQHd/Jj4IZAclYySk08w lTm+vIgJeQl+PcQiUqngR6m0u+8rhPB9VDYJLHWq0uruPUyxtbdfHnLmSWzGt/9RKN oGJu6Nc42C7VoNd4fMztvar3+IgZdt9bbaX95FNUEw9RajzSp5g8+xedNPrDn46ydW 4xC+pASi/T3DmTk1u/5rY65Q8JELYoQrg2Ht1OIr8eoOWtFHm0R6UInSdtj+CH5v+H BkZbaap3SZ9z3X74hDBil3v7eyymPBrPxZ36UyqwFY+Nz2nqu/GgOKbYnsd0QmCre+ cNPcjcs69cceA== Received: from customer (localhost [127.0.0.1]) by submission (posteo.de) with ESMTPSA id 41NJmn5srwz9rxP for ; Sat, 7 Jul 2018 19:41:29 +0200 (CEST) From: Karsten Otto To: ffmpeg-devel@ffmpeg.org Date: Sat, 7 Jul 2018 19:41:27 +0200 Message-Id: <20180707174129.835-2-ottoka@posteo.de> X-Mailer: git-send-email 2.14.3 (Apple Git-98) In-Reply-To: <20180707174129.835-1-ottoka@posteo.de> References: <20180707174129.835-1-ottoka@posteo.de> Subject: [FFmpeg-devel] [PATCH v4 1/3] 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 | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/libavformat/aadec.c b/libavformat/aadec.c index 8d39b1d9ba..4db71b1939 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,9 @@ 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); + ret = avio_read(s->pb, src, TEA_BLOCK_SIZE); + if (ret != TEA_BLOCK_SIZE) + return (ret < 0) ? ret : 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 +251,9 @@ 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); + ret = avio_read(s->pb, src, trailing_bytes); + if (ret != trailing_bytes) + return (ret < 0) ? ret : AVERROR_EOF; memcpy(buf + written, src, trailing_bytes); written = written + trailing_bytes; }