From patchwork Wed Sep 14 19:55:16 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Rheinhardt X-Patchwork-Id: 37916 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:3b1c:b0:96:9ee8:5cfd with SMTP id c28csp1533827pzh; Wed, 14 Sep 2022 12:55:30 -0700 (PDT) X-Google-Smtp-Source: AA6agR4pNTtL4tw3y6BUum99haiqxJzsLDul+UxL2cAFeZvLNYSve+V53muc/T6SOPkSeKefuVvb X-Received: by 2002:a17:907:16a5:b0:77c:e0f0:1f25 with SMTP id hc37-20020a17090716a500b0077ce0f01f25mr12288087ejc.217.1663185330199; Wed, 14 Sep 2022 12:55:30 -0700 (PDT) Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id e18-20020a17090658d200b0072f0a9a8e61si13305563ejs.368.2022.09.14.12.55.29; Wed, 14 Sep 2022 12:55:30 -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; dkim=neutral (body hash did not verify) header.i=@outlook.com header.s=selector1 header.b=YtrItbZf; 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 A580068BB71; Wed, 14 Sep 2022 22:55:27 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from EUR04-HE1-obe.outbound.protection.outlook.com (mail-oln040092073023.outbound.protection.outlook.com [40.92.73.23]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id E912F68BB46 for ; Wed, 14 Sep 2022 22:55:20 +0300 (EEST) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=QFTuqari8e4x5Mg91sD4ZKcuoY7u+9Bn2mWNsbT7Cu0snEGoc9I6A3ybi87+vfN88tcHTPuB6dguuW9uWyroVPGSK1ElHEhEvHBMwTUdbJbhOyv0jlf+bj++CjQMzExsPdowhelEkPzXxieGCWFXyPqviIP9yW6e79n2TiiaIVACjvZcLVzq6d4P/J+X5Ym+cGR8gGsZWhKCJnXjvs4yDlyFavPH/Nk+OhVgIpmH8dWqvwFPznIBQ1LL5hioU02CvHWAoYbiCK6PvF4cYe6k9fcODXDX4sqIjz0ZX6lEIBY1aKy6rfGrpYy6mIsgQqZPsLjgGSehS+BNfBnwkJbNIw== 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=KTmwPhBsS2T7A6J6BpVXGHyJU0xkR0DpgorhnCnpGjY=; b=FZXvim6a3VABloemFlwWZIfHM74XD66yCSjMLOjn2uRB9RRdrmHtTMso4w23fsviKTNc6eaNVrM09W4QQyyG5NoN/UoMux2hJbws0a3F9Aa+kIN+KAGU8WFRcAdyWWD2HKlFQGmZanAXxKNXagqJMqn6AXdk2ROe7XHM3hTUKqhaN6CKaSa51+XJszhWC7yYr1bG9Y0/Jb1JPe0tREW/tcwJR3hXywJDOuglij3+oXrHz4hiVFPnaLfdkJ957y596XejjMiFuOzm0dYR5e6Shysyh+0Hhbp9H2E6mibCE1eNHxlO23bB/7p9DMnOqgeFAlvgtNMQ98GX239aHq6o5A== 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=KTmwPhBsS2T7A6J6BpVXGHyJU0xkR0DpgorhnCnpGjY=; b=YtrItbZfoTXHflHxn28wDGxolIUZpP5CDjTe09/PiDMql6SqadSv1O3MrsobfdGqzz67Ok5vBCLPVVBDjhM5SffgvHcNlixuk14CTGoAYoSycASUzFuA628xvvKZKzUaO2rWmtbqZAwJRKLUCa7YRQtyTc4wq242orZN6xx6XvTfakjRdptnNlPENm8mxTL/K2iT8HNeGB7TBl2M6KxBneWStqqYh5ynhRLQK7FoJKv+3rn06fPGdu33Ebc/nl2ehbrUSKKkl7dbN3V2W12kzdxBIVvyqGlBtd860dJUhlY/bDSPNHT9/TQ/ek4NlDKXpoh4/xcXM3konskSDd/TnQ== Received: from GV1P250MB0737.EURP250.PROD.OUTLOOK.COM (2603:10a6:150:8e::17) by DB4P250MB0927.EURP250.PROD.OUTLOOK.COM (2603:10a6:10:384::8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5612.22; Wed, 14 Sep 2022 19:55:19 +0000 Received: from GV1P250MB0737.EURP250.PROD.OUTLOOK.COM ([fe80::51a4:ed23:ea45:dfeb]) by GV1P250MB0737.EURP250.PROD.OUTLOOK.COM ([fe80::51a4:ed23:ea45:dfeb%8]) with mapi id 15.20.5612.022; Wed, 14 Sep 2022 19:55:19 +0000 From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Wed, 14 Sep 2022 21:55:16 +0200 Message-ID: X-Mailer: git-send-email 2.34.1 X-TMN: [ADBC0ozt/fMUcFz1dI0qjYdsy7fkYmSKCbXoprzzL/A=] X-ClientProxiedBy: ZR2P278CA0023.CHEP278.PROD.OUTLOOK.COM (2603:10a6:910:46::18) To GV1P250MB0737.EURP250.PROD.OUTLOOK.COM (2603:10a6:150:8e::17) X-Microsoft-Original-Message-ID: <20220914195516.1724208-1-andreas.rheinhardt@outlook.com> MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: GV1P250MB0737:EE_|DB4P250MB0927:EE_ X-MS-Office365-Filtering-Correlation-Id: d2b84ea7-6030-4497-7f5b-08da968b0d24 X-MS-Exchange-SLBlob-MailProps: EgT5Wr3QDKzA32Qa6xCviVLt9lngqHiTnNkOi+KgEeBMl5xYZjVvSnwyW+7YEiQZ7PxCFXiJ5lGirblKsBfOsWdsrfm3WiCw1hRDWMM9Z6VS5GO+cGWs/XVDoWb9mzJvwjUdUbX9q/4C4rwQssbR51Y8u6IGQSTqHy5gZR71OTefw3JKp0CGFoHWoT3KcF/ue+7N33/p2Sst88bMsVDL0cFTaqPfv4/6Jg6/YPyqA1R2YmJYzTOB6eYApAiZi4xSxl1OM2K47BBOJdDC2NcCyhZ5XaHJ6mHhmuJhWaYnVXgLJMdRfmt5lfMecfPC1w4DKlJWXqeb3EWd3ZQRDEV6RR0dZESPh5VituU4x5lgiBxXTHwGEb4E/Xv3zF7ZXE0MEab8AHpurpVlrOFUHzziEkEHiehi7S6bGYVtkH4GhT6ZEfWffrRrYd7UvBTEdJhMF6i9mjPVd8K0YyH1xpTWc6R/wbdKQwWErX/Vr4y47/4KYwOX7J8WfqxyWDmPJnx8Xvj8fu4q1fwOBYZc3a6Yun9mQ00cQY6Wci/O6rjJccVo6qaeicfo9Gi8mljRJs3ok2j6cEejeMhXuwcOKDYyZqAXQ0nIXmb8UmkSdddbEGSOhju9YfDUkk2HW2sFFoKADirQc9KIULfa/mq50MDf3aQoMvBxbpo5E/Co/YE4DiwR7/6qjECDZUBV/4XXk7t48ae9XzJ0/gqiE/zBKfujj/Fz4SbNxYXzEd7EYlqz+zw= X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: WhYMyKxGHeOirHmJserMIJJtZj37VGdda/dvSJ856AIIYC5bdy2adqjdE5Q7Pu8F692l7QYCc0OsP+cbrJfoohxvyKGLWbwztL+pVlQdjgfwiNdNa+R7leZE5YrnfWuZydeiycoWuuVcHiUHyoP5IsSIzYgsiYUgrZo1txoLkUwdu5yHD4gUIA4A1UbPVjhdnOvvRpY88VvvUjXY5pizf/KBm5D1Q2N3SGb+Z4Sz3AfOQZDOakg8tH6OMZSr+Et6GkX5OyZhvFRugP2yANvIvJN2/AUB7usVroEhQzYhoH6qBYJXiv2sraNjrkRP/A/E1T7VIkd5kdF0nnFQNYTBq2K/+rL4HtSjpLyNFXQ4GjjrKOV+cTZHSTUj167d7iPfdGL/jdsXG9Ti/eUk3Sc4jWB55Oqe5gO7RUPttfHUskQ28pLUbLk820j0i79R1apCXhAtua2YM/IlbB2rDc+diEKLC6OvKLdkJmjbww1S4mmajsa730OXvV6vlzRAuUzlbM6/27YT+PAWHtKVTpn4mHDuGeVQw6SK+Bdbqg6PEJ+nQTUC61z9fOBJl7pUFauUo+jVm9A3hKPmrS2QmQIIg/m/iNrOCGi3kwU7py5JRjSOaq2cVQZIcqxwDcPT2r8caQXW2PyvuIaCOXSPRpP0sg== X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: IX+ZnCFxsmSQmMFSChkHLKBJUGrCJlysAu3QxBN0wP41pgwSicEoEeurs84Btrr9uVpXikKRG6rTYGPGQGegLkyG7i/+t+Y+ZEqaXEAYDWINM/naaA8UF4A1/H0V3FM/UxWX6WfqMqg1aEKpUS1tZQTp3bvjxT/hpPeRv60VMKONOq3en5JpY4A/nG+Zi1U0p+Cw6C2IvDziyzDhbJUVGSy4d9Je7u0S9eIPFuQYV3zI1x17PeQqEO/hT+LgeQR/QOxMaGC4lGDWYXF4ssMq9o7f9m+/HhAWeQwPEgiprDooJjLFGS2UsyruW7vNxnfwoV7YYWssouxeK0VdrMKON1REYWIEbEdFcdfD1jK/K1PfX+/rZRn0L85T47MWk3SBjgtkgn1ky5gJZ4ulUDBn06WcxxOWAPVxEeAsvaokc7VMzwv9JS9j1YzkuivicH4AFzrjJVxRf8xrmzON7721GYHekjpN0/D3BeHvSxwWZr8iQ8aSD6GAcFW+yaOGID/7Hkqkz66N2xXb3uIRGwgsLBptg5cXE8uZFRL4otVDw5zc97FsS6Eq0GSFRbjsLVrrXnwkXNOK2S5CcOLtwxr0QFl3lnIwIJOnXlGLh5oG7vwqfhPdjtABJX4O7LXIdxRCghy3BiNjTa+kp1BK/7hBI6G9u/Haip+/Q9aYbUyy4c4BEu8/yu2vLgFB2dLjIbh5cPru5qU7cSOI3sFhJVOHwZBsrhJbLGZoWEECZSqFZ+QHaR9BXU6lyAlqEzUFdzSjmzrlVwGHwLk/KeI2rlcMoLTpZA3xoiSeyncl4jzjawMndW03Wik6euRMtZ/TAXbeNroS54qaIUKknbJG4uugkPJPRaKs0UVcIzIRFY2oePZR0R50tvgSja8INwhJq6lo5QvzQlIXyzOXLv1AcMdD6TReMHIwwsTYuU8LxjlRtwHHj57Du9a+mC86b7VhcRZhhonjKg8sPA7jcoommGmy2p4WupVN6t7DDurgTDexrsaYcHFloO+cUQlVMuDwHgXTRoYJTrln4cHJUpwZN2wvwwr4JvTDfQcuH1U8+hhgaY58qWaxxmcTGnym/2phhWhkURCpD0ohoElPPFx7bL/kx6o6Loo13rTmWoSFuBtGCUV35IvAuVYRX5XNTCD/mMM4z2c/nslpY3WnodLIiUcNvUM9R3QvQl796cpvNidesFH5aNDIK8x9PaBcBSahQmZqk4tLcJPoLOXmPK371VmGAwgMe8myDWr6e1NEX6vATBQnIm8d1IXgYnEnb8PukeVejiEoAuDlQHdlwTuoY5x2Xum+6e+Bq5XprshDRQpyi0/Bkuqx8EKHweUyMZExsSHf X-OriginatorOrg: outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: d2b84ea7-6030-4497-7f5b-08da968b0d24 X-MS-Exchange-CrossTenant-AuthSource: GV1P250MB0737.EURP250.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 14 Sep 2022 19:55:19.3337 (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: DB4P250MB0927 Subject: [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 Cc: Andreas Rheinhardt Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: A4vAoviBvmrL 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);