From patchwork Thu Aug 12 19:24:59 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mathieu Desnoyers X-Patchwork-Id: 1516424 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=sourceware.org (client-ip=8.43.85.97; helo=sourceware.org; envelope-from=libc-alpha-bounces+incoming=patchwork.ozlabs.org@sourceware.org; receiver=) Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; secure) header.d=sourceware.org header.i=@sourceware.org header.a=rsa-sha256 header.s=default header.b=hSFukvfF; dkim-atps=neutral Received: from sourceware.org (ip-8-43-85-97.sourceware.org [8.43.85.97]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 4GlxVl03hxz9sRf for ; Fri, 13 Aug 2021 05:25:51 +1000 (AEST) Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id AFF7E385743B for ; Thu, 12 Aug 2021 19:25:48 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org AFF7E385743B DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1628796348; bh=lwX8jIcpS/oxWctBXSmfIaGMDzeJbH2Oz1lcLOYa3hA=; h=To:Subject:Date:List-Id:List-Unsubscribe:List-Archive:List-Post: List-Help:List-Subscribe:From:Reply-To:Cc:From; b=hSFukvfFq3JRSZO5jyp8JJ6/1RPXhxVw9W8U1KujEM26cviHD0j8jke+Na/5Rmjj/ X3R9uw7FsDSnYUOtsRkuv3swhPZf1Zgjl4nBKRiu1p/r5/n9IKMAw1Ai6/v5MN0CQ2 JBFiLohqhlgwrl72ITbXRWzslUKQrtbwErZXHSck= X-Original-To: libc-alpha@sourceware.org Delivered-To: libc-alpha@sourceware.org Received: from mail.efficios.com (mail.efficios.com [167.114.26.124]) by sourceware.org (Postfix) with ESMTPS id D3FB739B9C3F for ; Thu, 12 Aug 2021 19:25:06 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org D3FB739B9C3F Received: from localhost (localhost [127.0.0.1]) by mail.efficios.com (Postfix) with ESMTP id 3E4A335D3E1; Thu, 12 Aug 2021 15:25:06 -0400 (EDT) Received: from mail.efficios.com ([127.0.0.1]) by localhost (mail03.efficios.com [127.0.0.1]) (amavisd-new, port 10032) with ESMTP id MaTPFgXX2Omp; Thu, 12 Aug 2021 15:25:05 -0400 (EDT) Received: from localhost (localhost [127.0.0.1]) by mail.efficios.com (Postfix) with ESMTP id 3B31535D3DF; Thu, 12 Aug 2021 15:25:05 -0400 (EDT) DKIM-Filter: OpenDKIM Filter v2.10.3 mail.efficios.com 3B31535D3DF X-Virus-Scanned: amavisd-new at efficios.com Received: from mail.efficios.com ([127.0.0.1]) by localhost (mail03.efficios.com [127.0.0.1]) (amavisd-new, port 10026) with ESMTP id WeshQHrjTSQU; Thu, 12 Aug 2021 15:25:05 -0400 (EDT) Received: from localhost.localdomain (173-246-27-5.qc.cable.ebox.net [173.246.27.5]) by mail.efficios.com (Postfix) with ESMTPSA id 124F835D5DA; Thu, 12 Aug 2021 15:25:05 -0400 (EDT) To: libc-alpha@sourceware.org, francis.deslauriers@efficios.com Subject: [RFC PATCH] Fix: intl: use nestable locking for reentrancy Date: Thu, 12 Aug 2021 15:24:59 -0400 Message-Id: <20210812192459.22129-1-mathieu.desnoyers@efficios.com> X-Mailer: git-send-email 2.17.1 X-Spam-Status: No, score=-13.3 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, KAM_SHORT, SPF_HELO_NONE, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.4 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on server2.sourceware.org X-BeenThere: libc-alpha@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Libc-alpha mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-Patchwork-Original-From: Mathieu Desnoyers via Libc-alpha From: Mathieu Desnoyers Reply-To: Mathieu Desnoyers Cc: Mathieu Desnoyers Errors-To: libc-alpha-bounces+incoming=patchwork.ozlabs.org@sourceware.org Sender: "Libc-alpha" malloc interposers calling failing dl API (e.g. dlopen/dlsym) end up calling i18n translation. It can corrupt the i18n locking state when malloc is called internally from within i18n code with i18n locking held. This is an issue for libasan in gcc 8, 9, 10, 11. This patch applies on top of glibc 2.31. This rather crude patch is provided as RFC only: I'm not sure whether we want to convert all intl locks to recursive locks, and whether a non-rw recursive lock is appropriate. Link: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=90589 Signed-off-by: Mathieu Desnoyers --- intl/bindtextdom.c | 6 +++--- intl/dcigettext.c | 8 ++++---- intl/finddomain.c | 8 ++++---- intl/gettextP.h | 2 +- intl/loadmsgcat.c | 6 +++--- intl/textdomain.c | 6 +++--- 6 files changed, 18 insertions(+), 18 deletions(-) diff --git a/intl/bindtextdom.c b/intl/bindtextdom.c index 964d9012a1..06d1ea38d9 100644 --- a/intl/bindtextdom.c +++ b/intl/bindtextdom.c @@ -32,9 +32,9 @@ /* Handle multi-threaded applications. */ #ifdef _LIBC # include -# define gl_rwlock_define __libc_rwlock_define -# define gl_rwlock_wrlock __libc_rwlock_wrlock -# define gl_rwlock_unlock __libc_rwlock_unlock +# define gl_rwlock_rdlock __libc_lock_lock_recursive +# define gl_rwlock_wrlock __libc_lock_lock_recursive +# define gl_rwlock_unlock __libc_lock_unlock_recursive #else # include "lock.h" #endif diff --git a/intl/dcigettext.c b/intl/dcigettext.c index bd332e71da..24e07008e9 100644 --- a/intl/dcigettext.c +++ b/intl/dcigettext.c @@ -105,10 +105,10 @@ extern int errno; /* Handle multi-threaded applications. */ #ifdef _LIBC # include -# define gl_rwlock_define_initialized __libc_rwlock_define_initialized -# define gl_rwlock_rdlock __libc_rwlock_rdlock -# define gl_rwlock_wrlock __libc_rwlock_wrlock -# define gl_rwlock_unlock __libc_rwlock_unlock +# define gl_rwlock_define_initialized __libc_lock_define_initialized_recursive +# define gl_rwlock_rdlock __libc_lock_lock_recursive +# define gl_rwlock_wrlock __libc_lock_lock_recursive +# define gl_rwlock_unlock __libc_lock_unlock_recursive #else # include "lock.h" #endif diff --git a/intl/finddomain.c b/intl/finddomain.c index f88cb89ba0..3fb96ea17f 100644 --- a/intl/finddomain.c +++ b/intl/finddomain.c @@ -38,10 +38,10 @@ /* Handle multi-threaded applications. */ #ifdef _LIBC # include -# define gl_rwlock_define_initialized __libc_rwlock_define_initialized -# define gl_rwlock_rdlock __libc_rwlock_rdlock -# define gl_rwlock_wrlock __libc_rwlock_wrlock -# define gl_rwlock_unlock __libc_rwlock_unlock +# define gl_rwlock_define_initialized __libc_lock_define_initialized_recursive +# define gl_rwlock_rdlock __libc_lock_lock_recursive +# define gl_rwlock_wrlock __libc_lock_lock_recursive +# define gl_rwlock_unlock __libc_lock_unlock_recursive #else # include "lock.h" #endif diff --git a/intl/gettextP.h b/intl/gettextP.h index 5faee93bcc..bc81affb40 100644 --- a/intl/gettextP.h +++ b/intl/gettextP.h @@ -31,7 +31,7 @@ /* Handle multi-threaded applications. */ #ifdef _LIBC # include -# define gl_rwlock_define __libc_rwlock_define +# define gl_rwlock_define __libc_lock_define_recursive #else # include "lock.h" #endif diff --git a/intl/loadmsgcat.c b/intl/loadmsgcat.c index 91c1ef156a..257c910d6d 100644 --- a/intl/loadmsgcat.c +++ b/intl/loadmsgcat.c @@ -1250,7 +1250,7 @@ _nl_load_domain (struct loaded_l10nfile *domain_file, domain->conversions = NULL; domain->nconversions = 0; #ifdef _LIBC - __libc_rwlock_init (domain->conversions_lock); + __libc_lock_init_recursive (domain->conversions_lock); #else gl_rwlock_init (domain->conversions_lock); #endif @@ -1265,7 +1265,7 @@ _nl_load_domain (struct loaded_l10nfile *domain_file, if (__builtin_expect (nullentry == (char *) -1, 0)) { #ifdef _LIBC - __libc_rwlock_fini (domain->conversions_lock); + __libc_lock_fini_recursive (domain->conversions_lock); #endif goto invalid; } @@ -1303,7 +1303,7 @@ _nl_unload_domain (struct loaded_domain *domain) __gconv_close (convd->conv); } free (domain->conversions); - __libc_rwlock_fini (domain->conversions_lock); + __libc_lock_fini_recursive (domain->conversions_lock); free (domain->malloced); diff --git a/intl/textdomain.c b/intl/textdomain.c index b0b67230aa..038fe6d0df 100644 --- a/intl/textdomain.c +++ b/intl/textdomain.c @@ -31,9 +31,9 @@ /* Handle multi-threaded applications. */ #ifdef _LIBC # include -# define gl_rwlock_define __libc_rwlock_define -# define gl_rwlock_wrlock __libc_rwlock_wrlock -# define gl_rwlock_unlock __libc_rwlock_unlock +# define gl_rwlock_rdlock __libc_lock_lock_recursive +# define gl_rwlock_wrlock __libc_lock_lock_recursive +# define gl_rwlock_unlock __libc_lock_unlock_recursive #else # include "lock.h" #endif