From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-out.m-online.net (mail-out.m-online.net [212.18.0.10]) by sourceware.org (Postfix) with ESMTPS id 542233858C2C for ; Wed, 2 Feb 2022 14:31:55 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 542233858C2C Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=linux-m68k.org Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=nefkom.net Received: from frontend01.mail.m-online.net (unknown [192.168.8.182]) by mail-out.m-online.net (Postfix) with ESMTP id 4JpklG10DTz1tjc8; Wed, 2 Feb 2022 15:31:53 +0100 (CET) Received: from localhost (dynscan1.mnet-online.de [192.168.6.70]) by mail.m-online.net (Postfix) with ESMTP id 4JpklF6jXhz1qqkB; Wed, 2 Feb 2022 15:31:53 +0100 (CET) X-Virus-Scanned: amavisd-new at mnet-online.de Received: from mail.mnet-online.de ([192.168.8.182]) by localhost (dynscan1.mail.m-online.net [192.168.6.70]) (amavisd-new, port 10024) with ESMTP id xRAbAwmpkbPS; Wed, 2 Feb 2022 15:31:53 +0100 (CET) X-Auth-Info: derhGVnpl81ig1S4/txzIgA+mYcNPr4hzVtagZAa2WyZgRFSJyYPoq05NaKkvKBg Received: from igel.home (ppp-46-244-180-141.dynamic.mnet-online.de [46.244.180.141]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.mnet-online.de (Postfix) with ESMTPSA; Wed, 2 Feb 2022 15:31:53 +0100 (CET) Received: by igel.home (Postfix, from userid 1000) id 86B5C2C380D; Wed, 2 Feb 2022 15:31:51 +0100 (CET) From: Andreas Schwab To: Szabolcs Nagy via Libc-alpha Cc: Szabolcs Nagy Subject: Re: [PATCH v4] elf: Avoid deadlock between pthread_create and ctors [BZ #28357] References: <20211001163326.3423517-1-szabolcs.nagy@arm.com> X-Yow: In Newark the laundromats are open 24 hours a day! Date: Wed, 02 Feb 2022 15:31:51 +0100 In-Reply-To: <20211001163326.3423517-1-szabolcs.nagy@arm.com> (Szabolcs Nagy via Libc-alpha's message of "Fri, 1 Oct 2021 17:33:26 +0100") Message-ID: <87wnidjq5k.fsf@igel.home> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/28.0.91 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain X-Spam-Status: No, score=-9.5 required=5.0 tests=BAYES_00, GIT_PATCH_0, HEADER_FROM_DIFFERENT_DOMAINS, KAM_DMARC_STATUS, RCVD_IN_DNSWL_LOW, RCVD_IN_MSPIKE_H3, RCVD_IN_MSPIKE_WL, SPF_HELO_NONE, SPF_PASS, TXREP, T_SCC_BODY_TEXT_LINE 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-List-Received-Date: Wed, 02 Feb 2022 14:31:57 -0000 On Okt 01 2021, Szabolcs Nagy via Libc-alpha wrote: > diff --git a/elf/dl-open.c b/elf/dl-open.c > index 5295e931b0..6ea5dd2457 100644 > --- a/elf/dl-open.c > +++ b/elf/dl-open.c > @@ -66,6 +66,9 @@ struct dl_open_args > libc_map value in the namespace in case of a dlopen failure. */ > bool libc_already_loaded; > > + /* Set to true if the end of dl_open_worker_begin was reached. */ > + bool worker_continue; > + > /* Original parameters to the program and the current environment. */ > int argc; > char **argv; > @@ -482,7 +485,7 @@ call_dl_init (void *closure) > } > > static void > -dl_open_worker (void *a) > +dl_open_worker_begin (void *a) > { > struct dl_open_args *args = a; > const char *file = args->file; > @@ -774,6 +777,36 @@ dl_open_worker (void *a) > _dl_call_libc_early_init (libc_map, false); > } > > + args->worker_continue = true; > +} > + > +static void > +dl_open_worker (void *a) > +{ > + struct dl_open_args *args = a; > + > + args->worker_continue = false; > + > + { > + /* Protects global and module specific TLS state. */ > + __rtld_lock_lock_recursive (GL(dl_load_tls_lock)); > + > + struct dl_exception ex; > + int err = _dl_catch_exception (&ex, dl_open_worker_begin, args); > + > + __rtld_lock_unlock_recursive (GL(dl_load_tls_lock)); > + > + if (__glibc_unlikely (ex.errstring != NULL)) > + /* Reraise the error. */ > + _dl_signal_exception (err, &ex, NULL); > + } > + > + if (!args->worker_continue) > + return; Why do you need worker_continue? How can worker_continue not be set at this point? -- Andreas Schwab, schwab@linux-m68k.org GPG Key fingerprint = 7578 EB47 D4E5 4D69 2510 2552 DF73 E780 A9DA AEC1 "And now for something completely different."