From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by master.gitmailbox.com (Postfix) with ESMTP id 33D3343F65 for ; Mon, 19 Sep 2022 14:27:40 +0000 (UTC) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id D412068BC85; Mon, 19 Sep 2022 17:27:37 +0300 (EEST) Received: from EUR05-DB8-obe.outbound.protection.outlook.com (mail-db8eur05olkn2075.outbound.protection.outlook.com [40.92.89.75]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id DD1F268BBFC for ; Mon, 19 Sep 2022 17:27:30 +0300 (EEST) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=LYq4QMQCcrOzb91QEoE5YyvOSATWDcKNYVLhLcjaWevyT92RF8K50PvHoEfd22HlzIuPwEf86MBWlp6FyO3oWjNdSizZqF1xXVGTcfJdzsd9NzVsWXmyxAw4WKmYyLrxk+/l53uh03ZpI0nToLO06qqR/hQCkaE6l8auvUpx2XwG0EkOKeEdf7ELeKQPyAVZc1w1kdkjLclQ+aU+GOBckutziZV2n37ZmiZI61C49isVybnVtw2aqIj/Cpk9YNYH89bpVkdKlTElqboXlQ+vu9BSLAfP1LQdy1W7QXSyLyjUqRqrLdLi4cRYO9PK39leEpw/MnzquxUTanKC/Dif1A== 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=zA9No3+4LlMKbZ9UcXCksKpbobqPgKVXCIV8NeYu0v0=; b=Dh1m30v9UyI4Z2AjtyChZ2yHoJaXI5F9xIp4ilvO5zj5CGap8vkyMIvk8wtONKE755dR9msASatvw0x5Ogzppt8nDfcXwIP2JIfBclHwQL4LmmuYEpQRxdXcz0Sn0YzAm+D/Jqophqip/iq+avcaqwqnVh7oFlRAwr5dWNgcBSLPHF5m94cmLdzt7WCe941LvbZJVGeiyDaFmWvkdsgOj3Eaxs4XU2jccurieAJN5/nP+9Qz+5453bUqLABRk0AZhc36QXYwcQsSpStH0vBsd/vQzLyC0mdUdwrK3pRuGKN6zTa2e1BVHtn55mg387v3yPRRDeH/YtM4WbJXPHLU+A== 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=zA9No3+4LlMKbZ9UcXCksKpbobqPgKVXCIV8NeYu0v0=; b=vTg3tBbGsYnuZGdH940mggRAd5mR+XTICDM3PY0HwHAOOI0Kg6x+xhtckEFtu17Y5XMQbn6/IquUQ2+Jw0L1z7X5JtK+8rLIL03qw6PCXdkj7F+/o0AUEjgzmg2M3AlizeQz+Tce4ldYQKNPnaa9z/tMfXpOP6/pIuTyEUe3QktwK7ybWi2gy6DmjdIjryw3TwsWZbSImm8zq87V8l5yDQT0MU0CeBdwctsewvb/Xstbe5TO7/xtjNcpSoeqxAUx3FBkJNBF0HutcyUvSTZp0c128ZM6773bcOgmg+267KMqoRD4cQuEPUUyzcO+nh1z/mIh3jNEA4wgLZiuwTUgtQ== Received: from AS8P250MB0744.EURP250.PROD.OUTLOOK.COM (2603:10a6:20b:541::14) by AM8P250MB0200.EURP250.PROD.OUTLOOK.COM (2603:10a6:20b:327::7) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5632.19; Mon, 19 Sep 2022 14:27:29 +0000 Received: from AS8P250MB0744.EURP250.PROD.OUTLOOK.COM ([fe80::2c84:e72a:48a9:ff90]) by AS8P250MB0744.EURP250.PROD.OUTLOOK.COM ([fe80::2c84:e72a:48a9:ff90%6]) with mapi id 15.20.5632.014; Mon, 19 Sep 2022 14:27:29 +0000 Message-ID: Date: Mon, 19 Sep 2022 16:27:29 +0200 Content-Language: en-US To: ffmpeg-devel@ffmpeg.org References: From: Andreas Rheinhardt In-Reply-To: X-TMN: [rFMeWaHkTW3RhmJbJTankZE60dUqDPpI99PPkBJbuYY=] X-ClientProxiedBy: ZR0P278CA0044.CHEP278.PROD.OUTLOOK.COM (2603:10a6:910:1d::13) To AS8P250MB0744.EURP250.PROD.OUTLOOK.COM (2603:10a6:20b:541::14) X-Microsoft-Original-Message-ID: MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: AS8P250MB0744:EE_|AM8P250MB0200:EE_ X-MS-Office365-Filtering-Correlation-Id: fcfcf21c-dce7-4de3-f1de-08da9a4b14e7 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: fRou6h9GrSU8AfDpdgrreXj8PPQSuj2PqV9kWuEeybDoGSF4Lzyjd9A5+JQv/Bs1x7WRJaVcob45mATQKD3lttWGdYcH+y9JgiGNSKm46UyrWEY2rtGU5GnyRQbocoWrduvR2t4ZJEd/NzgW3Bllqy7JQNhhXO4roPwzxDpO+ZgwVwVsxhGC82v9Er3fAjM94Vy4Jxowkyrjca1lrdDLigar2R0c91+Kg7lp/vUjrNPNn5jWp2ZGnabaoKKKz+OsJw4RYlTVRPbT4YyFf7DnPPfdcfvV8G6PK2uKRTgwkkiLo0f+JfG62PW2ZOy1DY2lYnww7t69x2M+ViZWlAUiDgK26XTFpjR/xX3rNno3e5Lq0d9P2PMm/exF94XreWHozcPxuhhnu/a0J6Pc63+5l9y9h7ow7Jpee9h0pXuCWdbB5q1kolJBs2GlUQVUhROpu+Il4bVwmyFCn5YVxhtYHs9szGq7oov+0fCL5YmPTST0Ko3QpgVydx6ffUKq5wFreIw2gduNl1uc9jCR5QJEsm0O03B4LMJaL7eEYNUEfeuzT/SdJZyouY2PWzSC7kZ+D0nCfyq8E+VJoXRfki9AXZVFvyTPQIeG9iz7rsY6vWi0OPUKv1ksiUp/GGvvfx5Lj7W7rPR4WliDppfBjEjvb89kzQVq5oJObjpkxJkUSOKlrVPi971oukUxQqjzeP5j X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?dm82VW5BbkhKWWpPZ2t3U1g2emZaOUMxdUlIczJHcDFOUHVxYkFwMUZYb0pr?= =?utf-8?B?czZvd1Q5MEEvUE9tVEZqQUdRbkpETkplTC92TlBYY2tXSU1WWFVEV1E0RTBt?= =?utf-8?B?M0Y2SHAyblVxcjFtbHg5bFpwd0NVUFUrODVwMElLcUxqN0ZoQ0FXRHdlbk1v?= =?utf-8?B?RnloMmt2Y1R6VGxkVmtVMWZWTm5NOXJGdlhHNU95V1F4V0VDL1FhRkM5NE03?= =?utf-8?B?TXYvWVc0OWxOUkJaWThPUWhtUDJFakdsSTY0S3JlemJ0aDdmTklGU3EwZGI0?= =?utf-8?B?SVhucUpsZFREOTVTeWlDeUZQdnhvVHhnSW1tMVpoQWxkbFJSUGFRcGh6QmR4?= =?utf-8?B?YkdEeVRNWTEwcnFsZnBTSmUrSDgwSkdiNk5SOVFhSEdUOVNFUHVsT1pxaWZk?= =?utf-8?B?NWJBZmNFbHVEV0k5RitOK0NPc2YzWDZsa29KUXpKWFdZbC9sS3QrZUdjTi81?= =?utf-8?B?cnQ0TDVHZGt6VE5LdVRNa1BVcnJZdmFqbWVad2lhU2Q5WlVaVFNCOEVDMGpo?= =?utf-8?B?MWFMNHczMXJ3YVVYZi9QWnRNOTI2UjFnaXBlSnJKanBRSmhBWmZuTk14Y1pP?= =?utf-8?B?OEJmaHdoSVBzV25uTllrMGVKYnBkUTl6d2JlUVI3cVgrMXBWWFlQL1JOeXdt?= =?utf-8?B?L21OWnpPUTFYL2Jtc2lKSENBa2lweHp0NXJyTUcyQk44WTBRdkhtMlFnczNT?= =?utf-8?B?RzB5T1EvTkMzYjlnUDR5aDArdUFVSCtOa1dwMDRHYTNQTXFYc3JDWjVLUWRw?= =?utf-8?B?SzErWmgxYWg3b1RZYnR2WHFmY002UWI5ZXBCVUtzVTNmbTZiRktYM042UGFW?= =?utf-8?B?V3lWbzdGME5IcStKSkNPdk1uSTFpdExmNzd3RUNFQmZqam9GaTZ6d1pWNE44?= =?utf-8?B?M3dFcmpsbnI2NkFNdXNhQUowMWVQbFJIOWc0ZW0yemtoVTBvdzFVa0xpNEtY?= =?utf-8?B?OWV0c1BDZkVPWjgyZG1rbDczQ09ZY21PMEphNjE4ZlJSNSs2cm9GMnJSVitl?= =?utf-8?B?UExHaWl1Mlk1aVMyQXFuSXI1NmpmNVJ4ck1nN2UvbG9haHE4UHZ5dmpQcG8v?= =?utf-8?B?UGlSclJyL1dQTVhzMEhxaUFZdTNJVWMxVUI4cENtaFRhdE4zSzFBQVRqZEQ5?= =?utf-8?B?K0pNZlVCVDkrMTF1T2xVc2lzRkhHOWI2T0Y1a2doR1FQMGZUUGZyenhTUWFU?= =?utf-8?B?ZnI4c25qWEpEZHhUK1VPTHlleG9IRW5LaEJhdVIvL1RoWWg0MmRTUEw0d1dw?= =?utf-8?B?ZVNFakFEeGY1ZFpSRjI0UWp3TkdDM0VKeTVjblRuTkJISnRGQTNOcERyTWxB?= =?utf-8?B?MEdMR2pEK2FsWXVacDdudVVadG9BMUYyN2taU245c1FZanhJWmlRZzl5RWtL?= =?utf-8?B?L3czdmp5QXRaR3ZkYkVBYVREZEhqVWlNeWQvL0xxSFZ1U1Rra21oV2oxRzFv?= =?utf-8?B?TkRETGxRR3Bsemh1bklwNTFrN2JMTm9PM0M1OEdxMDA2bzFCMklsZE1FVmJU?= =?utf-8?B?VVFmL3R1ZFh0YnBxbDhhazdJWkU1eXhWVlFZZWZPK3N1Tm9lakhpQk5tZGh5?= =?utf-8?B?bVdqTW9GL0pNUnl4eDkzakxSaWZYSnY4Qll6amdqOUd1M1FxUGYyejVoQzV6?= =?utf-8?B?TnhSYjRLSi9IYlQ3TDBJT2NCV01KOXNzRzh5TFE4Tk5mNUUxWTVkMnhOcVd1?= =?utf-8?B?Tk9vR21LeC9zMC9Ha0R4UHBFWXV0bE43Y3JzSno1QWJGRUVmQVJrMjVmQ2Mz?= =?utf-8?Q?ZRCHA6lnI5VRBGmeppN1B4UScRkAvue+02ECGVc?= X-OriginatorOrg: outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: fcfcf21c-dce7-4de3-f1de-08da9a4b14e7 X-MS-Exchange-CrossTenant-AuthSource: AS8P250MB0744.EURP250.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 19 Sep 2022 14:27:29.2190 (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: AM8P250MB0200 Subject: Re: [FFmpeg-devel] [PATCH] avutil/dict: Error out in case of key == NULL 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 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Archived-At: List-Archive: List-Post: Andreas Rheinhardt: > Up until now, using NULL as key in av_dict_get() on a non-empty > AVDictionary would crash; using NULL as key in av_dict_set() > would also crash for a non-empty AVDictionary unless AV_DICT_MULTIKEY > was set; in case the dictionary was initially empty or AV_DICT_MULTIKEY > was set, it was even possible for av_dict_set() to succeed when > adding a NULL key, namely when one uses a value != NULL and > the AV_DICT_DONT_STRDUP_VAL flag. Using av_dict_get() on such > an AVDictionary will usually lead to crashes, though. > > Fix this by actually checking for key in both functions; error out > if they are NULL. > > While just at it, also stop relying on av_strdup(NULL) to return NULL > in av_dict_set(). > > Signed-off-by: Andreas Rheinhardt > --- > libavutil/dict.c | 27 +++++++++++++++++---------- > libavutil/tests/dict.c | 12 +++++++++--- > 2 files changed, 26 insertions(+), 13 deletions(-) > > diff --git a/libavutil/dict.c b/libavutil/dict.c > index 4bba041d0a..14ad780a79 100644 > --- a/libavutil/dict.c > +++ b/libavutil/dict.c > @@ -43,7 +43,7 @@ AVDictionaryEntry *av_dict_get(const AVDictionary *m, const char *key, > { > unsigned int i, j; > > - if (!m) > + if (!m || !key) > return NULL; > > if (prev) > @@ -74,7 +74,16 @@ int av_dict_set(AVDictionary **pm, const char *key, const char *value, > AVDictionary *m = *pm; > AVDictionaryEntry *tag = NULL; > char *copy_key = NULL, *copy_value = NULL; > + int err; > > + if (flags & AV_DICT_DONT_STRDUP_VAL) > + copy_value = (void *)value; > + else if (value) > + copy_value = av_strdup(value); > + if (!key) { > + err = AVERROR(EINVAL); > + goto err_out; > + } > if (!(flags & AV_DICT_MULTIKEY)) { > tag = av_dict_get(m, key, NULL, flags); > } > @@ -82,14 +91,10 @@ int av_dict_set(AVDictionary **pm, const char *key, const char *value, > copy_key = (void *)key; > else > copy_key = av_strdup(key); > - if (flags & AV_DICT_DONT_STRDUP_VAL) > - copy_value = (void *)value; > - else if (copy_key) > - copy_value = av_strdup(value); > if (!m) > m = *pm = av_mallocz(sizeof(*m)); > - if (!m || (key && !copy_key) || (value && !copy_value)) > - goto err_out; > + if (!m || !copy_key || (value && !copy_value)) > + goto enomem; > > if (tag) { > if (flags & AV_DICT_DONT_OVERWRITE) { > @@ -103,7 +108,7 @@ int av_dict_set(AVDictionary **pm, const char *key, const char *value, > size_t len = oldlen + new_part_len + 1; > char *newval = av_realloc(tag->value, len); > if (!newval) > - goto err_out; > + goto enomem; > memcpy(newval + oldlen, copy_value, new_part_len + 1); > av_freep(©_value); > copy_value = newval; > @@ -115,7 +120,7 @@ int av_dict_set(AVDictionary **pm, const char *key, const char *value, > AVDictionaryEntry *tmp = av_realloc_array(m->elems, > m->count + 1, sizeof(*m->elems)); > if (!tmp) > - goto err_out; > + goto enomem; > m->elems = tmp; > } > if (copy_value) { > @@ -132,6 +137,8 @@ int av_dict_set(AVDictionary **pm, const char *key, const char *value, > > return 0; > > +enomem: > + err = AVERROR(ENOMEM); > err_out: > if (m && !m->count) { > av_freep(&m->elems); > @@ -139,7 +146,7 @@ err_out: > } > av_free(copy_key); > av_free(copy_value); > - return AVERROR(ENOMEM); > + return err; > } > > int av_dict_set_int(AVDictionary **pm, const char *key, int64_t value, > diff --git a/libavutil/tests/dict.c b/libavutil/tests/dict.c > index 56e98557a7..d053545f4d 100644 > --- a/libavutil/tests/dict.c > +++ b/libavutil/tests/dict.c > @@ -91,14 +91,20 @@ int main(void) > av_dict_set(&dict, "f", NULL, 0); > av_dict_set(&dict, "ff", "f", 0); > av_dict_set(&dict, "ff", "f", AV_DICT_APPEND); > + if (av_dict_get(dict, NULL, NULL, 0)) > + printf("av_dict_get() does not correctly handle NULL key.\n"); > e = NULL; > while ((e = av_dict_get(dict, "", e, AV_DICT_IGNORE_SUFFIX))) > printf("%s %s\n", e->key, e->value); > av_dict_free(&dict); > > - av_dict_set(&dict, NULL, "a", 0); > - av_dict_set(&dict, NULL, "b", 0); > - av_dict_get(dict, NULL, NULL, 0); > + if (av_dict_set(&dict, NULL, "a", 0) >= 0 || > + av_dict_set(&dict, NULL, "b", 0) >= 0 || > + av_dict_set(&dict, NULL, NULL, AV_DICT_DONT_STRDUP_KEY) >= 0 || > + av_dict_set(&dict, NULL, av_strdup("b"), AV_DICT_DONT_STRDUP_VAL) >= 0 || > + av_dict_count(dict)) > + printf("av_dict_set does not correctly handle NULL key\n"); > + > e = NULL; > while ((e = av_dict_get(dict, "", e, AV_DICT_IGNORE_SUFFIX))) > printf("'%s' '%s'\n", e->key, e->value); Will apply this tonight unless there are objections. - Andreas _______________________________________________ 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".