From patchwork Sun Jul 23 12:00:16 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Reimar_D=C3=B6ffinger?= X-Patchwork-Id: 42920 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:be1d:b0:130:ccc6:6c4b with SMTP id ge29csp1330810pzb; Sun, 23 Jul 2023 05:01:13 -0700 (PDT) X-Google-Smtp-Source: APBJJlEEMkW9gijdyg2RvVwWrsfqYo6LGWUExCYudP8OQyt+evEKymhiD22cwodjxtYls+CTBMyO X-Received: by 2002:a17:907:2713:b0:993:fe68:569d with SMTP id w19-20020a170907271300b00993fe68569dmr5928098ejk.17.1690113673151; Sun, 23 Jul 2023 05:01:13 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1690113673; cv=none; d=google.com; s=arc-20160816; b=FIiMbFp1YKCoAqVJDpoChhb+LtGhFsJYR0YuLOEY/ASWq1PQdsFb1LVvNbfLerNQVt DB6rJmI0P1DayiqIfzLQQv2ewNz/uiN/NBP2W7dw/FsyDDmqWJKW1/+4z6K4Azn414Lu Ofk4VF8qTOVHkb8uN0oETnAZleZ0rU+uHsvzYXDVxhxqoT+In5k/LjQ/dRNkvzEWa10w TouaeWsJHCcIbrF3yMMxhkoxZbFK34/nVOcXnZgX8umMdw0Ia5aEW0bxHVM8JAbCRMyB deWNNtoRcGdwxavplcOYx9a/ITpJUDr+22puSLkpyTBUnZ2zNIEr8D7PQwLWiQZRzYXQ dZnw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:cc:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:ui-outboundreport:mime-version :references:in-reply-to:message-id:date:to:from:delivered-to; bh=wGTQQjQbKXl/8O+LedH6BSBaK1t8SYRgvZ7243P9iFM=; fh=fXcCBasH1NfrAloNC1XA9V9ZOn3lYYHy05Aa/Q2POE4=; b=try+PP6ASIB5yAhU2B+x8avrLYSnBKhVxEpcBVxYwaKXiUKnc9uGyEu9Ys8Be3MqOp hdzG2n9y0dAbGId31VB8b78/6vUgn0urKntnb02eb/GXBRpaLVY/io50xxyE+Ag/Ts2A 2OGHM+ledLdSwcREaoDaXhTb1KfSS39E2KLAl47i6b6malW1VEM1B8ESRt7k0Zb/Tazw Jt3HNDIztvMd6+uLvHm2FpRFaa+AuHN074/p4vKOvSCgaNHgfits8dLFIHcgCmuwADF0 tp+wIE/Wazv0Z3qkIh5IYl5VPYAcAgZOwjWMG5gtjdkaUxfomSzn3ywK4EOF3W8akjck cItQ== ARC-Authentication-Results: i=1; mx.google.com; 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=gmx.de Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id t10-20020a1709066bca00b00992e14af9b7si4759920ejs.460.2023.07.23.05.00.54; Sun, 23 Jul 2023 05:01:13 -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; 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=gmx.de Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 3ADD468C635; Sun, 23 Jul 2023 15:00:51 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mout.kundenserver.de (mout.kundenserver.de [217.72.192.75]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 7569668C348 for ; Sun, 23 Jul 2023 15:00:44 +0300 (EEST) Received: from localhost.localdomain ([155.4.74.59]) by mrelayeu.kundenserver.de (mreue108 [212.227.15.183]) with ESMTPSA (Nemesis) id 1MDykM-1qDfrT1pDw-00A1oq; Sun, 23 Jul 2023 14:00:43 +0200 From: Reimar.Doeffinger@gmx.de To: ffmpeg-devel@ffmpeg.org Date: Sun, 23 Jul 2023 14:00:16 +0200 Message-Id: <20230723120016.92184-1-Reimar.Doeffinger@gmx.de> X-Mailer: git-send-email 2.37.1 (Apple Git-137.1) In-Reply-To: <12826EED-5CFC-4DC4-ACEE-0BB505704FE7@reimardoeffinger.de> References: <12826EED-5CFC-4DC4-ACEE-0BB505704FE7@reimardoeffinger.de> MIME-Version: 1.0 X-Provags-ID: V03:K1:TP3ABZVCpvSfI3B7Us3bWpmDUwyUtePulI5nQMIiQ8LWSW4sCEX Om8gFNkTIsDhHTvi0ZpkkZfAeRAawAHtUzo/KzDRs/veFtyig45ogDg21gEWVnzdJIFixds uwtkOK+zQKlDmrUFyyVhHPldCEERuMgvWbFblaGbvrW6FI6NQ6W9xhbgNjEwPvG1ZiwbbvF mnKIfGRBFNDzx7rD0e3hw== X-Spam-Flag: NO UI-OutboundReport: notjunk:1;M01:P0:6MsUALGKw2A=;2aa+pKazwQA64fs/Q2NAbC9KuGF l3JCqA0s2kVz8WfJ1aHfKbML0AxWb0QhDS/dPzzwGpL4rzYsp8Pwi9//mQvDQo6A7t8D9rPHE olT9kheGXU40gaYDQSXMidqDmJqNgbuYzFBW4ai1w9T/UKGR9Difyvi1Gg5Nk36BEjv5KOUCu sOa5yRmhCQEXhmepkmvDF3HUJ/Yd4mqrRlgCw5GEE3vz/GZnBxsGdNPq1j1MSmjKaWPuWWy04 LXsFQSNHedF0oaVVwr6aFxjTxRm7kX59TBalS5u1L1rP+cXVJ3+izoXTolQSVH/+TuJU11RI+ NXGYkJETrINspD65M8ZciAwH8Uzk9Rp+n0QCe0KYl4RHhDSM6VicVc+HOts9oeU3gLdr8mcPq BpzYwdd2kjTmDEY1wxVAhRyntBWaRgPDJMUNlGfC3zjGUjacVB84oWZ1X8RIePt0/AoXAq8DE i4l6M67ikfQJVg/BDLPtDi6hsc2uW+5CPOgsUdY/j+asnsDHC49U5Skry9aITjMpGMzwcZDtU Vc6OWxoy3MabEzfc+DlXv3ckHEN3hTHJm+ez+u3S0sxlYwIxpRxjQuE+/LfNdHplRBwnvoafp umkF8wI89EtLa+KsWk2wQ8mzcGyB0jB+9dsFZ0aPm0YwA0jdYOH8zVKpkOluqIQQ3MC44jamw eJw5nWYoXNJG37qX9R4NFgXRlEXZe2UhUMc4OWMDAQ== Subject: [FFmpeg-devel] [PATCH] libaformat: fix incorrect handling of incomplete AVBPrint. X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.29 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 Cc: =?utf-8?q?Reimar_D=C3=B6ffinger?= Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: bGSXICqPEYLt From: Reimar Döffinger Change some internal APIs a bit to make it harder to make such mistakes. In particular, have the read chunk functions return an error when the result is incomplete. This might be less flexible, but since there has been no use-case for that so far, avoiding coding mistakes seems better. Add a function to queue a AVBPrint directly (ff_subtitles_queue_insert_bprint). Also fixes a leak in lrcdec when ff_subtitles_queue_insert fails. --- libavformat/assdec.c | 4 +++- libavformat/lrcdec.c | 7 ++++++- libavformat/mpsubdec.c | 5 +++-- libavformat/realtextdec.c | 6 +++++- libavformat/samidec.c | 6 +++++- libavformat/srtdec.c | 4 +++- libavformat/subtitles.c | 17 +++++++++++++---- libavformat/subtitles.h | 14 ++++++++++++-- libavformat/tedcaptionsdec.c | 2 +- libavformat/webvttdec.c | 4 +++- 10 files changed, 54 insertions(+), 15 deletions(-) diff --git a/libavformat/assdec.c b/libavformat/assdec.c index 0915f6fafd..bf7b8a73a2 100644 --- a/libavformat/assdec.c +++ b/libavformat/assdec.c @@ -73,6 +73,8 @@ static int read_dialogue(ASSContext *ass, AVBPrint *dst, const uint8_t *p, av_bprint_clear(dst); av_bprintf(dst, "%u,%d,%s", ass->readorder++, layer, p + pos); + if (!av_bprint_is_complete(dst)) + return AVERROR(ENOMEM); /* right strip the buffer */ while (dst->len > 0 && @@ -135,7 +137,7 @@ static int ass_read_header(AVFormatContext *s) av_bprintf(&header, "%s", line.str); continue; } - sub = ff_subtitles_queue_insert(&ass->q, rline.str, rline.len, 0); + sub = ff_subtitles_queue_insert_bprint(&ass->q, &rline, 0); if (!sub) { res = AVERROR(ENOMEM); goto end; diff --git a/libavformat/lrcdec.c b/libavformat/lrcdec.c index fff39495f8..83bb4a4b75 100644 --- a/libavformat/lrcdec.c +++ b/libavformat/lrcdec.c @@ -171,6 +171,8 @@ static int lrc_read_header(AVFormatContext *s) while(!avio_feof(s->pb)) { int64_t pos = read_line(&line, s->pb); + if (!av_bprint_is_complete(&line)) + goto err_nomem_out; int64_t header_offset = find_header(line.str); if(header_offset >= 0) { char *comma_offset = strchr(line.str, ':'); @@ -205,7 +207,7 @@ static int lrc_read_header(AVFormatContext *s) sub = ff_subtitles_queue_insert(&lrc->q, line.str + ts_strlength, line.len - ts_strlength, 0); if (!sub) - return AVERROR(ENOMEM); + goto err_nomem_out; sub->pos = pos; sub->pts = ts_start - lrc->ts_offset; sub->duration = -1; @@ -216,6 +218,9 @@ static int lrc_read_header(AVFormatContext *s) ff_metadata_conv_ctx(s, NULL, ff_lrc_metadata_conv); av_bprint_finalize(&line, NULL); return 0; +err_nomem_out: + av_bprint_finalize(&line, NULL); + return AVERROR(ENOMEM); } const AVInputFormat ff_lrc_demuxer = { diff --git a/libavformat/mpsubdec.c b/libavformat/mpsubdec.c index d290a41fb9..0374563575 100644 --- a/libavformat/mpsubdec.c +++ b/libavformat/mpsubdec.c @@ -116,9 +116,10 @@ static int mpsub_read_header(AVFormatContext *s) AVPacket *sub; const int64_t pos = avio_tell(s->pb); - ff_subtitles_read_chunk(s->pb, &buf); + res = ff_subtitles_read_chunk(s->pb, &buf); + if (res < 0) goto end; if (buf.len) { - sub = ff_subtitles_queue_insert(&mpsub->q, buf.str, buf.len, 0); + sub = ff_subtitles_queue_insert_bprint(&mpsub->q, &buf, 0); if (!sub) { res = AVERROR(ENOMEM); goto end; diff --git a/libavformat/realtextdec.c b/libavformat/realtextdec.c index c281dec346..7992a5b7fc 100644 --- a/libavformat/realtextdec.c +++ b/libavformat/realtextdec.c @@ -80,6 +80,10 @@ static int realtext_read_header(AVFormatContext *s) const int64_t pos = ff_text_pos(&tr) - (c != 0); int n = ff_smil_extract_next_text_chunk(&tr, &buf, &c); + if (n < 0) { + res = n; + goto end; + } if (n == 0) break; @@ -103,7 +107,7 @@ static int realtext_read_header(AVFormatContext *s) /* if we just read a