From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-lj1-x236.google.com (mail-lj1-x236.google.com [IPv6:2a00:1450:4864:20::236]) by sourceware.org (Postfix) with ESMTPS id 278E33858D37 for ; Thu, 20 Apr 2023 18:42:50 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 278E33858D37 Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=gmail.com Received: by mail-lj1-x236.google.com with SMTP id c3so3870739ljf.7 for ; Thu, 20 Apr 2023 11:42:50 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20221208; t=1682016167; x=1684608167; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:from:to:cc:subject:date:message-id:reply-to; bh=Zb6BD4STXaO2v8RknRj5erWdyh9BVQK7meMH7HBBpU8=; b=ZZ0dcjJLVDZt99CKHyR5ygKwRoKTemOgv6BaKqEkooPn/WGYAiexq3VJRRMVMgodt7 4ttr8/IEHLdL229TwzWiMFcb+iz6trKkcERcesMmXFp8xdVbomI/HC0wRhnhewC3rU7m ZJajh1qZiAmjjbKzfN4u8HGArQ3OScCyefbCF2wVCA+QCKRwSPyWDW+6qoj6spUwdtRe mGLki1jYbeoFLhbwOx3a/HrQV1N4FRGC89ZU3F1aHQ9a0eXtzzJtpg0nYEI8xMS7MGyN 0AIT9WIkdHpyaM3Eq+kMz79RtaKTUh+k5OfGonHXWSqkZrMNssIdQICMhB2LQv/GXbBT Hfkw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1682016167; x=1684608167; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=Zb6BD4STXaO2v8RknRj5erWdyh9BVQK7meMH7HBBpU8=; b=finy6EAB/83ehmuetBSIZ4P7ykzNx6tqTUkntGpYTVMHbRTRdGvtqmCWgdwrGxU7mC m0YQ/mPh8yfxMO+1ru+a7J3sj77GXuKSwsP0d5jWTU3WDGQyTuqxK3iHPMI10+Epw86E vYRy6LkXYWID28Cn+ynELmi3436JDb1YBCf9jCS4riNO/MXLfAP+Xb5/3wgnKIz7IqdT L87z9WCVI98NqLJR71lwUT+eONQPXcQmqzYKPjMhJqHjumh4AG/i1UNQF/WtGUfA5nqC PyAOpavnRt3HTJR3T9+eNvYBWUtcTp3GuiGYcYPmiJ+ZgJzInY2YFrqzOYWfzstlVV6U O4+Q== X-Gm-Message-State: AAQBX9dy+tsivFDrH62OJNFOjBxgGnhdEsGItzSsf6XiIIqoYS4wMopJ 3ZQm2F7mLJK8SCXpseTs+yGDsWCMw+w= X-Google-Smtp-Source: AKy350aDmK5tfEdv+VE6lY88BUX3NZRDIxQ6UCgPM8Z9jYtsIzkGllue5PutXQOVzn7JzOntM5zU4w== X-Received: by 2002:a2e:8947:0:b0:2a8:c1a8:7760 with SMTP id b7-20020a2e8947000000b002a8c1a87760mr718793ljk.30.1682016167079; Thu, 20 Apr 2023 11:42:47 -0700 (PDT) Received: from surface-pro-6.. ([194.190.106.50]) by smtp.gmail.com with ESMTPSA id w4-20020ac25d44000000b004eb0c51780bsm304675lfd.29.2023.04.20.11.42.45 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 20 Apr 2023 11:42:46 -0700 (PDT) From: Sergey Bugaev To: libc-alpha@sourceware.org Cc: bug-hurd@gnu.org, Samuel Thibault , Luca , Sergey Bugaev Subject: [PATCH 1/2] hurd: Don't migrate reply port into __init1_tcbhead Date: Thu, 20 Apr 2023 21:42:19 +0300 Message-Id: <20230420184220.300862-1-bugaevc@gmail.com> X-Mailer: git-send-email 2.40.0 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-11.1 required=5.0 tests=BAYES_00,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,FREEMAIL_FROM,GIT_PATCH_0,RCVD_IN_DNSWL_NONE,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 List-Id: Properly differentiate between setting up the real TLS with TLS_INIT_TP, and setting up the early TLS (__init1_tcbhead) in static builds. In the latter case, don't yet migrate the reply port into the TCB, and don't yet set __libc_tls_initialized to 1. This also lets us move the __init1_desc assignment inside _hurd_tls_init (). Fixes cd019ddd892e182277fadd6aedccc57fa3923c8d "hurd: Don't leak __hurd_reply_port0" Signed-off-by: Sergey Bugaev --- sysdeps/mach/hurd/i386/tls.h | 18 ++++++++++++------ sysdeps/mach/hurd/x86/init-first.c | 7 +------ sysdeps/mach/hurd/x86_64/tls.h | 11 ++++++----- 3 files changed, 19 insertions(+), 17 deletions(-) diff --git a/sysdeps/mach/hurd/i386/tls.h b/sysdeps/mach/hurd/i386/tls.h index 0ac8917a..e124fb10 100644 --- a/sysdeps/mach/hurd/i386/tls.h +++ b/sysdeps/mach/hurd/i386/tls.h @@ -136,7 +136,7 @@ __LIBC_NO_TLS (void) special attention since 'errno' is not yet available and if the operation can cause a failure 'errno' must not be touched. */ static inline bool __attribute__ ((unused)) -_hurd_tls_init (tcbhead_t *tcb) +_hurd_tls_init (tcbhead_t *tcb, bool full) { HURD_TLS_DESC_DECL (desc, tcb); thread_t self = __mach_thread_self (); @@ -148,8 +148,9 @@ _hurd_tls_init (tcbhead_t *tcb) tcb->tcb = tcb; /* We always at least start the sigthread anyway. */ tcb->multiple_threads = 1; - /* Take over the reply port we've been using. */ - tcb->reply_port = __hurd_reply_port0; + if (full) + /* Take over the reply port we've been using. */ + tcb->reply_port = __hurd_reply_port0; /* Get the first available selector. */ int sel = -1; @@ -175,15 +176,20 @@ _hurd_tls_init (tcbhead_t *tcb) /* Now install the new selector. */ asm volatile ("mov %w0, %%gs" :: "q" (sel)); - /* This port is now owned by the TCB. */ - __hurd_reply_port0 = MACH_PORT_NULL; + if (full) + /* This port is now owned by the TCB. */ + __hurd_reply_port0 = MACH_PORT_NULL; +#ifndef SHARED + else + __init1_desc = sel; +#endif out: __mach_port_deallocate (__mach_task_self (), self); return success; } -# define TLS_INIT_TP(descr) _hurd_tls_init ((tcbhead_t *) (descr)) +# define TLS_INIT_TP(descr) _hurd_tls_init ((tcbhead_t *) (descr), 1) #else /* defined (SHARED) && !IS_IN (rtld) */ # define __LIBC_NO_TLS() 0 #endif diff --git a/sysdeps/mach/hurd/x86/init-first.c b/sysdeps/mach/hurd/x86/init-first.c index 89a5f44c..d74a3c86 100644 --- a/sysdeps/mach/hurd/x86/init-first.c +++ b/sysdeps/mach/hurd/x86/init-first.c @@ -156,12 +156,7 @@ first_init (void) #ifndef SHARED /* In the static case, we need to set up TLS early so that the stack protection guard can be read at gs:0x14 by the gcc-generated snippets. */ - _hurd_tls_init (&__init1_tcbhead); - - /* Make sure __LIBC_NO_TLS () keeps evaluating to 1. */ -# ifndef __x86_64__ - asm ("movw %%gs,%w0" : "=m" (__init1_desc)); -# endif + _hurd_tls_init (&__init1_tcbhead, 0); #endif RUN_RELHOOK (_hurd_preinit_hook, ()); diff --git a/sysdeps/mach/hurd/x86_64/tls.h b/sysdeps/mach/hurd/x86_64/tls.h index 2b7135f6..1274723a 100644 --- a/sysdeps/mach/hurd/x86_64/tls.h +++ b/sysdeps/mach/hurd/x86_64/tls.h @@ -173,7 +173,7 @@ extern unsigned char __libc_tls_initialized; # define __LIBC_NO_TLS() __builtin_expect (!__libc_tls_initialized, 0) static inline bool __attribute__ ((unused)) -_hurd_tls_init (tcbhead_t *tcb) +_hurd_tls_init (tcbhead_t *tcb, bool full) { error_t err; thread_t self = __mach_thread_self (); @@ -181,11 +181,12 @@ _hurd_tls_init (tcbhead_t *tcb) /* We always at least start the sigthread anyway. */ tcb->multiple_threads = 1; - /* Take over the reply port we've been using. */ - tcb->reply_port = __hurd_reply_port0; + if (full) + /* Take over the reply port we've been using. */ + tcb->reply_port = __hurd_reply_port0; err = _hurd_tls_new (self, tcb); - if (err == 0) + if (err == 0 && full) { __libc_tls_initialized = 1; /* This port is now owned by the TCB. */ @@ -195,7 +196,7 @@ _hurd_tls_init (tcbhead_t *tcb) return err == 0; } -# define TLS_INIT_TP(descr) _hurd_tls_init ((tcbhead_t *) (descr)) +# define TLS_INIT_TP(descr) _hurd_tls_init ((tcbhead_t *) (descr), 1) # else /* defined (SHARED) && !IS_IN (rtld) */ # define __LIBC_NO_TLS() 0 # endif -- 2.40.0