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.9]) by sourceware.org (Postfix) with ESMTPS id EAF8D385BF92 for ; Wed, 2 Feb 2022 15:13:20 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org EAF8D385BF92 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 4Jplg34FdDz1r9RB; Wed, 2 Feb 2022 16:13:19 +0100 (CET) Received: from localhost (dynscan1.mnet-online.de [192.168.6.70]) by mail.m-online.net (Postfix) with ESMTP id 4Jplg344Y7z1qqkC; Wed, 2 Feb 2022 16:13:19 +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 mbxWb8hMNyjK; Wed, 2 Feb 2022 16:13:18 +0100 (CET) X-Auth-Info: T8Q1KLKBtimP2ZajcZZUbSPR5IHPd36LNi1YLedxQat7N6wyP2z5XiX5Id8SIkz8 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 16:13:18 +0100 (CET) Received: by igel.home (Postfix, from userid 1000) id 388D92C380D; Wed, 2 Feb 2022 16:13:18 +0100 (CET) From: Andreas Schwab To: Szabolcs Nagy Cc: Szabolcs Nagy via Libc-alpha Subject: Re: [PATCH v4] elf: Avoid deadlock between pthread_create and ctors [BZ #28357] References: <20211001163326.3423517-1-szabolcs.nagy@arm.com> <87wnidjq5k.fsf@igel.home> <20220202144133.GL1989194@arm.com> X-Yow: RELAX!! ... This is gonna be a HEALING EXPERIENCE!! Besides, I work for DING DONGS! Date: Wed, 02 Feb 2022 16:13:18 +0100 In-Reply-To: <20220202144133.GL1989194@arm.com> (Szabolcs Nagy's message of "Wed, 2 Feb 2022 14:41:33 +0000") Message-ID: <87sft1jo8h.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.6 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 15:13:22 -0000 On Feb 02 2022, Szabolcs Nagy wrote: > The 02/02/2022 15:31, Andreas Schwab wrote: >> 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? > > because dl_open_worker_begin (old dl_open_worker) can simply return. And what does dl_open_worker_begin do as its very last thing? -- 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."