From patchwork Thu Jun 22 21:04:52 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: 42283 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:be15:b0:121:b37c:e101 with SMTP id ge21csp3152188pzb; Thu, 22 Jun 2023 14:07:00 -0700 (PDT) X-Google-Smtp-Source: ACHHUZ6d4U64ILCiChiqO9Ne8urdYtW+Qd/w/ommWuTJBkZE8E8Z2QqbRe9HI0QG5AxUIM8lvRQf X-Received: by 2002:aa7:d591:0:b0:51a:5b39:5cff with SMTP id r17-20020aa7d591000000b0051a5b395cffmr8883926edq.23.1687468020329; Thu, 22 Jun 2023 14:07:00 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1687468020; cv=none; d=google.com; s=arc-20160816; b=yHOTdUiIkAcX1EhoJVsXVoY+CE0u5yWlaRlIt6PWz7keflsUL7QBFfvOQ5hgfoNxoi aq9H1CBlpG8umS1ENG5nVxpSQTru/6FpH+8D1HOrL784l5T5ilUWx48lCR5t9DMuIljm WkWI2DlWZ4K1CwupaVS/aRJjCPHtjFCuJrC13Ozc/aYof6lZ2wJDqK6bBT++7zBxyoBC tN3GjUkax0FdBdmheZqhyYvWwv6d6aw1ttwdHQvMIwUeimKOI17BChrSt5IQQgLInQs/ /dFcVVi0kNnIlhfneagQzJSeB6GW2cqVB8l85Fo7Ja8pNOyfTm/o1jQkA2PQUBZJaiNk V9iQ== 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 :message-id:date:to:from:delivered-to; bh=F9r1d+a1wuqSky2CLN9ZOrBNadE7wRYUKOgNlhMFvRU=; b=JUwoKjIIt8M4THj3CcamK0I83W9exaMYz/+5/OM6iNwsBw5yQXS0Nj5OEJBVt/VmQw mddgP+mdnmIZkJ32Wh3qxh+C5EleZPJL9QxSqHaUwVendG5BpQd03IRXliiok+HwApkF ok4OgVyGFynza01+W2x864Bmyop+xT4anrKnW9V73DmIkg8vBgRpbo0wOx+/dlJ4phKo n2y10ajb/SD8RSOfv1mf/42c9w9piPbRo3BM/ZN8x+Qy1w+LUqfjgRNCf6InQKM++3qv qE/SItRzhWhnKbayr2l6L1RGPEmacXFUXYmwxsR7rb5NXgvfxNq/PO0vaMVdyfprG4gR Wmng== 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 u21-20020a056402065500b005162dcfac46si3586777edx.300.2023.06.22.14.06.58; Thu, 22 Jun 2023 14:07:00 -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 00D3B68BE52; Fri, 23 Jun 2023 00:06:55 +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.73]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id F0C7C68BE52 for ; Fri, 23 Jun 2023 00:06:47 +0300 (EEST) Received: from localhost.localdomain ([90.230.81.36]) by mrelayeu.kundenserver.de (mreue106 [212.227.15.183]) with ESMTPSA (Nemesis) id 1N0nSN-1ppWkN3YYf-00wlgu; Thu, 22 Jun 2023 23:06:46 +0200 From: Reimar.Doeffinger@gmx.de To: ffmpeg-devel@ffmpeg.org Date: Thu, 22 Jun 2023 23:04:52 +0200 Message-Id: <20230622210451.16411-1-Reimar.Doeffinger@gmx.de> X-Mailer: git-send-email 2.37.1 (Apple Git-137.1) MIME-Version: 1.0 X-Provags-ID: V03:K1:Fn68Wy2snTFqntt3zB6sq4N/QY6/GZe9+NvfB6vNVXVDEi6s/8d 22nHWeOVAvyMPi1UDODWQCeAkU4VGFcKDFg0iP+n/jAmjcSzotLFsFEoZyiiYK7xQMvh7dL InA6uHa7CI9iUBhE3YNNQPFKZMWEzqdOQb1a1tFLlRhTBHnPlVoz4k7QQYR8rWi6Qwyr8TJ NMICrjy5n5SBNk3CC/g+Q== X-Spam-Flag: NO UI-OutboundReport: notjunk:1;M01:P0:Er4tQgTbUqk=;wSkk105q8brOyHh/pMOc2rVg5vz 9hPULCs0I4qUBlTssqwRhSJ3mjqPh6AHujoYU9g0zeIQlzuc2XSH/NsnXLZHw/PdKFfSdMT9w h4ve+zQwh9Mr0KtXYwCmzFbpEzZ/S0Ln+4DvAcm17rq65qkPORI/5zJi4wLa3AkCIyd5qHvel Ua8pZrxqL3Ic1U+smafD9ngdWIhCpdQcuXNZCo1idFCD4fKaftQjlMYGBCiual5a3ad/Y3bXq iV3bwB9OeKIkrsv9Td5wHm2fkqH/dekXbFhpyMxm8bAstfUsOPXpwNkV/uS8824lv+dQ1/qkw 0QTfsVDE6eNHCAuxjfCtJR7vJJWy0clNvyVx9IkABAjSGjuhxdiL677eOXB+++nBHQCvz3i3G TBO/lYp4EEbKk/c2rgYFGNf0b7tM7HgXUvnnPXPp8BGnmsthUvP6NoWvvF9mwQLx860T7/ia/ OGwSF45TLFJCFJjCAIW+rhnnyrKmsI24HmhQBPn5xw5Hlgfp7Mq6PfmwagEJrb2FQn/R9AYFl 9lgywRPGDPHsCgdoflFUgCHZVLbXSBtLxlZb7oUFgMDQRixf6M6BpjqPezorA7YfBkHH8ZEM2 DHiUQawAy9SnKQEyYRoCQPIxd/bA6P5V2gq1BPc1JpY0AmMuKkUXdWpG9saiNeAFnMUkCL2wm sh1LdDuOLXrN3fPGzNTQ4BiuYZcCBf3fw2FamLv15A== 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: r3Mi66LwKK0V 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. --- Note that this combines a few different things, but they all are meant to address the same issue. Happy to split if that's wanted, first priority is getting an idea if some part of this seems like a bad idea generally. libavformat/assdec.c | 4 +++- libavformat/lrcdec.c | 7 ++++++- libavformat/mpsubdec.c | 5 +++-- libavformat/realtextdec.c | 7 ++++++- libavformat/samidec.c | 7 ++++++- libavformat/srtdec.c | 4 +++- libavformat/subtitles.c | 17 +++++++++++++---- libavformat/subtitles.h | 14 ++++++++++++-- libavformat/tedcaptionsdec.c | 2 +- libavformat/webvttdec.c | 4 +++- 10 files changed, 56 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..9f6aab789e 100644 --- a/libavformat/realtextdec.c +++ b/libavformat/realtextdec.c @@ -80,6 +80,11 @@ 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 +108,7 @@ static int realtext_read_header(AVFormatContext *s) /* if we just read a