From patchwork Wed Mar 6 12:48:16 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Schwab X-Patchwork-Id: 86869 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 7C4AD385803E for ; Wed, 6 Mar 2024 12:49:17 +0000 (GMT) X-Original-To: libc-alpha@sourceware.org Delivered-To: libc-alpha@sourceware.org Received: from smtp-out1.suse.de (smtp-out1.suse.de [195.135.223.130]) by sourceware.org (Postfix) with ESMTPS id 166D63858C3A for ; Wed, 6 Mar 2024 12:48:49 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 166D63858C3A Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=suse.de Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=suse.de ARC-Filter: OpenARC Filter v1.0.0 sourceware.org 166D63858C3A Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=195.135.223.130 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1709729331; cv=none; b=H+rinP74ANY18sYrxvpoGtYogwdZ1207rjTFvV2HvA13OdmgzXv8k6pEiKDbE9wlJGMPobRhdA+olyZEiNW8ru0OWF9pI+r8b9RZ/j3vQ4DYfi9o8JIn1FQ46cPeXRLFlsF0/G4mphrT85LbKGZYqA3XKiIQ3ginVj799eVO/rg= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1709729331; c=relaxed/simple; bh=N86UPS1aPXMZS2qkZ2vF138EbClvHX56w26sym7DFZ8=; h=DKIM-Signature:DKIM-Signature:DKIM-Signature:DKIM-Signature:From: To:Subject:Date:Message-ID:MIME-Version; b=eB1c5CCUagVKh1xff6NdI2blgFuIq1u1a2k40vZBWYHJktqEHf5vLvOMGOwzd/sjNYSG9DQmiqkXqWmgH+B/ARNDUH3x5O92G+XXXBsc8m2ykwnvosLaMm+gEIwetfNm1XQwZ7Y8JSy4j1zTu78tCdZBXRBQfzmx/v64dBPERwU= ARC-Authentication-Results: i=1; server2.sourceware.org Received: from hawking.nue2.suse.org (unknown [10.168.4.11]) by smtp-out1.suse.de (Postfix) with ESMTP id B7E38222AE for ; Wed, 6 Mar 2024 12:48:46 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_rsa; t=1709729327; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version:content-type:content-type; bh=+WimBkLbK8owCKu9WiRpflSwC3JLH/DEKeqlHXsJP4w=; b=yT9mQ4s8ZICX7wBYVAjgjMbWpXmvvkjXgseiamEbp87vj0+FmdjSL0nMeuptDO4TIvTQ/B 6TZKEdonJbd/hBIu8aK239VG/Ui8cWqarQxuFTzSphd3A8Ev/WjvakIR/IrNcQj5f+lVph L7yRANf3QALs7/pVQqDnkZO6DTFqx1c= DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_ed25519; t=1709729327; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version:content-type:content-type; bh=+WimBkLbK8owCKu9WiRpflSwC3JLH/DEKeqlHXsJP4w=; b=FbTdwbSeSA/gbkHwnH4ddLLXSwQvtT52dIVyGb4VnhNjhqSZxHBtVhMRhNJPi6CKhBvsV8 UUEpZM6JGPx6znBQ== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_rsa; t=1709729326; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version:content-type:content-type; bh=+WimBkLbK8owCKu9WiRpflSwC3JLH/DEKeqlHXsJP4w=; b=mKTVLlRfB2DstQjsD0xSrB3T5kj3CvqAEvYYPDCfGPTLJ1FgPixw0XjuHGTN7PIxKIgSlW moEOsM8u3ApS2shixkXrMprTvwvZsIAICNlC2b7ghg05vgT0MPket0BOjQ/7xeHIX6ZSAH 6EkNjmcuJV8HIUIgh7HyiIPJqiAgOEM= DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_ed25519; t=1709729326; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version:content-type:content-type; bh=+WimBkLbK8owCKu9WiRpflSwC3JLH/DEKeqlHXsJP4w=; b=2jyP3Xa4mbv1jE3yWn3ap2w6E8R8EvcTlJGPxOvBiDykcopNtW6Fx02BYtzsm5YFfWYmGP iYQd/UBZr9KN+DAA== Received: by hawking.nue2.suse.org (Postfix, from userid 17005) id A05924AACD7; Wed, 6 Mar 2024 13:48:16 +0100 (CET) From: Andreas Schwab To: libc-alpha@sourceware.org Subject: [PATCH] duplocale: protect use of global locale (bug 23970) X-Yow: ..Am I in a SOAP OPERA?? Date: Wed, 06 Mar 2024 13:48:16 +0100 Message-ID: User-Agent: Gnus/5.13 (Gnus v5.13) MIME-Version: 1.0 Authentication-Results: smtp-out1.suse.de; none X-Spamd-Result: default: False [-0.35 / 50.00]; ARC_NA(0.00)[]; FROM_HAS_DN(0.00)[]; TO_MATCH_ENVRCPT_ALL(0.00)[]; MIME_GOOD(-0.10)[text/plain]; TO_DN_NONE(0.00)[]; RCPT_COUNT_ONE(0.00)[1]; DKIM_SIGNED(0.00)[suse.de:s=susede2_rsa,suse.de:s=susede2_ed25519]; DBL_BLOCKED_OPENRESOLVER(0.00)[suse.de:email]; FUZZY_BLOCKED(0.00)[rspamd.com]; RCVD_COUNT_ZERO(0.00)[0]; FROM_EQ_ENVFROM(0.00)[]; MIME_TRACE(0.00)[0:+]; MID_RHS_MATCH_FROM(0.00)[]; BAYES_HAM(-0.25)[73.42%] X-Spam-Level: X-Spam-Score: -0.35 X-Spam-Status: No, score=-9.2 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, SPF_HELO_NONE, SPF_PASS, TXREP, T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.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 Protect the global locale from being modified while we compute the size of the locale category names. That allows the use of the global locale in a single thread, while all other threads use the thread safe locale functions. Reviewed-by: Carlos O'Donell --- locale/duplocale.c | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/locale/duplocale.c b/locale/duplocale.c index a755ac5c36..bad476700f 100644 --- a/locale/duplocale.c +++ b/locale/duplocale.c @@ -43,6 +43,11 @@ __duplocale (locale_t dataset) int cnt; size_t names_len = 0; + /* If dataset points to _nl_global_locale, we need to prevent other + threads from modifying it. We also modify global data below (the + usage counts). */ + __libc_rwlock_wrlock (__libc_setlocale_lock); + /* Calculate the total space we need to store all the names. */ for (cnt = 0; cnt < __LC_LAST; ++cnt) if (cnt != LC_ALL && dataset->__names[cnt] != _nl_C_name) @@ -55,9 +60,6 @@ __duplocale (locale_t dataset) { char *namep = (char *) (result + 1); - /* We modify global data (the usage counts). */ - __libc_rwlock_wrlock (__libc_setlocale_lock); - for (cnt = 0; cnt < __LC_LAST; ++cnt) if (cnt != LC_ALL) { @@ -78,11 +80,11 @@ __duplocale (locale_t dataset) result->__ctype_b = dataset->__ctype_b; result->__ctype_tolower = dataset->__ctype_tolower; result->__ctype_toupper = dataset->__ctype_toupper; - - /* It's done. */ - __libc_rwlock_unlock (__libc_setlocale_lock); } + /* It's done. */ + __libc_rwlock_unlock (__libc_setlocale_lock); + return result; } weak_alias (__duplocale, duplocale)