From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: <ffmpeg-devel-bounces@ffmpeg.org> Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by master.gitmailbox.com (Postfix) with ESMTPS id 0870C4D232 for <ffmpegdev@gitmailbox.com>; Wed, 16 Apr 2025 10:49:23 +0000 (UTC) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 0372C687D6F; Wed, 16 Apr 2025 13:49:20 +0300 (EEST) Received: from EUR05-AM6-obe.outbound.protection.outlook.com (mail-am6eur05olkn2044.outbound.protection.outlook.com [40.92.91.44]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 3CE33687CDB for <ffmpeg-devel@ffmpeg.org>; Wed, 16 Apr 2025 13:49:13 +0300 (EEST) ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=ynHns9s47QHicfZcKlU9Z/gSovAFfvAUshmj8GIFKuUzo358bZtdpZtDyYgevucrrJqmpot9vGAxUCeq+nhGwvpavACmfMm8YDzSP7j5jzF0IdACLOzsIyPKD6N3m6hKIbKx/eP6G+yP1UlzzldtcRZCerTCXMvsRXE/J1BSTxxw9z0KGEfGBRCEtjmbnDuMHAon1kyPHCDk9O2aP74mqzL2cuXsqQw9lCg5yKR9siug73yAiRuRJJVezgj6f4i/aC8brExLpCxZ+fuuTuI7lJoviUfjWrHVDtAKh4PVE6DnMbDrOm5KKjjQfp7XEZk1K9VsMSyouCF9ycG5eLQ7eQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; 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=PqIE65Lzyje52IWd0RWQenbTW8VTo8p3hY7WmOLfV8I=; b=JOV/Jb8crT4vBq4md7Z0b6avG/XnJBUg5d4awzMl9f3E7ViPxjHapyS0NyyySFiEFqGE3pTylXW25eUnquhAH/mhK/Fq+LUYbFT1ybEWdyQIxyrGjLXwyBqAHgbS9kH3dOKq7KvY/kWIMLMnmQwMdZ/RM0LDLI9Z1QlyqgePNgWMLsjHd77yOVnJ62IEK356ZG4Qh4N8kW9ZF4D6RqxdSHuNuf30717SrOW2Mfyb3hDwEzC7D0OS+EnPz9V0LA7vlYt5WJziaaNcH7t99iIIrOpHJzugcv/dFdtGJeAzN3BC+W+BuG7KxPzPNHGMcrYBsl04NLkadCDJk/GKwyjVWg== 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=PqIE65Lzyje52IWd0RWQenbTW8VTo8p3hY7WmOLfV8I=; b=mOiPhGvQl8yaRpw+nZ6GuKhYa9/R3y5HwWthApinYBdlnIAtZv+YFLNtWNjjAWGo0WVdR+46miVOh4+o9JsnrfrtD2Q0DYEUBEjPLYL3lm5eyd0jrIjeo6UVuPDD5kDObiWFHPxY8J2IirGwok/x12LQU3FgTR6xaOkBrymIe7x1/r1ab7kwZNcIV63rfnQk2YLHfcI13SauKqD/IYLbqB0H1wahoNZCBN5p7Eq18GC3rtRuf9MVa6/dgt/QS0/KIBb6pks/rND41mHJEj3tZqzzSt+F9dFCbhNmaopHm1kFxf4AJ54bDG6wCV1NnYke7ZLDZaU/jXRJnUGz0xgpeQ== Received: from GV1P250MB0737.EURP250.PROD.OUTLOOK.COM (2603:10a6:150:8e::17) by VI0P250MB1050.EURP250.PROD.OUTLOOK.COM (2603:10a6:800:249::8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8655.18; Wed, 16 Apr 2025 10:49:11 +0000 Received: from GV1P250MB0737.EURP250.PROD.OUTLOOK.COM ([fe80::d6a1:e3af:a5f1:b614]) by GV1P250MB0737.EURP250.PROD.OUTLOOK.COM ([fe80::d6a1:e3af:a5f1:b614%5]) with mapi id 15.20.8655.012; Wed, 16 Apr 2025 10:49:11 +0000 Message-ID: <GV1P250MB07371D91FE8825EFAB6DA6C08FBD2@GV1P250MB0737.EURP250.PROD.OUTLOOK.COM> Date: Wed, 16 Apr 2025 12:49:10 +0200 User-Agent: Mozilla Thunderbird To: ffmpeg-devel@ffmpeg.org References: <pull.66.ffstaging.FFmpeg.1744634826.ffmpegagent@gmail.com> <pull.66.v2.ffstaging.FFmpeg.1744798340.ffmpegagent@gmail.com> <6568269678c770544d58a9277feaf4953c352d9d.1744798340.git.ffmpegagent@gmail.com> Content-Language: en-US From: Andreas Rheinhardt <andreas.rheinhardt@outlook.com> In-Reply-To: <6568269678c770544d58a9277feaf4953c352d9d.1744798340.git.ffmpegagent@gmail.com> X-ClientProxiedBy: FR4P281CA0443.DEUP281.PROD.OUTLOOK.COM (2603:10a6:d10:c6::17) To GV1P250MB0737.EURP250.PROD.OUTLOOK.COM (2603:10a6:150:8e::17) X-Microsoft-Original-Message-ID: <97747165-c3cb-4a0c-b256-6cc7f93240a9@outlook.com> MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: GV1P250MB0737:EE_|VI0P250MB1050:EE_ X-MS-Office365-Filtering-Correlation-Id: b93291d7-229e-4061-664e-08dd7cd45269 X-Microsoft-Antispam: BCL:0; ARA:14566002|19110799003|8060799006|6090799003|5072599009|461199028|15080799006|7092599003|10035399004|440099028|3412199025|41001999003; X-Microsoft-Antispam-Message-Info: =?utf-8?B?Q3Fmb3VpUnNBNS81cGprd3dUZVlGSG10UXZoU1E5c2RaMW4wV3NoT3Q3czkw?= =?utf-8?B?MjU1WjF4bDNSczBOc3U4QllVZ3o0VjdpU0psRWVKTjVpZ2dZdzg0ZCt5VERy?= =?utf-8?B?eUhqTFpadFlDM20zbG5QWmwvMlNjTXRUOHFlNTBlU0ZWUDFwWFFYK1JHUGV3?= =?utf-8?B?S2F0Ny9IRUVWUFRZSXpFSGZZUFhreWF0WTZ3UVdYSEdOSVBZYVF3cjRDRDZS?= =?utf-8?B?aWZpTytOVFhwZzVCL25LR2hZNDdDQThqMTdwY2tCTWdnQzJSS0Z0YTBhQ3Iw?= =?utf-8?B?MTBDQTRDQzN6UlQ4b2JBRldBYUhiMTJLVFpJekR1M1huek1aUUNCelpjVXgy?= =?utf-8?B?Vk8rZVZkb3ZoYlhlZ2FBdlA0dHFpU2tNV3ZEV3RmVEtmR3lzMjJ1czRjMjJO?= =?utf-8?B?UzFOYVROSVE3d2c5REpVdXU5UTVmQ2l1YlhsYm5sUUt5TnlML1BBbE45cXlL?= =?utf-8?B?bmkvcHEweGs3dmR3czEvZ24yNDhsanpPU3hGU2JEY0I1SHh4OEpRd2RDNUpl?= =?utf-8?B?dnR2aTdOOFpEaHlsM3E1dU51akx3QlNpcjlmWkwyTUxZejd2elVQQkdtMTEy?= =?utf-8?B?a3JHd0d5SS9ZODVhaitabWlDOVNvNWp1dy9jVEY1OHY0c2ZhZFdtN3dOUEkv?= =?utf-8?B?S3NCUUx1MTd5VFkrdDNtYTdiZG9mL09Sb3NXS0NWTGlwaVR5VUpKRlJGY2tM?= =?utf-8?B?NUdubkRmMkpFV3A2WlR2bUc5LzhabDhQNkRwTTU4T0d6ZHNxV3c2T3dOUXRy?= =?utf-8?B?RjR1QWdiTlpaRW1LR0NhRFpNaDY1OGFlQnhMcnZWMU03cGhKeTU1TWRPK0xD?= =?utf-8?B?aFU1UnpoMlk3a3RmYkNCS1V2M0xqZ1B0K0JHcm43UEszV3dYMm5PZjNYRFB5?= =?utf-8?B?d3k5cSt1RDJxc1MwUHBZTFZuOVg5U0pqSE5VSnRuV29qNGxMaWJYRk5McEtn?= =?utf-8?B?KytmWUEvYjdsa1E0YTBLWStPMjBHWHV4cGNPQ21temwvSk16QStRYWRSbVhJ?= =?utf-8?B?WGNzN21EaldqWGo3N0JXUDhXeCtyY3VaNkFYYk1nUmwvTEZVUTc3Ymt3bk1R?= =?utf-8?B?U3UyV1l1ZE9ZS3FrcnJFMVFRaEkyZmJxZmtjSVFHbXYrNXRkUisxMjYwZEZk?= =?utf-8?B?V1FxcEorYUxkOXk2Rjc3TDlsdW9xL25JUGtMZHIvREtUV3dONGlpZnpYbXUz?= =?utf-8?B?WmIwZ3BJYmI3UnJXQUtHN0pYeTE1aUJsV2xxaC9RNXQ5MnNIcml1Y3lOVVVt?= =?utf-8?B?QmtCZlQ5eWpoeHZxSEZ2cDVrUEtaOGVEUFNLS0t0U1hXRGJNdU1lNEJncllQ?= =?utf-8?B?UjNZWWNkaWdHVGRPRUxvSzJyYmFQK0dObFJONGdDUUJQQldjQUNxbVlFaXRx?= =?utf-8?B?eE9xWDdoUVlxZEF6TnkzY3REWXlQV3JJSVl1a0JUVmwwaEQzcFNYbG1LNDRu?= =?utf-8?B?Vk1PUjJJYkNDQURxNXdNVElyUEd4bko5N2Z6MkVDb1kyZ1VjZ1doOWppOUFN?= =?utf-8?B?cHEwVzFWaXBUSHlRK2ppSGh0ZUdFb1dhRDA0SjYzYUd3Ym94WlRuNXM0ckRp?= =?utf-8?B?am9jYzdDNWhoQ3FqNVl6cDRsMmU3b1dqS0R1di9wVmw1NEkrN1ZkRUVlekhn?= =?utf-8?Q?TwwKf5DMyK0pj+PvvcpXF16McVbxNlyg7jNaHd3hh6+0=3D?= X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?cVoxUlZRaE5IN1ZCNjJKQzlYeVpXQ0c3WEFDU1F5UStPN2NrV1I3cElweFFi?= =?utf-8?B?dEJ4QWdFSzVVcmE1eGtJeTdEWlR5YnJZdnM3VitDeGxHeSs5TWM1RzluSEc3?= =?utf-8?B?THh1WjFVMWR2NEFOK25DOTNpZXNoU3NrNjYzYXJiVGw3QytpNjk5ZGNpeWQ0?= =?utf-8?B?dnkzclBiMWFjVFZ0cFdoRGtia01DNklZNlE3WHFZOFJ3TDFVV3orQ0VaemJY?= =?utf-8?B?Q3FNcFdjWW12dDFRa3NQdzc3Rm9ZL0lWMFA3UTNDYTlOTzViWkJaemp4Q2pX?= =?utf-8?B?VUswMWJRVlNDai9xWDI2Yjlxb0NUcEh0cy9HNE9ib3RKVU9ZNXpMZE9DMnZS?= =?utf-8?B?eHhQRDNnYTRRTTdyM1NOOVl4SVd2ZUV4dkttN1pXUW9mWHFCMy9RQlhDUXdz?= =?utf-8?B?V0pWQy8wbDcwOHJma003YnMzMkJnZ2xDb0tXRWJoS056MFY0a3RZMlJObGN5?= =?utf-8?B?RTArQTNoblZYZ2RBOFZNOHBYZmVpYzZzbXVpSmZSUnJTbWQvRDBZcDFxc21z?= =?utf-8?B?dmVGUlZDVTlNWTUrOE5PTWlCTVRMZXlqUmVSQUs3ZTk2NXRjY3QvbWpINzNV?= =?utf-8?B?eU04eXpRS0cxTXNLd2JDZ084YzhReTEwNzgyZlZLdm01aVZpa21xNzcxMTht?= =?utf-8?B?VjBuQkdWY1E5RGd3Mlg3bGh3ZEc1VGtxSjJkY01LYlpBbnFCajlYcVBtdWc2?= =?utf-8?B?MGhKSTBMc3N1eWl1OStQYVdYUVFxUkx3VlJ3T2RqeGZ1cU04VWIrOUlIWEU5?= =?utf-8?B?R3RraGNzajJKaWxZOHAvMGp0M0MrQW9yQmlNU2FjQTE2VUJRUDZlRHczUVhY?= =?utf-8?B?UGFhZE9Vb2R4RzJrQlAwOE12TmIrb3g3Z2FzTkdoNVdtSTdUVi9nU0Y5ZHFs?= =?utf-8?B?RDFNN1dpdFNuRzZiTzcxa3BRUkF5cmlXQ2M4eFBGMVlkQ2IyQnhUbnlEdHk3?= =?utf-8?B?ckZONlJYR0kwNzF4b08xL2s2RDVFWTNpNUw0ckZoNTZVTXprRFBrRU9TaWtu?= =?utf-8?B?R01FTlFPR2pWb05qSUdRTndyWFYyNnNBdE16Nm05SFkxdUdzdmpJN2E5dDZw?= =?utf-8?B?bnlsRkZkcnFZamYzamZIdkJ0TzJUSm03bUMra0hoZjg3MTdTckczYjNDVmYw?= =?utf-8?B?enlCUS9qeVJ6WTBEZCtKRGxlY296UkFYN2VtYVYraE0rNENycFhZTnUydFI1?= =?utf-8?B?UjYxS2hucEUrZWtyUDFHOFdVbCtEQzdvYzFSUjBVR0xVRDVMTFkxWGVQUEEy?= =?utf-8?B?WGU2Qm5vU2J1RVJ0UmRNRUkrRWpnZEcyM014UHFqbWM2b0EwZVNYMTJZbkp4?= =?utf-8?B?SHRmd3RuL2owRjVNOU5lSWdKb2xCcHFBdlZ3MHpQNXpucVZ0Vk9NUkRML09q?= =?utf-8?B?MlhnV0JUUy8wa1V2RkNyQnhWbk9QYjJOeE1lQ2tMdXBPWTFSbDkvRy9ZTkhH?= =?utf-8?B?UVVrVEpObnUwMVBNaHNybFZrREdKOXRSTHBhWjJLMmc1cmQvYjUzYS85S2JW?= =?utf-8?B?NzdiMFhhU2h0NHRITy9hRTVFaDduU1MzYmxBd2VyQkZzblg0VXpHQU5kR0pN?= =?utf-8?B?QmhBeXhsWUN4V0dsLzluTURENjhmeTFYMy9ENnJnYS9PQTRYQ2VlN1orSGtW?= =?utf-8?B?b2RUSFkwc0xQa1p3YlVKbjlPOE0ybEtvL0pza294d01ZK1dJSUZQU0FiUHVs?= =?utf-8?B?a1FHcDRCVzAyT0tFTnBVcVcxM0crMlZpNG5hZklRM3JVMGlUemZNRXZacUNo?= =?utf-8?Q?xAtjjtBcWY0kXJjfld33Sq9C8+U7QmPZVn4j/fI?= X-OriginatorOrg: outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: b93291d7-229e-4061-664e-08dd7cd45269 X-MS-Exchange-CrossTenant-AuthSource: GV1P250MB0737.EURP250.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 16 Apr 2025 10:49:11.7265 (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: VI0P250MB1050 Subject: Re: [FFmpeg-devel] [PATCH v2 02/10] fftools/textformat: Quality improvements X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: FFmpeg development discussions and patches <ffmpeg-devel.ffmpeg.org> List-Unsubscribe: <https://ffmpeg.org/mailman/options/ffmpeg-devel>, <mailto:ffmpeg-devel-request@ffmpeg.org?subject=unsubscribe> List-Archive: <https://ffmpeg.org/pipermail/ffmpeg-devel> List-Post: <mailto:ffmpeg-devel@ffmpeg.org> List-Help: <mailto:ffmpeg-devel-request@ffmpeg.org?subject=help> List-Subscribe: <https://ffmpeg.org/mailman/listinfo/ffmpeg-devel>, <mailto:ffmpeg-devel-request@ffmpeg.org?subject=subscribe> Reply-To: FFmpeg development discussions and patches <ffmpeg-devel@ffmpeg.org> Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" <ffmpeg-devel-bounces@ffmpeg.org> Archived-At: <https://master.gitmailbox.com/ffmpegdev/GV1P250MB07371D91FE8825EFAB6DA6C08FBD2@GV1P250MB0737.EURP250.PROD.OUTLOOK.COM/> List-Archive: <https://master.gitmailbox.com/ffmpegdev/> List-Post: <mailto:ffmpegdev@gitmailbox.com> softworkz: > From: softworkz <softworkz@hotmail.com> > > Signed-off-by: softworkz <softworkz@hotmail.com> > --- > fftools/textformat/avtextformat.c | 111 +++++++++++++++++++----------- > fftools/textformat/avtextformat.h | 6 +- > fftools/textformat/tf_default.c | 8 ++- > fftools/textformat/tf_ini.c | 2 +- > fftools/textformat/tf_json.c | 8 ++- > fftools/textformat/tf_xml.c | 3 - > fftools/textformat/tw_avio.c | 9 ++- > 7 files changed, 93 insertions(+), 54 deletions(-) > > diff --git a/fftools/textformat/avtextformat.c b/fftools/textformat/avtextformat.c > index 811b14b999..4c8def8e65 100644 > --- a/fftools/textformat/avtextformat.c > +++ b/fftools/textformat/avtextformat.c > @@ -93,9 +93,8 @@ static const AVClass textcontext_class = { > > static void bprint_bytes(AVBPrint *bp, const uint8_t *ubuf, size_t ubuf_size) > { > - int i; > av_bprintf(bp, "0X"); > - for (i = 0; i < ubuf_size; i++) > + for (unsigned i = 0; i < ubuf_size; i++) > av_bprintf(bp, "%02X", ubuf[i]); > } > > @@ -141,7 +140,10 @@ int avtext_context_open(AVTextFormatContext **ptctx, > AVTextFormatContext *tctx; > int i, ret = 0; > > - if (!(tctx = av_mallocz(sizeof(AVTextFormatContext)))) { > + if (!ptctx || !formatter) > + return AVERROR(EINVAL); > + > + if (!((tctx = av_mallocz(sizeof(AVTextFormatContext))))) { > ret = AVERROR(ENOMEM); > goto fail; > } > @@ -213,25 +215,26 @@ int avtext_context_open(AVTextFormatContext **ptctx, > av_log(NULL, AV_LOG_ERROR, " %s", n); > av_log(NULL, AV_LOG_ERROR, "\n"); > } > - return ret; > + goto fail; > } > > /* validate replace string */ > { > - const uint8_t *p = tctx->string_validation_replacement; > - const uint8_t *endp = p + strlen(p); > + const uint8_t *p = (uint8_t *)tctx->string_validation_replacement; > + const uint8_t *endp = p + strlen((const char *)p); We use -Wno-pointer-sign in order to avoid these ugly casts. > while (*p) { > const uint8_t *p0 = p; > int32_t code; > ret = av_utf8_decode(&code, &p, endp, tctx->string_validation_utf8_flags); > if (ret < 0) { > AVBPrint bp; > - av_bprint_init(&bp, 0, AV_BPRINT_SIZE_AUTOMATIC); > + av_bprint_init(&bp, 0, AV_BPRINT_SIZE_UNLIMITED); > bprint_bytes(&bp, p0, p - p0), > av_log(tctx, AV_LOG_ERROR, > "Invalid UTF8 sequence %s found in string validation replace '%s'\n", > bp.str, tctx->string_validation_replacement); > - return ret; > + av_bprint_finalize(&bp, NULL); You know that this is supposed to be for a single UTF-8 code point? It is not supposed to write hundreds of bytes (although this may happen with crazy input). > + goto fail; > } > } > } > @@ -259,6 +262,9 @@ static const char unit_bit_per_second_str[] = "bit/s"; > > void avtext_print_section_header(AVTextFormatContext *tctx, const void *data, int section_id) > { > + if (section_id < 0 || section_id >= tctx->nb_sections) > + return; > + > tctx->level++; > av_assert0(tctx->level < SECTION_MAX_NB_LEVELS); > > @@ -272,6 +278,9 @@ void avtext_print_section_header(AVTextFormatContext *tctx, const void *data, in > > void avtext_print_section_footer(AVTextFormatContext *tctx) > { > + if (tctx->level < 0 || tctx->level >= SECTION_MAX_NB_LEVELS) > + return; > + > int section_id = tctx->section[tctx->level]->id; > int parent_section_id = tctx->level > ? tctx->section[tctx->level - 1]->id > @@ -289,7 +298,12 @@ void avtext_print_section_footer(AVTextFormatContext *tctx) > > void avtext_print_integer(AVTextFormatContext *tctx, const char *key, int64_t val) > { > - const struct AVTextFormatSection *section = tctx->section[tctx->level]; > + const AVTextFormatSection *section; > + > + if (!key || tctx->level < 0 || tctx->level >= SECTION_MAX_NB_LEVELS) > + return; > + > + section = tctx->section[tctx->level]; > > if (section->show_all_entries || av_dict_get(section->entries_to_show, key, NULL, 0)) { > tctx->formatter->print_integer(tctx, key, val); > @@ -299,24 +313,25 @@ void avtext_print_integer(AVTextFormatContext *tctx, const char *key, int64_t va > > static inline int validate_string(AVTextFormatContext *tctx, char **dstp, const char *src) > { > - const uint8_t *p, *endp; > + const uint8_t *p, *endp, *srcp = (const uint8_t *)src; > AVBPrint dstbuf; > + AVBPrint bp; > int invalid_chars_nb = 0, ret = 0; > > + *dstp = NULL; > av_bprint_init(&dstbuf, 0, AV_BPRINT_SIZE_UNLIMITED); > + av_bprint_init(&bp, 0, AV_BPRINT_SIZE_UNLIMITED); > > - endp = src + strlen(src); > - for (p = src; *p;) { > - uint32_t code; > + endp = srcp + strlen(src); > + for (p = srcp; *p;) { > + int32_t code; > int invalid = 0; > const uint8_t *p0 = p; > > if (av_utf8_decode(&code, &p, endp, tctx->string_validation_utf8_flags) < 0) { > - AVBPrint bp; > - av_bprint_init(&bp, 0, AV_BPRINT_SIZE_AUTOMATIC); > - bprint_bytes(&bp, p0, p-p0); > - av_log(tctx, AV_LOG_DEBUG, > - "Invalid UTF-8 sequence %s found in string '%s'\n", bp.str, src); > + av_bprint_clear(&bp); > + bprint_bytes(&bp, p0, p - p0); > + av_log(tctx, AV_LOG_DEBUG, "Invalid UTF-8 sequence %s found in string '%s'\n", bp.str, src); > invalid = 1; > } > > @@ -336,7 +351,7 @@ static inline int validate_string(AVTextFormatContext *tctx, char **dstp, const > } > > if (!invalid || tctx->string_validation == AV_TEXTFORMAT_STRING_VALIDATION_IGNORE) > - av_bprint_append_data(&dstbuf, p0, p-p0); > + av_bprint_append_data(&dstbuf, (const char *)p0, p - p0); > } > > if (invalid_chars_nb && tctx->string_validation == AV_TEXTFORMAT_STRING_VALIDATION_REPLACE) > @@ -346,6 +361,7 @@ static inline int validate_string(AVTextFormatContext *tctx, char **dstp, const > > end: > av_bprint_finalize(&dstbuf, dstp); > + av_bprint_finalize(&bp, NULL); > return ret; > } > > @@ -358,17 +374,18 @@ struct unit_value { > const char *unit; > }; > > -static char *value_string(AVTextFormatContext *tctx, char *buf, int buf_size, struct unit_value uv) > +static char *value_string(const AVTextFormatContext *tctx, char *buf, int buf_size, struct unit_value uv) > { > double vald; > - int64_t vali; > + int64_t vali = 0; > int show_float = 0; > > if (uv.unit == unit_second_str) { > vald = uv.val.d; > show_float = 1; > } else { > - vald = vali = uv.val.i; > + vald = (double)uv.val.i; > + vali = uv.val.i; > } > > if (uv.unit == unit_second_str && tctx->use_value_sexagesimal_format) { > @@ -387,17 +404,17 @@ static char *value_string(AVTextFormatContext *tctx, char *buf, int buf_size, st > int64_t index; > > if (uv.unit == unit_byte_str && tctx->use_byte_value_binary_prefix) { > - index = (int64_t) (log2(vald)) / 10; > - index = av_clip(index, 0, FF_ARRAY_ELEMS(si_prefixes) - 1); > + index = (int64_t)(log2(vald) / 10); > + index = av_clip64(index, 0, FF_ARRAY_ELEMS(si_prefixes) - 1); > vald /= si_prefixes[index].bin_val; > prefix_string = si_prefixes[index].bin_str; > } else { > - index = (int64_t) (log10(vald)) / 3; > - index = av_clip(index, 0, FF_ARRAY_ELEMS(si_prefixes) - 1); > + index = (int64_t)(log10(vald) / 3); > + index = av_clip64(index, 0, FF_ARRAY_ELEMS(si_prefixes) - 1); > vald /= si_prefixes[index].dec_val; > prefix_string = si_prefixes[index].dec_str; > } > - vali = vald; > + vali = (int64_t)vald; > } > > if (show_float || (tctx->use_value_prefix && vald != (int64_t)vald)) > @@ -425,9 +442,14 @@ void avtext_print_unit_int(AVTextFormatContext *tctx, const char *key, int value > > int avtext_print_string(AVTextFormatContext *tctx, const char *key, const char *val, int flags) > { > - const struct AVTextFormatSection *section = tctx->section[tctx->level]; > + const AVTextFormatSection *section; > int ret = 0; > > + if (!key || !val || tctx->level < 0 || tctx->level >= SECTION_MAX_NB_LEVELS) > + return AVERROR(EINVAL); > + > + section = tctx->section[tctx->level]; > + > if (tctx->show_optional_fields == SHOW_OPTIONAL_FIELDS_NEVER || > (tctx->show_optional_fields == SHOW_OPTIONAL_FIELDS_AUTO > && (flags & AV_TEXTFORMAT_PRINT_STRING_OPTIONAL) > @@ -469,12 +491,11 @@ void avtext_print_rational(AVTextFormatContext *tctx, const char *key, AVRationa > void avtext_print_time(AVTextFormatContext *tctx, const char *key, > int64_t ts, const AVRational *time_base, int is_duration) > { > - char buf[128]; > - > if ((!is_duration && ts == AV_NOPTS_VALUE) || (is_duration && ts == 0)) { > avtext_print_string(tctx, key, "N/A", AV_TEXTFORMAT_PRINT_STRING_OPTIONAL); > } else { > - double d = ts * av_q2d(*time_base); > + char buf[128]; > + double d = av_q2d(*time_base) * ts; > struct unit_value uv; > uv.val.d = d; > uv.unit = unit_second_str; > @@ -495,7 +516,8 @@ void avtext_print_data(AVTextFormatContext *tctx, const char *name, > const uint8_t *data, int size) > { > AVBPrint bp; > - int offset = 0, l, i; > + unsigned offset = 0; > + int l, i; > > av_bprint_init(&bp, 0, AV_BPRINT_SIZE_UNLIMITED); > av_bprintf(&bp, "\n"); > @@ -522,25 +544,29 @@ void avtext_print_data(AVTextFormatContext *tctx, const char *name, > void avtext_print_data_hash(AVTextFormatContext *tctx, const char *name, > const uint8_t *data, int size) > { > - char *p, buf[AV_HASH_MAX_SIZE * 2 + 64] = { 0 }; > + char buf[AV_HASH_MAX_SIZE * 2 + 64] = { 0 }; > + int len; > > if (!tctx->hash) > return; > > av_hash_init(tctx->hash); > av_hash_update(tctx->hash, data, size); > - snprintf(buf, sizeof(buf), "%s:", av_hash_get_name(tctx->hash)); > - p = buf + strlen(buf); > - av_hash_final_hex(tctx->hash, p, buf + sizeof(buf) - p); > + len = snprintf(buf, sizeof(buf), "%s:", av_hash_get_name(tctx->hash)); > + av_hash_final_hex(tctx->hash, (uint8_t *)&buf[len], (int)sizeof(buf) - len); > avtext_print_string(tctx, name, buf, 0); > } > > void avtext_print_integers(AVTextFormatContext *tctx, const char *name, > - uint8_t *data, int size, const char *format, > - int columns, int bytes, int offset_add) > + uint8_t *data, int size, const char *format, > + int columns, int bytes, int offset_add) > { > AVBPrint bp; > - int offset = 0, l, i; > + unsigned offset = 0; > + int l, i; > + > + if (!name || !data || !format || columns <= 0 || bytes <= 0) > + return; > > av_bprint_init(&bp, 0, AV_BPRINT_SIZE_UNLIMITED); > av_bprintf(&bp, "\n"); > @@ -607,12 +633,15 @@ int avtextwriter_context_open(AVTextWriterContext **pwctx, const AVTextWriter *w > AVTextWriterContext *wctx; > int ret = 0; > > - if (!(wctx = av_mallocz(sizeof(AVTextWriterContext)))) { > + if (!pwctx || !writer) > + return AVERROR(EINVAL); > + > + if (!((wctx = av_mallocz(sizeof(AVTextWriterContext))))) { > ret = AVERROR(ENOMEM); > goto fail; > } > > - if (!(wctx->priv = av_mallocz(writer->priv_size))) { > + if (writer->priv_size && !((wctx->priv = av_mallocz(writer->priv_size)))) { > ret = AVERROR(ENOMEM); > goto fail; > } > diff --git a/fftools/textformat/avtextformat.h b/fftools/textformat/avtextformat.h > index c598af3450..aea691f351 100644 > --- a/fftools/textformat/avtextformat.h > +++ b/fftools/textformat/avtextformat.h > @@ -21,9 +21,7 @@ > #ifndef FFTOOLS_TEXTFORMAT_AVTEXTFORMAT_H > #define FFTOOLS_TEXTFORMAT_AVTEXTFORMAT_H > > -#include <stddef.h> > #include <stdint.h> > -#include "libavutil/attributes.h" > #include "libavutil/dict.h" > #include "libavformat/avio.h" > #include "libavutil/bprint.h" > @@ -103,7 +101,7 @@ struct AVTextFormatContext { > unsigned int nb_item_type[SECTION_MAX_NB_LEVELS][SECTION_MAX_NB_SECTIONS]; > > /** section per each level */ > - const struct AVTextFormatSection *section[SECTION_MAX_NB_LEVELS]; > + const AVTextFormatSection *section[SECTION_MAX_NB_LEVELS]; > AVBPrint section_pbuf[SECTION_MAX_NB_LEVELS]; ///< generic print buffer dedicated to each section, > /// used by various formatters > > @@ -124,7 +122,7 @@ struct AVTextFormatContext { > #define AV_TEXTFORMAT_PRINT_STRING_VALIDATE 2 > > int avtext_context_open(AVTextFormatContext **ptctx, const AVTextFormatter *formatter, AVTextWriterContext *writer_context, const char *args, > - const struct AVTextFormatSection *sections, int nb_sections, > + const AVTextFormatSection *sections, int nb_sections, > int show_value_unit, > int use_value_prefix, > int use_byte_value_binary_prefix, > diff --git a/fftools/textformat/tf_default.c b/fftools/textformat/tf_default.c > index 2c5047eafd..ad97173b0b 100644 > --- a/fftools/textformat/tf_default.c > +++ b/fftools/textformat/tf_default.c > @@ -68,9 +68,10 @@ DEFINE_FORMATTER_CLASS(default); > /* lame uppercasing routine, assumes the string is lower case ASCII */ > static inline char *upcase_string(char *dst, size_t dst_size, const char *src) > { > - int i; > + unsigned i; > + > for (i = 0; src[i] && i < dst_size - 1; i++) > - dst[i] = av_toupper(src[i]); > + dst[i] = (char)av_toupper(src[i]); > dst[i] = 0; > return dst; > } > @@ -106,6 +107,9 @@ static void default_print_section_footer(AVTextFormatContext *wctx) > const struct AVTextFormatSection *section = wctx->section[wctx->level]; > char buf[32]; > > + if (!section) > + return; > + > if (def->noprint_wrappers || def->nested_section[wctx->level]) > return; > > diff --git a/fftools/textformat/tf_ini.c b/fftools/textformat/tf_ini.c > index 88add0819a..dd77d0e8bf 100644 > --- a/fftools/textformat/tf_ini.c > +++ b/fftools/textformat/tf_ini.c > @@ -91,7 +91,7 @@ static char *ini_escape_str(AVBPrint *dst, const char *src) > /* fallthrough */ > default: > if ((unsigned char)c < 32) > - av_bprintf(dst, "\\x00%02x", c & 0xff); > + av_bprintf(dst, "\\x00%02x", (unsigned char)c); > else > av_bprint_chars(dst, c, 1); > break; > diff --git a/fftools/textformat/tf_json.c b/fftools/textformat/tf_json.c > index b61d3740c6..e86cdbf5d9 100644 > --- a/fftools/textformat/tf_json.c > +++ b/fftools/textformat/tf_json.c > @@ -80,13 +80,18 @@ static const char *json_escape_str(AVBPrint *dst, const char *src, void *log_ctx > static const char json_subst[] = { '"', '\\', 'b', 'f', 'n', 'r', 't', 0 }; > const char *p; > > + if (!src) { > + av_log(log_ctx, AV_LOG_ERROR, "json_escape_str: NULL source string\n"); > + return NULL; > + } > + > for (p = src; *p; p++) { > char *s = strchr(json_escape, *p); > if (s) { > av_bprint_chars(dst, '\\', 1); > av_bprint_chars(dst, json_subst[s - json_escape], 1); > } else if ((unsigned char)*p < 32) { > - av_bprintf(dst, "\\u00%02x", *p & 0xff); > + av_bprintf(dst, "\\u00%02x", (unsigned char)*p); > } else { > av_bprint_chars(dst, *p, 1); > } > @@ -105,6 +110,7 @@ static void json_print_section_header(AVTextFormatContext *wctx, const void *dat > wctx->section[wctx->level-1] : NULL; > > if (wctx->level && wctx->nb_item[wctx->level-1]) > + if (wctx->level && wctx->nb_item[wctx->level - 1]) > writer_put_str(wctx, ",\n"); > > if (section->flags & AV_TEXTFORMAT_SECTION_FLAG_IS_WRAPPER) { > diff --git a/fftools/textformat/tf_xml.c b/fftools/textformat/tf_xml.c > index befb39246d..28abfc6400 100644 > --- a/fftools/textformat/tf_xml.c > +++ b/fftools/textformat/tf_xml.c > @@ -18,10 +18,7 @@ > * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA > */ > > -#include <limits.h> > -#include <stdarg.h> > #include <stdint.h> > -#include <stdio.h> > #include <string.h> > > #include "avtextformat.h" > diff --git a/fftools/textformat/tw_avio.c b/fftools/textformat/tw_avio.c > index 6034f74ec9..b1743fb43a 100644 > --- a/fftools/textformat/tw_avio.c > +++ b/fftools/textformat/tw_avio.c > @@ -53,7 +53,7 @@ static void io_w8(AVTextWriterContext *wctx, int b) > static void io_put_str(AVTextWriterContext *wctx, const char *str) > { > IOWriterContext *ctx = wctx->priv; > - avio_write(ctx->avio_context, str, strlen(str)); > + avio_write(ctx->avio_context, (const unsigned char *)str, (int)strlen(str)); > } > > static void io_printf(AVTextWriterContext *wctx, const char *fmt, ...) > @@ -78,10 +78,12 @@ const AVTextWriter avtextwriter_avio = { > > int avtextwriter_create_file(AVTextWriterContext **pwctx, const char *output_filename) > { > + if (!pwctx || !output_filename || !output_filename[0]) > + return AVERROR(EINVAL); You said in [1] that you removed all these impossible checks, yet here they are; they are also above. [1]: https://ffmpeg.org/pipermail/ffmpeg-devel/2025-April/342317.html > + > IOWriterContext *ctx; > int ret; > > - > ret = avtextwriter_context_open(pwctx, &avtextwriter_avio); > if (ret < 0) > return ret; > @@ -103,6 +105,9 @@ int avtextwriter_create_file(AVTextWriterContext **pwctx, const char *output_fil > > int avtextwriter_create_avio(AVTextWriterContext **pwctx, AVIOContext *avio_ctx, int close_on_uninit) > { > + if (!pwctx || !avio_ctx) > + return AVERROR(EINVAL); > + > IOWriterContext *ctx; > int ret; > _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".