From patchwork Sun Jan 28 11:30:29 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Karsten Otto X-Patchwork-Id: 7435 Delivered-To: ffmpegpatchwork@gmail.com Received: by 10.2.156.27 with SMTP id q27csp2770654jak; Sun, 28 Jan 2018 03:30:40 -0800 (PST) X-Google-Smtp-Source: AH8x226OFC2nc424Xgd2PPXAd7YzrTWLnCnM2/kDc8xL5wovPPuQOhjT0WjAzrDHoxr8X/15YGxQ X-Received: by 10.28.140.1 with SMTP id o1mr13798224wmd.141.1517139040187; Sun, 28 Jan 2018 03:30:40 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1517139040; cv=none; d=google.com; s=arc-20160816; b=PAxPdtdETARluU7IpiCDMZNM8Nr6nb5t9eZynTbrny/fOakiFNQ1biGDsAFXTIbe4Z e2S3NzB9I8QLh/Cqm0O/CfpSLD1WYgnyUWEefBRTNI62AxpMWXiRBVZf1TrA3i3jKD8f uttcec6uokousJaFSxRIzu4INiGINkcNT7X0jf0y4/ohPH1ifLBd4UqKXQPcOcCYVJt7 z8jYcEOBkug7raMsNz+boC2dL387s3r1X/egw7uFFJjFr0Py1QCOWtSb240AYoFqr6NV PdT5tXWuLaALS/4JIOy0qjATrun2kNxlAkTcbim1DCyJwQ83ZoQ4YHmdqATJiiawjvdp 1Irg== 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:message-id:date:to:from:dkim-signature :delivered-to:arc-authentication-results; bh=K/BkRej4ly8443Qg58DOLkcAW227iokmSLOYXrR6Sno=; b=mdMWkJpNguMpcg11ud8eHN0vM/xc9Ta7G42NZjYU3KZ0o9MpHx5Zv4iCQvbY7acE9x EoKe0SDqyMJW68bMqfupM6TQpdCHeuLT0Td8KvgallTNFerwQrTI+6nGGTpyWkW/hcbC y8n4Q6MIM+zsqPzcw1KM4QLFW/ZiAFxfozvp4BoFDp7kGd8ZenvZ8HnfAmUevkBGg9pL sMd6vMzslP3ufKKV7zyTlPt/Uyi9mMzMOpT+fhpy++gBZEh8EudV1Oe446wo6hVJvz/J RaMBqc23uK2rYLNdr00xPsh19+jGsHHJJ0SDeHfKbxd1WyPmvoV1V59ymor2HvjASTVl p7BA== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@posteo.de header.s=2017 header.b=SOJKCYfB; 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 3si5497221wmc.56.2018.01.28.03.30.39; Sun, 28 Jan 2018 03:30:40 -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=SOJKCYfB; 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 EDEDF68837A; Sun, 28 Jan 2018 13:30:34 +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 D7B5D680347 for ; Sun, 28 Jan 2018 13:30:28 +0200 (EET) Received: from submission (posteo.de [89.146.220.130]) by mout01.posteo.de (Postfix) with ESMTPS id 5251F20E18 for ; Sun, 28 Jan 2018 12:30:32 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=posteo.de; s=2017; t=1517139032; bh=yKdjeqfbjVCozlWT++1c3TonCIiSB75/q413V1KjOFo=; h=From:To:Subject:Date:From; b=SOJKCYfBXdKTaST2omYcAh3gKjj7UxJMN1sZTz0utwVQn05e3eTfTVo1AF5dzEKn6 2IjTJORdjo280ssyhRs0XqJE2aQeU1KD9PBPTT7+9eRkZHPFmO9QlJFT8Exdpe678l Ml7KGIPM9rFxWEjpXLIW0JckPnkR7ZEKWZwOpO5erIf9myNPOKhPoLDCN18MxfUy4i dc2PuhDzItGEYNvCEJg8DlaZ4LU5WreSzLntJzv1gQEb+1woP5N3pcNr1GYDfxaiyE kO6RN+8CmOLHZ1+EnD2wXDCoWgAy0kZX0j9P7L4Y+Lc2aJ1EbIGoMr1xWG6XCbTXT3 U0/9FASqrQ8yw== Received: from customer (localhost [127.0.0.1]) by submission (posteo.de) with ESMTPSA id 3zTr6b52wRz9rxG for ; Sun, 28 Jan 2018 12:30:31 +0100 (CET) From: Karsten Otto To: ffmpeg-devel@ffmpeg.org Date: Sun, 28 Jan 2018 12:30:29 +0100 Message-Id: <20180128113030.84656-1-ottoka@posteo.de> X-Mailer: git-send-email 2.14.3 (Apple Git-98) Subject: [FFmpeg-devel] [PATCH v2 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. --- Update addresses comment by Michael Niedermayer, forwarding avio_read errors to the caller. 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; }