From patchwork Wed Dec 1 17:03:14 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Rheinhardt X-Patchwork-Id: 31868 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a6b:d206:0:0:0:0:0 with SMTP id q6csp9532158iob; Wed, 1 Dec 2021 09:04:00 -0800 (PST) X-Google-Smtp-Source: ABdhPJy/KEKhcX3/5/ao9EVuZT7wneGkwIIHQYv/2wdFW9aOEbK3Zkk6sT8FZvB5pVrNxcY8zT8U X-Received: by 2002:a05:6402:35cc:: with SMTP id z12mr9844179edc.393.1638378240199; Wed, 01 Dec 2021 09:04:00 -0800 (PST) Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id cw16si344424ejc.533.2021.12.01.09.03.59; Wed, 01 Dec 2021 09:04:00 -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=@outlook.com header.s=selector1 header.b=MmaobO5s; arc=fail (body hash mismatch); 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=QUARANTINE dis=NONE) header.from=outlook.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id D2D3068B024; Wed, 1 Dec 2021 19:03:50 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from EUR03-VE1-obe.outbound.protection.outlook.com (mail-oln040092072085.outbound.protection.outlook.com [40.92.72.85]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 64E1E68B029 for ; Wed, 1 Dec 2021 19:03:44 +0200 (EET) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=EpOAA2SRIGP9PFf46PCvceZnugMXjbsIf3Dunm8QXg9EAi7TA0GRb4UoyipQ86hQ9H8HZg0bidYhb4DkBAFKRQBs8Ku46vuzPqcHGZJoJYo79ZO3K6C6gzcsGn4qHouWJMGJ19UoY2ykzxkDyPb8P8AxP6Cl6/KysiKE+Z9ZAVBViL0L8Aeaoijx0E7C9x+5wv5MtzokaqDIlrzMiP4JASWkxSAsrMAmDmXCwjcqLeSJiNzGD5KoYtLJKZ4ksP4J6SyVatCCkx5nhQDy7MaR4EcoXfgc0VEYZj0IxiZsVaiXFJz+Ssl+iqBiIELC6XVF8nEubxJ75I8aIZT2KhMbXw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=TNqAWC9pajYzTNYKnBS73vt5ISFJM5GCbKtaO2YFzh4=; b=OnfVENfLneiqtn+SidhWIcejaprl7cnAUzNLhwyZ+XRR4UYsYt5FozMFys+3ruqSmjRBEc2V1s7isp0dhz/r+iYWyKLPnvjWxit7rOY17ks5d3dgkCKGHZMwxmWQmyGaLc1vew8ggMeWn/wtDf6CCjEvTH0w9yWHW2W4XJxtpqHpWljHb/xKjQBTNTAXjlruVjkzCHHgz9l//jSN079Uc+9ul5LMm+fU8HDCyUWYkqKVkJ7lTTke/wrK9O03/95eqCdVBP2zYwCHGtSzMNhgwyvNxV7/tl8r90gHofVKfA/Cly6g1UtdRcxjf7nIMpVp0Dd7C5MK5RB8KnY5oBDd7w== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=none; dmarc=none; dkim=none; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=outlook.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=TNqAWC9pajYzTNYKnBS73vt5ISFJM5GCbKtaO2YFzh4=; b=MmaobO5sCLB1ODExQ1znlVug0TeLOuGJVLL+f0Ho/GQhuxl3XjYMZR6Pa6v8m7DhG7tc/OtGI1bl0iTv0URDE8ORVfokqUGQXIfEZvvl/JJOnzIG8CqYgc+QWrlGigHouEkNFRXrV6b88/UHljyAnCowLIxpHIV9kAGRqSnTf3UzoJ1sSISSDdyuQbVR6xWUDCcOc+/zNAJ2DMnV+Cd9Zy/OWx+R5UVbPDHcylS2vOQP3sGZpAjtvNolny0eqotodYOAO7ZSU99nuOlIOL2NoylyUq29XfLEHDGZwlYq4uLz0qJ5okriZxfHiULuHg+H1Qp53W/Uuo63bUZ7vCH4Xw== Received: from AM7PR03MB6660.eurprd03.prod.outlook.com (2603:10a6:20b:1c1::22) by AM6PR0302MB3317.eurprd03.prod.outlook.com (2603:10a6:209:25::29) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4734.20; Wed, 1 Dec 2021 17:03:40 +0000 Received: from AM7PR03MB6660.eurprd03.prod.outlook.com ([fe80::700f:d70b:3bb8:4d51]) by AM7PR03MB6660.eurprd03.prod.outlook.com ([fe80::700f:d70b:3bb8:4d51%9]) with mapi id 15.20.4734.027; Wed, 1 Dec 2021 17:03:40 +0000 From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Wed, 1 Dec 2021 18:03:14 +0100 Message-ID: X-Mailer: git-send-email 2.32.0 In-Reply-To: References: X-TMN: [WaCkKQSszlqaGQ1veyKCPsac2QTCFo7y] X-ClientProxiedBy: AM4PR0501CA0047.eurprd05.prod.outlook.com (2603:10a6:200:68::15) To AM7PR03MB6660.eurprd03.prod.outlook.com (2603:10a6:20b:1c1::22) X-Microsoft-Original-Message-ID: <20211201170314.285597-3-andreas.rheinhardt@outlook.com> MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 Received: from sblaptop.fritz.box (188.192.248.74) by AM4PR0501CA0047.eurprd05.prod.outlook.com (2603:10a6:200:68::15) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4734.23 via Frontend Transport; Wed, 1 Dec 2021 17:03:39 +0000 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: f58a62ab-ee5c-4b76-868c-08d9b4ec85bd X-MS-Exchange-SLBlob-MailProps: +LiGfBxqLEticfBlUvjU5KrUz5H1+LWHFbLWk6QmvnAi0psYWaDj/qJ+oePdr28yd9Ty2+frYTPrzMiqy4yu1yTykQy8NyWXnU+rr68GKpMuVmmndEieHBDrICZxWM16pjawbQzNx+n9Ex+0rkezgWgYsmzaS33LqqsJRx5dapQNjTlyhLf641nB4mzqIJxhg5NF2EpZDtsALjcm6iCQPpRpmnb3gUCFGNMDzVbIJb89s4+uf/j/zUmzngDFR0BvuqHTJ1WrZ+iJdwHX93aO3wl5Z2RAYfCPbUhj4x6Cp1uPPkTMlnahlKkrBCJGj4DlspvY9OFcTFOmJ0dRHe76FSadpBCwcjZp4HCp0EA4WSg6OJuXJ8fAjVtj3c5VcCVHCHxMXV7UMeoqAKciIUl0doxmkU17PeH+7JEstTykQ/tygDCruBtSVU/hxpErCvrOnBOvIjFdodGe4WtpvpUb9DnTyClmTP8rxqDiYtKqbSL5yaNgK5PC+hyhgW7xJaR0bc3DRJ3hTvaguAU51ua/1YQBlZuZBEc5BTDTGaaqONa2BP7ZUiCHZqDFrhZR8H7fasrSPpxhwjU0bBve6Z7bJ0Jclbq1gyC2/S4oOUaDF5GOhfxy7/p6vqPGvY8c7/PY8WmEX/UqBeth8e4EZ5E6VmIl/+8/8LWN7ese8rQXt5rPYuoaXzt173JCKrLng8Vmjh7O0oMiLqOe8XMCAb0CRqFj8YPoyCYQiKlv0aQi/mpM2KVKdJ9pzJWI07bK9wr7Zr/WE7QF0dj10dj9qR3iJNV5M9DXA4uW X-MS-TrafficTypeDiagnostic: AM6PR0302MB3317: X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: CtDrcTu3Ei+LM2TCarBbKODGbOno+Mwr7WVP+9EK37toUZh8i/lczDMwnXlQcyxH+3ewSFLYLCu5hWgulOSzNih3808Bs6YqoeNzxF4ENZHtiujgdMwK6zYTyhQOqvtptsM05LEwxD2xA5RNKp5E2oLaz3V4a4he8mK92mXON1Ff4/UzUSmJpNBtumcApS94MQ8qXOBY0qbB8p3Vsymv+P4Sy3jz+uzwO923yTf1eCSXa2W9XX5FDXCH6z8lqEluaGivKX7N2+shmf6rO7grNArUh/Ap6BLIz9vT67rYNvwz29QPADVH8e3w0+fmQbPcD1DKOYKvG/6PQdr2pmWos17HpGUAW6WeB05dyZT4sScKjcWodT32lX7xDN2rydkVZfYXKYOGdQV1aCKZ2ZmVsJIz0Bao6cERQ+jySCxz2LgmxqjjTVSEy4XNRSofAA+gZZlbSioe91AmXoSfdPmje0MAFCw4qp/UTynDjQ4/YOPdnOYBPiJ7qJQUCkAnefWfdWYFVlI5k/g657QW/qM9UTbLmwp+fZGgUZURNufTUWpCJcE1vtlUl1ulKlOJqyf5jric1+Ty9SgZGLaTaqbetQ== X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: dDgu27TycIzaGfsNgJX2cbFuxV36snkUpLfGt2/Pa5/95pcuV3MZ7PRaLMYszf6pjdwjw/38ywTAu4Ocy4hNcXtXL+o1tV4DrLPMOi5+kPMYEkpJVUbiq8iFixiQspkOhwbqfF0F/Zd5jCbtNdM0WrGGVSa+uZ23eoW5ysD7skWo+3/6pog27pdiPacJnykHxU2/yX4C6PJygeP4mMDgpnnZxIKOKqgWeE1vAnBW4fIDXZZjyo6RiIk+MFwi4yISOd5UX0mwJOg4hB2H+PbZ9yXtvghk1Jrb6IH+uD5rSXvkNvVi64u5mE6BuEboV7y2G6NzjKW2IsvKQwVCxP2t1QrDgdGpjOwb56gfw6thbXDDNvUUAHf0jDyvgclnAe9fAntHd0fO7o5UwjmPyrHo6zxSmG8e1VNUFcy7s4m7S4QNkGGNuumXd4LsWpWTCXNGu4Xwarzd3m+LTVmpvCUH3cZOmnwRl8QFFb5CTcOUWo8f2uU3tysAQ0X7BdbSDiQ9LdjTmc1KrRZP4WbGpOYODyIg/SHWEaFk6tAs9yvaInrbNZi+XT3OC9lFVf+zfwnmQF7WKwp92IJnb45ZD/PkcdelouC9ize6pobkJI8JnSXWbX2KyGNoFKHMmvzLn0lyX8awqfZauOG4MSIfcRpaU6jQvxsqaMvPI2Ya5eDyYmr8A4eyhc30VF15/mEKQj7JkgOsvoIJGYD8LvJ2aa2tQ0oQ5IHjL+eGsqx14YzsBuSz47MCSllbAKkndD3E+/3cQtC5BvE8KGycbqcES+UrxhwX0QN/ZXJFVppH4ZcUwpJjCJ2SWs7wInNdS6w+cvD4GfsKGErSoyzXE/P6ZK9KmibIai72Y1Vx9K2dE6cDLq7J8lzSpd4FBfBJ9xoVsnBifWItz4dhTJZE37RLY0er3B2RyPCNWbjlVoi8K5+8zO6mEuzycRAks8idAD7qbKv2Xu3NjwZP7WjC6dH+bVNLAA== X-OriginatorOrg: outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: f58a62ab-ee5c-4b76-868c-08d9b4ec85bd X-MS-Exchange-CrossTenant-AuthSource: AM7PR03MB6660.eurprd03.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 01 Dec 2021 17:03:40.1027 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 84df9e7f-e9f6-40af-b435-aaaaaaaaaaaa X-MS-Exchange-CrossTenant-RMS-PersistedConsumerOrg: 00000000-0000-0000-0000-000000000000 X-MS-Exchange-Transport-CrossTenantHeadersStamped: AM6PR0302MB3317 Subject: [FFmpeg-devel] [PATCH 4/4] fftools/ffmpeg_filter: Avoid DynBuf API to improve error checks 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: Andreas Rheinhardt Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: 5m4jimfNglAk choose_pix_fmts() used the dynamic buffer API to write strings; as is common among uses of this API, only opening the dynamic buffer was checked, but not the end result, leading to crashes in case of allocation failure. Furthermore, some static strings were duplicated; the allocations performed here were not properly checked: Allocation failure would be treated as "could not determine pixel format". The first issue is fixed by switching to the AVBPrint API which allows to easily perform checks at the end. Furthermore, the internal buffer avoids almost all allocations in case the AVBPrint is used. The AVBPrint also allows to solve the second issue in an elegant way, because it allows to return the static strings directly. Signed-off-by: Andreas Rheinhardt --- fftools/ffmpeg_filter.c | 31 +++++++++++++++---------------- 1 file changed, 15 insertions(+), 16 deletions(-) diff --git a/fftools/ffmpeg_filter.c b/fftools/ffmpeg_filter.c index 47bbb67ce0..dab0f28819 100644 --- a/fftools/ffmpeg_filter.c +++ b/fftools/ffmpeg_filter.c @@ -83,7 +83,10 @@ static enum AVPixelFormat choose_pixel_fmt(AVStream *st, AVCodecContext *enc_ctx return target; } -static char *choose_pix_fmts(OutputFilter *ofilter) +/* May return NULL (no pixel format found), a static string or a string + * backed by the bprint. Nothing has been written to the AVBPrint in case + * NULL is returned. The AVBPrint provided should be clean. */ +static const char *choose_pix_fmts(OutputFilter *ofilter, AVBPrint *bprint) { OutputStream *ost = ofilter->ost; const AVDictionaryEntry *strict_dict = av_dict_get(ost->encoder_opts, "strict", NULL, 0); @@ -96,18 +99,12 @@ static char *choose_pix_fmts(OutputFilter *ofilter) AVFILTER_AUTO_CONVERT_NONE); if (ost->enc_ctx->pix_fmt == AV_PIX_FMT_NONE) return NULL; - return av_strdup(av_get_pix_fmt_name(ost->enc_ctx->pix_fmt)); + return av_get_pix_fmt_name(ost->enc_ctx->pix_fmt); } if (ost->enc_ctx->pix_fmt != AV_PIX_FMT_NONE) { - return av_strdup(av_get_pix_fmt_name(choose_pixel_fmt(ost->st, ost->enc_ctx, ost->enc, ost->enc_ctx->pix_fmt))); + return av_get_pix_fmt_name(choose_pixel_fmt(ost->st, ost->enc_ctx, ost->enc, ost->enc_ctx->pix_fmt)); } else if (ost->enc && ost->enc->pix_fmts) { const enum AVPixelFormat *p; - AVIOContext *s = NULL; - uint8_t *ret; - int len; - - if (avio_open_dyn_buf(&s) < 0) - exit_program(1); p = ost->enc->pix_fmts; if (ost->enc_ctx->strict_std_compliance > FF_COMPLIANCE_UNOFFICIAL) { @@ -116,11 +113,11 @@ static char *choose_pix_fmts(OutputFilter *ofilter) for (; *p != AV_PIX_FMT_NONE; p++) { const char *name = av_get_pix_fmt_name(*p); - avio_printf(s, "%s|", name); + av_bprintf(bprint, "%s%c", name, p[1] == AV_PIX_FMT_NONE ? '\0' : '|'); } - len = avio_close_dyn_buf(s, &ret); - ret[len - 1] = 0; - return ret; + if (!av_bprint_is_complete(bprint)) + exit_program(1); + return bprint->str; } else return NULL; } @@ -416,12 +413,13 @@ static int insert_filter(AVFilterContext **last_filter, int *pad_idx, static int configure_output_video_filter(FilterGraph *fg, OutputFilter *ofilter, AVFilterInOut *out) { - char *pix_fmts; OutputStream *ost = ofilter->ost; OutputFile *of = output_files[ost->file_index]; AVFilterContext *last_filter = out->filter_ctx; + AVBPrint bprint; int pad_idx = out->pad_idx; int ret; + const char *pix_fmts; char name[255]; snprintf(name, sizeof(name), "out_%d_%d", ost->file_index, ost->index); @@ -457,13 +455,14 @@ static int configure_output_video_filter(FilterGraph *fg, OutputFilter *ofilter, pad_idx = 0; } - if ((pix_fmts = choose_pix_fmts(ofilter))) { + av_bprint_init(&bprint, 0, AV_BPRINT_SIZE_UNLIMITED); + if ((pix_fmts = choose_pix_fmts(ofilter, &bprint))) { AVFilterContext *filter; ret = avfilter_graph_create_filter(&filter, avfilter_get_by_name("format"), "format", pix_fmts, NULL, fg->graph); - av_freep(&pix_fmts); + av_bprint_finalize(&bprint, NULL); if (ret < 0) return ret; if ((ret = avfilter_link(last_filter, pad_idx, filter, 0)) < 0)