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: 44657 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 A3F0B39B9C3C for ; Thu, 12 Aug 2021 19:25:55 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org A3F0B39B9C3C DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1628796355; 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=hQ6pqdFhLPZtq4pYTSGiHZIMBp772zO33rtIAncztRkIsOaS+kuZLavAbxitHi1Gv i/5wMPSwp4zVy4GmUXgDaSx/+Tr2bipKAQt9Zd5Ti6DBeOeajgHezkeseHbbjEpTGB xyZU586CHWnEwmcxiBY38KszgC+n9RwQboBYhJU0= 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+patchwork=sourceware.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