From patchwork Thu Mar 26 20:19:23 2026 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ruslan Valiyev X-Patchwork-Id: 132345 X-Patchwork-Delegate: arjun.is@lostca.se Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from vm01.sourceware.org (localhost [127.0.0.1]) by sourceware.org (Postfix) with ESMTP id 2DD574B9DB70 for ; Thu, 26 Mar 2026 20:19:59 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 2DD574B9DB70 Authentication-Results: sourceware.org; dkim=pass (2048-bit key, unprotected) header.d=gmail.com header.i=@gmail.com header.a=rsa-sha256 header.s=20251104 header.b=JjBSwFXA X-Original-To: libc-alpha@sourceware.org Delivered-To: libc-alpha@sourceware.org Received: from mail-wr1-x42c.google.com (mail-wr1-x42c.google.com [IPv6:2a00:1450:4864:20::42c]) by sourceware.org (Postfix) with ESMTPS id 7C85F4B9DB42 for ; Thu, 26 Mar 2026 20:19:26 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 7C85F4B9DB42 Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=gmail.com ARC-Filter: OpenARC Filter v1.0.0 sourceware.org 7C85F4B9DB42 Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=2a00:1450:4864:20::42c ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1774556366; cv=none; b=Hx1NLy6aN8Pfr1UUonPCF9mr7AI4BVURCcBPcqaxN3toX9wPG+8JE2MtBu92zdKEOaxocHfOXdit478+F9Xaci1/nc8Ua804FclHh6+1ufu3s/IsSixU8LO4aJfvxxs7MNV2da19TYDTKZQ1/K1vGpdy6tjNg+4546AdJBKPykk= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1774556366; c=relaxed/simple; bh=mwRE45MKlJb6ks1Yin54ZtskI7KLMEI1iiSZ5zGjbWk=; h=DKIM-Signature:From:To:Subject:Date:Message-ID:MIME-Version; b=vl0Lgu5wJvJEB3eKR4lUcscCucmqMyhE6N9J7e3Ex5M1j4Cu/1zyOSYK+NZJxF4LNxSbhyMLgaXK+s46n4htBCz8/wcIs/0/bGNjJydjAPQovzZAVGnx+s45cMljdBBu+sw3nJoFaS48at20S/IK5uyINcWMoFMptk1sPTXBDBA= ARC-Authentication-Results: i=1; server2.sourceware.org DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 7C85F4B9DB42 Received: by mail-wr1-x42c.google.com with SMTP id ffacd0b85a97d-439c6fc2910so927819f8f.0 for ; Thu, 26 Mar 2026 13:19:26 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1774556365; x=1775161165; darn=sourceware.org; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:from:to:cc:subject:date:message-id:reply-to; bh=wf6GeyHwagIs33yT5OC64KPl903JzRJHYy6OpqhJt2M=; b=JjBSwFXAVglJXCE1W27G10Efb+gfj8KVulZPaQzPVNZxg5VBcThdPKoh+uUshBUWEX MZIRs2KcZwyA0IlmhjWlnp2cjX28LFHm2VERqR2tg+BJfj7ICe9c8IGL8MdAWbBRc3z7 +Aaanxv4Sprc9djS2BDp3qHy268QheReXaPrRBPk0fDbzKaWXHEll+N4aHito3uTjYjs VAUdm7d7l9Hay54YrcclGctBKwuBgQ3FA01YAJoYaOIpZe9YL3bslQA1HTXDaKEQd6mi 3J/GlLvdhmH3pa0nJlOwPvWmdt6AoT64w6pDKEZYSXilAX5qZbdNTk7UoU6LXxX4z66A qs2Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1774556365; x=1775161165; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:x-gm-gg:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to; bh=wf6GeyHwagIs33yT5OC64KPl903JzRJHYy6OpqhJt2M=; b=fnEyR1p3oHi4MH66aJZPzax6LhzlTzY2r6wC3mo2gIBLJq1Lb6WSd2h+KX0my9a+px UkMXdFpxl7tmvlfDsqqpd+Fpq+AsvU2W16Pg+eYGaCGYtYFDr5q8HCO+vhYMa2QTiF99 pxpbdGuG0z98rTdINYRyUCKtArJt0phjIVbc5LG08DhmQd6Se15Zgnzz7P3KrdX9VAx0 4NsRGM97W7pY/SwsbYGaS7pGzGMuYDD03lLbT92q+knb+Arwa5uBEReKCNlBzMVwzoMM XQu0tM53YMyre2C9TtfcNEJxRB/ZAsNapoxzDI32f0amIWDNqyQ57fWuTwsrNIxuYMMX 8ZVw== X-Gm-Message-State: AOJu0Yx6IA4FJym7WnN7uIDetZs8q3pJl7iRvmuWF2gWGbkWT6/WNIsl TjAXkv8ZRwdnarMKU/qRsoUz7u08Pv8TAzC21X1oaZzm04bUDuofS2oyo1soQSAA X-Gm-Gg: ATEYQzzanv7tQZEb/Cj7+j+CM3KBg4ydVwJMlnQwEmM0t50hWsDTnjfxypTde/UbVsv qUPyvKzZLC5vflhSD2WP3cH5vktZjKeMvt0wr6sJA08ckrF3FcJE0no0EISPwMMXADwSYsc3XsI QeTH8BGZr82E6faYWA2UkSN+lmXIYZ3j3cSQp/tXJV167xpVMkG3mzSt4aqao8+Q/lsskjXmLXA WKLF+AoZ+sdrttfHbJsCcpmmEH1oyiCnF3qge24RMATaMjTnRvSqgaOiRy4aDB4QScwsCQKL8Sg PJ4iZre1BusLybwbodhDG9E1HVD3ZkgOsmgr2TtqJG2CQBd0WPKbLU3oqvhK+X3ihpLjnEkhdJo OEiondZz3ujTE3+0mnLuNajyvp62l5luep1E9iuDMAH6BEEVV3TsePlUoZjHNrQfhg8CQeN08pQ == X-Received: by 2002:a05:6000:2902:b0:439:bc2b:cb57 with SMTP id ffacd0b85a97d-43b8899d2d2mr14931813f8f.6.1774556365117; Thu, 26 Mar 2026 13:19:25 -0700 (PDT) Received: from kimsufi.. ([2001:41d0:303:6f54::1]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-43b9192e35esm9418934f8f.6.2026.03.26.13.19.24 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 26 Mar 2026 13:19:24 -0700 (PDT) From: Ruslan Valiyev To: libc-alpha@sourceware.org Cc: arjun@sourceware.org, Ruslan Valiyev Subject: [PATCH] locale: fix memory leaks in write_locales and write_charmaps Date: Thu, 26 Mar 2026 20:19:23 +0000 Message-ID: <20260326201923.3975252-1-linuxoid@gmail.com> X-Mailer: git-send-email 2.43.0 MIME-Version: 1.0 X-Spam-Status: No, score=-13.3 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, FREEMAIL_FROM, GIT_PATCH_0, RCVD_IN_DNSWL_BLOCKED, SPF_HELO_NONE, SPF_PASS, TXREP autolearn=unavailable autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on sourceware.org X-BeenThere: libc-alpha@sourceware.org X-Mailman-Version: 2.1.30 Precedence: list List-Id: Libc-alpha mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: libc-alpha-bounces~patchwork=sourceware.org@sourceware.org Fix multiple memory leaks in the locale program: 1. PUT(xstrdup(...)) leaks when tsearch finds a duplicate entry, since tsearch returns the existing node and the newly allocated string is orphaned. Introduce PUT_UNIQUE macro that checks with GET (tfind) before inserting, freeing the duplicate if it already exists. 2. String literals "POSIX" and "C" passed to PUT cannot be freed by tdestroy. Wrap them in xstrdup so tdestroy(all_data, free) is safe. 3. Add tdestroy(all_data, free) at the end of write_locales and write_charmaps to free the search trees. 4. Free dirents[cnt] entries in the scandir loop (only the dirents array pointer was freed, not individual entries). 5. Free alias_path allocated by argz_create_sep in write_locales. These leaks were reported by Arjun Shankar via GCC -fanalyzer (OpenScanHub/Fedora) and confirmed with valgrind. Resolves: BZ #33972 Signed-off-by: Ruslan Valiyev --- locale/programs/locale.c | 35 ++++++++++++++++++++++++++--------- 1 file changed, 26 insertions(+), 9 deletions(-) diff --git a/locale/programs/locale.c b/locale/programs/locale.c index 15f109f3..396821a1 100644 --- a/locale/programs/locale.c +++ b/locale/programs/locale.c @@ -429,10 +429,20 @@ write_locales (void) #define GET(name) tfind (name, &all_data, \ (int (*) (const void *, const void *)) strcoll) + /* Insert NAME into the tree, freeing it if a duplicate exists. */ +#define PUT_UNIQUE(name) \ + do {\ + char *put_name_ = (name);\ + if (GET (put_name_) != NULL)\ + free (put_name_);\ + else\ + PUT (put_name_);\ + } while (0) + /* `POSIX' locale is always available (POSIX.2 4.34.3). */ - PUT ("POSIX"); + PUT (xstrdup ("POSIX")); /* And so is the "C" locale. */ - PUT ("C"); + PUT (xstrdup ("C")); memset (linebuf, '-', sizeof (linebuf) - 1); linebuf[sizeof (linebuf) - 1] = '\0'; @@ -510,8 +520,9 @@ write_locales (void) /* If the verbose format is not selected we simply collect the names. */ - PUT (xstrdup (dirents[cnt]->d_name)); + PUT_UNIQUE (xstrdup (dirents[cnt]->d_name)); } + free (dirents[cnt]); } if (ndirents > 0) free (dirents); @@ -591,7 +602,7 @@ write_locales (void) /* Add the alias. */ if (! verbose && GET (value) != NULL) - PUT (xstrdup (alias)); + PUT_UNIQUE (xstrdup (alias)); } } @@ -610,10 +621,14 @@ write_locales (void) fclose (fp); } + free (alias_path); + if (! verbose) { twalk (all_data, print_names); } + + tdestroy (all_data, free); } @@ -669,7 +684,7 @@ write_archive_locales (void **all_datap, char *linebuf) for (cnt = 0; cnt < head->namehash_size; ++cnt) if (namehashtab[cnt].locrec_offset != 0) { - PUT (xstrdup (addr + namehashtab[cnt].name_offset)); + PUT_UNIQUE (xstrdup (addr + namehashtab[cnt].name_offset)); ++ret; } } @@ -694,7 +709,7 @@ write_archive_locales (void **all_datap, char *linebuf) { struct locrecent *locrec; - PUT (xstrdup (names[cnt].name)); + PUT_UNIQUE (xstrdup (names[cnt].name)); if (cnt) putchar_unlocked ('\n'); @@ -744,19 +759,19 @@ write_charmaps (void) char **aliases; char **p; - PUT (xstrdup (dirent)); + PUT_UNIQUE (xstrdup (dirent)); aliases = charmap_aliases (CHARMAP_PATH, dirent); #if 0 /* Add the code_set_name and the aliases. */ for (p = aliases; *p; p++) - PUT (xstrdup (*p)); + PUT_UNIQUE (xstrdup (*p)); #else /* Add the code_set_name only. Most aliases are obsolete. */ p = aliases; if (*p) - PUT (xstrdup (*p)); + PUT_UNIQUE (xstrdup (*p)); #endif charmap_free_aliases (aliases); @@ -765,6 +780,8 @@ write_charmaps (void) charmap_closedir (dir); twalk (all_data, print_names); + + tdestroy (all_data, free); } /* Print a properly quoted assignment of NAME with VAL, using double