From patchwork Fri Dec 3 18:27:27 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Rheinhardt X-Patchwork-Id: 31921 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a6b:cd86:0:0:0:0:0 with SMTP id d128csp1030593iog; Fri, 3 Dec 2021 10:27:52 -0800 (PST) X-Google-Smtp-Source: ABdhPJzJT856Fg1DdB+0doDo9VPFsfFzRidOW7ZLD25QstFveKnL1zPdJZ8dnXeomv5jPW5jQ+9U X-Received: by 2002:a17:906:5d0b:: with SMTP id g11mr25090240ejt.110.1638556071955; Fri, 03 Dec 2021 10:27:51 -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 aq1si4563224ejc.438.2021.12.03.10.27.50; Fri, 03 Dec 2021 10:27:51 -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=TjNwKeRO; 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 A004168AE46; Fri, 3 Dec 2021 20:27:46 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from EUR05-DB8-obe.outbound.protection.outlook.com (mail-db8eur05olkn2078.outbound.protection.outlook.com [40.92.89.78]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 3529268A447 for ; Fri, 3 Dec 2021 20:27:40 +0200 (EET) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=Kc13fXYI7cAZtdIZ3THRoit5An8UdmOOxW7rkI3GJdP+S41WriQAqT+rj+QuTNqv2jk6OI18yJLlowRPUNR7fNwT0L+2tus1GHjPBC/6Rq2SeRorQKQWRX7ZKyjd3lYpl+o2djN1EpuApejqcLe2LTjboeo4tq8d/Jcx8A8Cv2dXYfJdveTsJlO42ypsYDcD7XGMPsH+KU4jEdtR0YGvopsjSdVy3lvNCCN0Tk/tuL/1ZfI+X88PXW6O9M6YC7tLcI3UVbnPfYwCzQ7BxArCQd7wk3gZKSz8UyF3NZpccGNJKDmnYl/dMdouP2RIDayTYLGfEZwR+zorPNP5gtiGhg== 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=eQRw3YB4bqFtOQ/JHr7CQDwSguxBLyFR50IpxzJIlno=; b=hJ32bIq3EF8pDTFVHINCVlhroWVdP2tWT3H1evyeOd/g+PMB+SwX6WlwHTT3iRN3HbMnmbMt2e7KVYHkdd/hqxKuFeoWs7rfqswkGZ2NUyNQmdBxNazv09OlxSmHZaQwvxFH8UGm8jtTc1ZzOVFXaht0ef9Yb1lwFMLLiYyfJi00pOkAAx88CDIvBRK9ii7XuydL8bOjHZsNHcx6t3/P+6cvZ/XXmuBTUWIaPv3+1yKZ8vfrgCCGOA7chehEcbo3tBZeQmJknaXB9ueLkNVTkF+k1IQTnSnfTNqutRgfiyjd7EyEX+sVpdzbBs8+KubotRZvpHWd4wlT9IPIrGzHBQ== 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=eQRw3YB4bqFtOQ/JHr7CQDwSguxBLyFR50IpxzJIlno=; b=TjNwKeRODzmvOu7XsOZpYr3DcT7zddaSQ9x3mCXCFy06mZQ+RVrVHNWXAW4oiOxndCkEGZLn8MoEOGCigbsjDK8roJVM7kIMgnnG+lPQYDQ97unHSnZvTOOStCObHTGVAAf3rcmEEu6FghLLem/RxGpg6ucUGOxoWDTC4pCUYzloUxTZ2+ze/EgKo/oZuzskrKZr6MOrAso1Ji3c78v9BrRPDuYcIjopdGBe/RoXq7OeRZUrXWaNYPgzJPSDBOHQMyX5ftWPPAU0lPuGLn8AVjM9YMy6r4hyzqdDgSqKhfzoCT8KpxN2WXRmfgbp7uZ81VsDmmH+xtqsOzuyefy3ow== Received: from AM7PR03MB6660.eurprd03.prod.outlook.com (2603:10a6:20b:1c1::22) by AM5PR03MB3090.eurprd03.prod.outlook.com (2603:10a6:206:17::30) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4734.23; Fri, 3 Dec 2021 18:27:38 +0000 Received: from AM7PR03MB6660.eurprd03.prod.outlook.com ([fe80::f0dc:92f5:6bc2:45ca]) by AM7PR03MB6660.eurprd03.prod.outlook.com ([fe80::f0dc:92f5:6bc2:45ca%4]) with mapi id 15.20.4755.016; Fri, 3 Dec 2021 18:27:38 +0000 From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Fri, 3 Dec 2021 19:27:27 +0100 Message-ID: X-Mailer: git-send-email 2.32.0 X-TMN: [VgfGKVXR92tEwWSyzQ7+ha3d0rWIWeS1] X-ClientProxiedBy: AM6PR08CA0006.eurprd08.prod.outlook.com (2603:10a6:20b:b2::18) To AM7PR03MB6660.eurprd03.prod.outlook.com (2603:10a6:20b:1c1::22) X-Microsoft-Original-Message-ID: <20211203182730.1688737-1-andreas.rheinhardt@outlook.com> MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 Received: from sblaptop.fritz.box (188.192.248.74) by AM6PR08CA0006.eurprd08.prod.outlook.com (2603:10a6:20b:b2::18) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4755.16 via Frontend Transport; Fri, 3 Dec 2021 18:27:37 +0000 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 637a7209-258d-4301-4c7e-08d9b68a955d X-MS-Exchange-SLBlob-MailProps: S/btQ8cKWiQtx8w+3h2yNNoYV95SbXd9Ns2X746EKTF1Z4Kk+v+B2Lvmknqj3qsgfaH6CnnRtROJJCEWFGXpEIPysHCjEdq3gXj6IVql1h7svlwowOOK1GHnk6YQoL5/ZwhDV2li3U3smOhX1HwkjPDmJps3Pp6/EFgYSQq+aCJDr4qHl/ZY8GML4hA1Ok5oD/fOepqmLAAtzBGFjqIymtMjur7fuFCOduMqB0KbW0Ppu8p8AO7MbgtT3Ty3uUZYti2mM7b1dpIHjF4nWmZKz7ZG8sinVVTQl9WzHPrJKhfY3rFAtI4WpCEu8LcDR+vuzaJ8YzbV1e10hPwecD2IDASOYfpdCYRmf8puhpRDTVmOQdP0057bptcVaosV9wu5OXc2B/jAAXd0bPq8Ph1B3fQ0cC6Az4+OvVOnOjVazV06Vr7O3e9on9EwDsJRKUbCbXQ9yFRwAaSTW1A0VrUP38qD5Gogedb1j1WoXK6p2eyGP4/C5VNVEcZlqSNpJRx2IOsEgfWq6zq2U7b5oS/gQAX2MnqSSNdrel26wHJ4Arfairv8iTQNndXKOPW4MK/pSHvYfYKj2qlOV94K70t6UyBIGyVUV0ZRelo1Ddf1frQPViGmMLIsOmIIGtROQqulWkNj3uF4aHMEBR/c4WFT38rev/aGc2WDQBsAgu4tHLQJcYHO02Jr1Eix69oJIesWMBQ9Qz5F1r1h03Kk1rEARSfHWKwa/EWaLNl98VyzzOGx9szeUHbk4YYyrTLXtWd3n1lVq23ok/I= X-MS-TrafficTypeDiagnostic: AM5PR03MB3090: X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: 1iowmLxlTNaDivKKI3mPP/dJuRGkJvsPCeO7f90ndfdwxM0GJAaoDhpal4wI/uirFM0rWDWckk69jyeGlCXrlq05cNwl+gWQp4WHFqfkBNa0pnJ4keF8Mb5GYk5pdY1of/zE1EfXYi8d/iQfHjCrqm10bVUWao0vBqWgJ4CtXjiwhdhaSPDxtK5zr8/HJQPuLpWd20inIymFOBSc3MqKON0+5nhuOBX4p92zOJBF+7j6VvntBAv3fWe6vCTfxt93AimaaCVUdH8t620wL2pXyfxguv6RgRHYE6kxkgjIznOzVCPlBUYgzwrPyKM4t4U6+0RUQVtTnkRH2r4ahb4jbfqaPi143Za9HRMq++1Cpv1/zTR2tQ+5YhWPq/1AExJiIcHfnGs3vCtatccBAzIl2kFrM4E6KivzhrVshlr6hvw65nro1IYkJ3c6XmsoiOXMBARKmviUXRTL8YSDqZuDmfwPyIuvaNRj4vhEshpACe+4e/tmViMO05zdAOcVNIVYOzcsWGXf3iwogPstqLXHEdsIQd4ZxT6BJHBWqhXGgXSqWCMVPCur94iYPdzl0NUR0S9ujGz/4LuQa/edEQbw2A== X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: jrh8IL35PsQCyzff6a0k07k9eO6d5rUFj+myIJHFDf0H355ioR3USd/7DlzY7Ie22pJdAvF6lM/ve+U2EG/LJmvz391L7i7hg/gUIgq/SXoWB1T3AEs/gQC9G67gdo7H20lcbaLS4n/nKOz8hkyTeak8YDCpnbPSvzncNrkRr/L6/ra/ax8oWFyc/XmutRUUX5crjSzPuie0/s+1sk9iH3kxGF6b1ElC54TRDH11JpMPGrcsR9R8HcA1fvigYFEzxKb1UV89T9/s/pBd0CF6EifkQnsQlD8ACtfowACRrJjckfYpoh4ZbxFvBaqPRyoZjsTH0Py+GQpNN9mJfrK/BJkReRKRXYreDCNdl/JAI6b6aBNAd6xx4tptUkWJnLz+dQaTYy/S7Zb5zQm4rA0p3GIjcovxAsvXHD1m5kDSLCqx13FqmEBLjlQ6UfPHswCbXfJSAq4HveYHtaSyEc4m+zPcsPaBPZ5u7+6+dDHRfY4tfxl+QQ6zyiY/A9UPND7+0Mv9SSSfWS5M6BDMV6pHbw5pIYJ4IXBBbEnMXSnQugjjQHBCr80TyK5KsCl3e9QMQ5RfktdvULPXLNmUFDZhaE+HKSjkRDrvgGzRScVNtrtFAK8/RqoKvyQqBjnsRJ+MZq039Z3J7f+HJIzfx5NICC+ZbxhW8yh55f4tWg5zLBr+Jz3nYOLgOtCa6UQtFty8Pqksze33t2bmLz5wdST4/AevEBmF7+iq65Y3DWm+IPR5btKg4h85JPW7exK9jb0kWQViaQYUwahvjzcTavmaLs7VTVDGpDp/0wiT6zhgp9UUkGTVnJ1Ju4oLXAGwEU/19/So59G2r++npfoiguF2kSCiKRVzsA2VsATTXvQwWykYQKyf/g2Q5YzWjj0HsASTxyUU9pfJkmSghPJ9l1gTVSTE2/lOP1GZD1Vp7Rm9lprTmi3W+ElpupC8/GfsdNqNlG1F9VBg1AdkCpwSuh6hoA== X-OriginatorOrg: outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: 637a7209-258d-4301-4c7e-08d9b68a955d X-MS-Exchange-CrossTenant-AuthSource: AM7PR03MB6660.eurprd03.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 03 Dec 2021 18:27:38.1671 (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: AM5PR03MB3090 Subject: [FFmpeg-devel] [PATCH 1/4] fftools/cmdutils: Atomically add elements to list of pointers, fix crash 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: sMgn7mI5Cft2 Currently, adding a (separately allocated) element to a list of pointers works by first reallocating the array of pointers and (on success) incrementing its size and only then allocating the new element. If the latter allocation fails, the size is inconsistent, i.e. array[nb_array_elems - 1] is NULL. Our cleanup code crashes in such scenarios. Fix this by adding an auxiliary function that atomically allocates and adds a new element to a list of pointers. Signed-off-by: Andreas Rheinhardt --- fftools/cmdutils.c | 16 ++++++++++++++++ fftools/cmdutils.h | 17 +++++++++++++++++ fftools/ffmpeg_filter.c | 17 ++++------------- fftools/ffmpeg_opt.c | 22 ++++++---------------- 4 files changed, 43 insertions(+), 29 deletions(-) diff --git a/fftools/cmdutils.c b/fftools/cmdutils.c index 45322f8c71..1464b122df 100644 --- a/fftools/cmdutils.c +++ b/fftools/cmdutils.c @@ -2214,6 +2214,22 @@ void *grow_array(void *array, int elem_size, int *size, int new_size) return array; } +void *allocate_array_elem(void *ptr, size_t elem_size, int *nb_elems) +{ + void *new_elem, **array = (void**)ptr; + + if (*nb_elems == INT_MAX) { + av_log(NULL, AV_LOG_ERROR, "Array too big.\n"); + exit_program(1); + } + new_elem = av_mallocz(elem_size); + if (!new_elem) + exit_program(1); + GROW_ARRAY(array, *nb_elems); + array[*nb_elems - 1] = new_elem; + return array; +} + double get_rotation(int32_t *displaymatrix) { double theta = 0; diff --git a/fftools/cmdutils.h b/fftools/cmdutils.h index 64dd7266bc..ae78e60f4c 100644 --- a/fftools/cmdutils.h +++ b/fftools/cmdutils.h @@ -628,11 +628,28 @@ FILE *get_preset_file(char *filename, size_t filename_size, */ void *grow_array(void *array, int elem_size, int *size, int new_size); +/** + * Atomically add a new element to an array of pointers, i.e. allocate + * a new entry, reallocate the array of pointers and make the new last + * member of this array point to the newly allocated buffer. + * Calls exit() on failure. + * + * @param array array of pointers to reallocate + * @param elem_size size of the new element to allocate + * @param nb_elems pointer to the number of elements of the array array; + * *nb_elems will be incremented by one by this function. + * @return reallocated array + */ +void *allocate_array_elem(void *array, size_t elem_size, int *nb_elems); + #define media_type_string av_get_media_type_string #define GROW_ARRAY(array, nb_elems)\ array = grow_array(array, sizeof(*array), &nb_elems, nb_elems + 1) +#define ALLOC_ARRAY_ELEM(array, nb_elems)\ + array = allocate_array_elem(array, sizeof(*array[0]), &nb_elems) + #define GET_PIX_FMT_NAME(pix_fmt)\ const char *name = av_get_pix_fmt_name(pix_fmt); diff --git a/fftools/ffmpeg_filter.c b/fftools/ffmpeg_filter.c index dab0f28819..75194fe66e 100644 --- a/fftools/ffmpeg_filter.c +++ b/fftools/ffmpeg_filter.c @@ -164,18 +164,14 @@ int init_simple_filtergraph(InputStream *ist, OutputStream *ost) exit_program(1); fg->index = nb_filtergraphs; - GROW_ARRAY(fg->outputs, fg->nb_outputs); - if (!(fg->outputs[0] = av_mallocz(sizeof(*fg->outputs[0])))) - exit_program(1); + ALLOC_ARRAY_ELEM(fg->outputs, fg->nb_outputs); fg->outputs[0]->ost = ost; fg->outputs[0]->graph = fg; fg->outputs[0]->format = -1; ost->filter = fg->outputs[0]; - GROW_ARRAY(fg->inputs, fg->nb_inputs); - if (!(fg->inputs[0] = av_mallocz(sizeof(*fg->inputs[0])))) - exit_program(1); + ALLOC_ARRAY_ELEM(fg->inputs, fg->nb_inputs); fg->inputs[0]->ist = ist; fg->inputs[0]->graph = fg; fg->inputs[0]->format = -1; @@ -280,9 +276,7 @@ static void init_input_filter(FilterGraph *fg, AVFilterInOut *in) ist->decoding_needed |= DECODING_FOR_FILTER; ist->st->discard = AVDISCARD_NONE; - GROW_ARRAY(fg->inputs, fg->nb_inputs); - if (!(fg->inputs[fg->nb_inputs - 1] = av_mallocz(sizeof(*fg->inputs[0])))) - exit_program(1); + ALLOC_ARRAY_ELEM(fg->inputs, fg->nb_inputs); fg->inputs[fg->nb_inputs - 1]->ist = ist; fg->inputs[fg->nb_inputs - 1]->graph = fg; fg->inputs[fg->nb_inputs - 1]->format = -1; @@ -318,10 +312,7 @@ int init_complex_filtergraph(FilterGraph *fg) init_input_filter(fg, cur); for (cur = outputs; cur;) { - GROW_ARRAY(fg->outputs, fg->nb_outputs); - fg->outputs[fg->nb_outputs - 1] = av_mallocz(sizeof(*fg->outputs[0])); - if (!fg->outputs[fg->nb_outputs - 1]) - exit_program(1); + ALLOC_ARRAY_ELEM(fg->outputs, fg->nb_outputs); fg->outputs[fg->nb_outputs - 1]->graph = fg; fg->outputs[fg->nb_outputs - 1]->out_tmp = cur; diff --git a/fftools/ffmpeg_opt.c b/fftools/ffmpeg_opt.c index a27263b879..ffba7010e3 100644 --- a/fftools/ffmpeg_opt.c +++ b/fftools/ffmpeg_opt.c @@ -1265,11 +1265,8 @@ static int open_input_file(OptionsContext *o, const char *filename) /* dump the file content */ av_dump_format(ic, nb_input_files, filename, 0); - GROW_ARRAY(input_files, nb_input_files); - f = av_mallocz(sizeof(*f)); - if (!f) - exit_program(1); - input_files[nb_input_files - 1] = f; + ALLOC_ARRAY_ELEM(input_files, nb_input_files); + f = input_files[nb_input_files - 1]; f->ctx = ic; f->ist_index = nb_input_streams - ic->nb_streams; @@ -2261,11 +2258,8 @@ static int open_output_file(OptionsContext *o, const char *filename) } } - GROW_ARRAY(output_files, nb_output_files); - of = av_mallocz(sizeof(*of)); - if (!of) - exit_program(1); - output_files[nb_output_files - 1] = of; + ALLOC_ARRAY_ELEM(output_files, nb_output_files); + of = output_files[nb_output_files - 1]; of->ost_index = nb_output_streams; of->recording_time = o->recording_time; @@ -3262,9 +3256,7 @@ static int opt_audio_qscale(void *optctx, const char *opt, const char *arg) static int opt_filter_complex(void *optctx, const char *opt, const char *arg) { - GROW_ARRAY(filtergraphs, nb_filtergraphs); - if (!(filtergraphs[nb_filtergraphs - 1] = av_mallocz(sizeof(*filtergraphs[0])))) - return AVERROR(ENOMEM); + ALLOC_ARRAY_ELEM(filtergraphs, nb_filtergraphs); filtergraphs[nb_filtergraphs - 1]->index = nb_filtergraphs - 1; filtergraphs[nb_filtergraphs - 1]->graph_desc = av_strdup(arg); if (!filtergraphs[nb_filtergraphs - 1]->graph_desc) @@ -3281,9 +3273,7 @@ static int opt_filter_complex_script(void *optctx, const char *opt, const char * if (!graph_desc) return AVERROR(EINVAL); - GROW_ARRAY(filtergraphs, nb_filtergraphs); - if (!(filtergraphs[nb_filtergraphs - 1] = av_mallocz(sizeof(*filtergraphs[0])))) - return AVERROR(ENOMEM); + ALLOC_ARRAY_ELEM(filtergraphs, nb_filtergraphs); filtergraphs[nb_filtergraphs - 1]->index = nb_filtergraphs - 1; filtergraphs[nb_filtergraphs - 1]->graph_desc = graph_desc;