]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
[Bug 15368] Move pthread_kill to libc and use it to implement raise. zack/wip-pthread-no-dupe-defns
authorZack Weinberg <zackw@panix.com>
Fri, 23 Mar 2018 13:16:59 +0000 (09:16 -0400)
committerZack Weinberg <zackw@panix.com>
Mon, 26 Mar 2018 12:30:46 +0000 (08:30 -0400)
The fix for bug #15368 was unnecessarily Linux-specific.  To recap,
POSIX specifies raise to be async-signal-safe, but also specifies it
to be equivalent to pthread_kill(pthread_self(), sig), which is not
an async-signal-safe sequence of operations; a signal handler could
run in between pthread_self and pthread_kill, and do something (such
as calling fork, which is also async-signal-safe) that would invalidate
the thread descriptor.  This is even true in the hypothetical case of
a port that doesn't implement multithreading: kill(getpid(), sig) will
fire the signal twice if a signal handler runs in between, calls fork,
and then returns on both sides of the fork.  I don't see anything in
the standards to forbid that.

The Linux-specific fix was to override the definitions of raise in
both libpthread and libc to the same unitary function that blocks
signals, retrieves TID and PID directly from the kernel, calls tgkill,
and only then unblocks signals.  This patch generalizes that to any
port: pthread_kill is moved from libpthread to libc, with a forwarding
stub left behind.  The definition of raise in libpthread is also
replaced with a forwarding stub.  The Linux-specific definition of
raise is deleted; those ports will now use sysdeps/pthread/raise.c,
which blocks signals first, then calls pthread_self and pthread_kill,
and then unblocks signals.  Similarly, sysdeps/posix/raise.c (which
would be used on a port that didn't implement multithreading) blocks
signals, calls getpid and kill, and then unblocks signals.  Thus,
ports need only implement the primitives correctly and do not need to
worry about making raise async-signal-safe.

The only wrinkle was that up till now, we did not bother initializing
the ->tid field of the initial thread's descriptor unless libpthread
was loaded; now that raise calls pthread_kill even in a single-
threaded environment, that won't fly.  This is abstractly easy to fix;
the tricky part was figuring out _where_ to put the calls (two of
them, as it happens) to __pthread_initialize_pids, and I'd appreciate
careful eyes on those changes.

You might be wondering why it's safe to rely on the TID in the thread
descriptor, rather than calling gettid directly.  Since all signals
are blocked from before calling pthread_self until after pthread_kill
uses the TID to call tgkill, the question is whether some _other_
thread could do something that would invalidate the calling thread's
descriptor, and I believe there is no such thing.

While I was at it I fixed another bug: raise was returning an error
code on failure (like pthread_kill does) instead of setting errno as
specified.  This is user-visible but I don't think it's worth recording
as a fixed bug, nobody bothers checking whether raise failed anyway.

* nptl/pt-raise.c
* sysdeps/unix/sysv/linux/pt-raise.c
* sysdeps/unix/sysv/linux/raise.c:
Remove file.

* sysdeps/unix/sysv/linux/pthread_kill.c: Use __is_internal_signal
to check for forbidden signals.  Use INTERNAL_SYSCALL_CALL to call
getpid.  Provide __libc_pthread_kill, with __pthread_kill as
strong alias and pthread_kill as weak alias.

* sysdeps/posix/raise.c: Block signals around the calls to
__getpid and __kill.  Provide __libc_raise, with raise as strong
alias, libc_hidden_def for raise, and gsignal as weak alias.
* sysdeps/pthread/raise.c: New file.  Implement by blocking
signals, calling pthread_self and pthread_kill, and then
unblocking signals again.  Provide same symbols as above.

* sysdeps/generic/internal-signals.h: Define all of the same
functions that sysdeps/unix/sysv/linux/internal-signals.h does,
with sensible default definitions.
* sysdeps/unix/sysv/linux/internal-signals.h: Clarify comments.

* nptl/pthread_kill.c: Define __libc_pthread_kill, with
__pthread_kill as strong alias and pthread_kill as weak alias.
* nptl/pthread_self.c: Define __pthread_self, with
pthread_self as weak alias.
* signal/raise.c: Define __libc_raise, with raise as strong alias,
libc_hidden_def for raise, and gsignal as weak alias.

* nptl/Makefile: Move pthread_kill from libpthread-routines to
routines.  Remove pt-raise from libpthread-routines.
* nptl/Versions (libc/GLIBC_2.28): Add pthread_kill.
(libc/GLIBC_PRIVATE): Add __libc_pthread_kill and __libc_raise.
* sysdeps/generic/pt-compat-stubs.S: Add stubs for raise and
pthread_kill.

* nptl/nptl-init.c (__pthread_initialize_minimal_internal):
Don't call __pthread_initialize_pids here.
* csu/libc-tls.c (__libc_setup_tls):
        Call __pthread_initialize_pids after all other setup.
* elf/rtld.c (init_tls): Likewise.

* include/pthreadP.h: New forwarder.
* include/pthread.h: Add multiple inclusion guard.  Declare
__pthread_self.
* include/signal.h: Declare __pthread_kill.

* sysdeps/**/libc.abilist (GLIBC_2.28): Add pthread_kill.

49 files changed:
csu/libc-tls.c
elf/rtld.c
include/pthread.h
include/pthreadP.h [new file with mode: 0644]
include/signal.h
nptl/Makefile
nptl/Versions
nptl/nptl-init.c
nptl/pt-raise.c [deleted file]
nptl/pthread_kill.c
nptl/pthread_self.c
signal/raise.c
sysdeps/generic/internal-signals.h
sysdeps/generic/pt-compat-stubs.S
sysdeps/mach/hurd/i386/libc.abilist
sysdeps/posix/raise.c
sysdeps/pthread/raise.c [new file with mode: 0644]
sysdeps/unix/sysv/linux/aarch64/libc.abilist
sysdeps/unix/sysv/linux/alpha/libc.abilist
sysdeps/unix/sysv/linux/arm/libc.abilist
sysdeps/unix/sysv/linux/hppa/libc.abilist
sysdeps/unix/sysv/linux/i386/libc.abilist
sysdeps/unix/sysv/linux/ia64/libc.abilist
sysdeps/unix/sysv/linux/internal-signals.h
sysdeps/unix/sysv/linux/m68k/coldfire/libc.abilist
sysdeps/unix/sysv/linux/m68k/m680x0/libc.abilist
sysdeps/unix/sysv/linux/microblaze/libc.abilist
sysdeps/unix/sysv/linux/mips/mips32/fpu/libc.abilist
sysdeps/unix/sysv/linux/mips/mips32/nofpu/libc.abilist
sysdeps/unix/sysv/linux/mips/mips64/n32/libc.abilist
sysdeps/unix/sysv/linux/mips/mips64/n64/libc.abilist
sysdeps/unix/sysv/linux/nios2/libc.abilist
sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libc.abilist
sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libc.abilist
sysdeps/unix/sysv/linux/powerpc/powerpc64/libc-le.abilist
sysdeps/unix/sysv/linux/powerpc/powerpc64/libc.abilist
sysdeps/unix/sysv/linux/pt-raise.c [deleted file]
sysdeps/unix/sysv/linux/pthread_kill.c
sysdeps/unix/sysv/linux/raise.c [deleted file]
sysdeps/unix/sysv/linux/riscv/rv64/libc.abilist
sysdeps/unix/sysv/linux/s390/s390-32/libc.abilist
sysdeps/unix/sysv/linux/s390/s390-64/libc.abilist
sysdeps/unix/sysv/linux/sh/libc.abilist
sysdeps/unix/sysv/linux/sparc/sparc32/libc.abilist
sysdeps/unix/sysv/linux/sparc/sparc64/libc.abilist
sysdeps/unix/sysv/linux/tile/tilegx32/libc.abilist
sysdeps/unix/sysv/linux/tile/tilegx64/libc.abilist
sysdeps/unix/sysv/linux/x86_64/64/libc.abilist
sysdeps/unix/sysv/linux/x86_64/x32/libc.abilist

index 28a79441cde379f7079fb2d01702308543f54ebd..91d83dfba65adfa4dabdac556a5911c328d08670 100644 (file)
@@ -23,7 +23,7 @@
 #include <unistd.h>
 #include <stdio.h>
 #include <sys/param.h>
-
+#include <pthread-pids.h>
 
 #ifdef SHARED
  #error makefile bug, this file is for static only
@@ -215,4 +215,12 @@ __libc_setup_tls (void)
 #endif
 
   init_static_tls (memsz, MAX (TLS_TCB_ALIGN, max_align));
+
+  /* Initialize only as much of the initial thread's descriptor as is
+     necessary even when libpthread is not loaded.  More will be done
+     by __pthread_initialize_minimal if libpthread is loaded.  This
+     needs to happen before anything that could possibly call raise,
+     but cannot happen before TLS is initialized.  */
+  struct pthread *pd = THREAD_SELF;
+  __pthread_initialize_pids (pd);
 }
index f8d9597cddb1c11ef830732df25ebde5f974054b..8367398e64c35a92918e0c3615553575e8fb7694 100644 (file)
@@ -41,6 +41,7 @@
 #include <tls.h>
 #include <stap-probe.h>
 #include <stackinfo.h>
+#include <pthread-pids.h>
 
 #include <assert.h>
 
@@ -741,6 +742,14 @@ cannot allocate TLS data structures for initial thread\n");
     _dl_fatal_printf ("cannot set up thread-local storage: %s\n", lossage);
   tls_init_tp_called = true;
 
+  /* Initialize only as much of the initial thread's descriptor as is
+     necessary even when libpthread is not loaded.  More will be done
+     by __pthread_initialize_minimal if libpthread is loaded.  This
+     needs to happen before anything that could possibly call raise,
+     but cannot happen before TLS is initialized.  */
+  struct pthread *pd = THREAD_SELF;
+  __pthread_initialize_pids (pd);
+
   return tcbp;
 }
 
index 858c869a1697099e125cd77775f13ba64d43870e..7bbd36ccc73a691f1db5e6574277c86820e79b90 100644 (file)
@@ -1,3 +1,5 @@
+#ifndef _INCLUDE_PTHREAD_H
+#define _INCLUDE_PTHREAD_H 1
 #include_next <pthread.h>
 
 #ifndef _ISOMAC
@@ -11,6 +13,9 @@ extern int __pthread_barrier_init (pthread_barrier_t *__restrict __barrier,
 extern int __pthread_barrier_wait (pthread_barrier_t *__barrier)
      __THROWNL __nonnull ((1));
 
+extern pthread_t __pthread_self (void) __THROW attribute_hidden;
+
 /* This function is called to initialize the pthread library.  */
 extern void __pthread_initialize (void) __attribute__ ((weak));
 #endif
+#endif
diff --git a/include/pthreadP.h b/include/pthreadP.h
new file mode 100644 (file)
index 0000000..651d94a
--- /dev/null
@@ -0,0 +1 @@
+#include <nptl/pthreadP.h>
index 293258ad65d6fda3133963bf21931d8e94ef045d..d48113fcd74772834cff86097c50a1d7a75bd797 100644 (file)
@@ -59,5 +59,7 @@ extern __typeof (__sigaction) __sigaction attribute_hidden;
 extern __typeof (__libc_sigaction) __libc_sigaction attribute_hidden;
 #  endif
 
+extern typeof (pthread_kill) __pthread_kill attribute_hidden;
+
 # endif /* _ISOMAC */
 #endif /* signal.h */
index 167f2cc24bd46cdb2daaf17388a1eaa4013afb29..bf31da0ee52c5488e0314e70b1d2ba91b7ed90ed 100644 (file)
@@ -29,7 +29,7 @@ extra-libs-others := $(extra-libs)
 
 routines = alloca_cutoff forward libc-lowlevellock libc-cancellation \
           libc-cleanup libc_pthread_init libc_multiple_threads \
-          register-atfork pthread_atfork pthread_self
+          register-atfork pthread_atfork pthread_self pthread_kill
 shared-only-routines = forward
 static-only-routines = pthread_atfork
 
@@ -90,7 +90,7 @@ libpthread-routines = nptl-init vars events version pt-interp \
                      pthread_barrierattr_setpshared \
                      pthread_key_create pthread_key_delete \
                      pthread_getspecific pthread_setspecific \
-                     pthread_sigmask pthread_kill pthread_sigqueue \
+                     pthread_sigmask pthread_sigqueue \
                      pthread_cancel pthread_testcancel \
                      pthread_setcancelstate pthread_setcanceltype \
                      pthread_once \
@@ -108,7 +108,6 @@ libpthread-routines = nptl-init vars events version pt-interp \
                      cancellation \
                      lowlevellock \
                      lll_timedlock_wait lll_timedwait_tid \
-                     pt-raise \
                      pt-compat-stubs \
                      flockfile ftrylockfile funlockfile \
                      sigaction \
index 0ae5def464b9c8a77bb79895f37c43e3e3226f29..18c96e851c9c6ca381c0f9af2c6974a7fe963a74 100644 (file)
@@ -28,6 +28,9 @@ libc {
     pthread_cond_wait; pthread_cond_signal;
     pthread_cond_broadcast; pthread_cond_timedwait;
   }
+  GLIBC_2.28 {
+    pthread_kill;
+  }
   GLIBC_PRIVATE {
     __libc_alloca_cutoff;
     # Internal libc interface to libpthread
@@ -36,6 +39,9 @@ libc {
     __libc_pthread_init;
     __libc_current_sigrtmin_private; __libc_current_sigrtmax_private;
     __libc_allocate_rtsig_private;
+    # Used by compat stubs
+    __libc_pthread_kill;
+    __libc_raise;
   }
 }
 
index 5a4b52419f1feaec95fe1424fbf99e7f1c34a5fc..77fa9d9cdede136af4ff5b0c18e0b2f279955fce 100644 (file)
@@ -37,7 +37,6 @@
 #include <futex-internal.h>
 #include <kernel-features.h>
 #include <libc-pointer-arith.h>
-#include <pthread-pids.h>
 
 #ifndef TLS_MULTIPLE_THREADS_IN_TCB
 /* Pointer to the corresponding variable in libc.  */
@@ -283,9 +282,9 @@ static bool __nptl_initial_report_events __attribute_used__;
 void
 __pthread_initialize_minimal_internal (void)
 {
-  /* Minimal initialization of the thread descriptor.  */
+  /* Minimal initialization of the thread descriptor.
+     pd->tid was set during TLS initialization.  */
   struct pthread *pd = THREAD_SELF;
-  __pthread_initialize_pids (pd);
   THREAD_SETMEM (pd, specific[0], &pd->specific_1stblock[0]);
   THREAD_SETMEM (pd, user_stack, true);
   if (LLL_LOCK_INITIALIZER != 0)
diff --git a/nptl/pt-raise.c b/nptl/pt-raise.c
deleted file mode 100644 (file)
index c4d3893..0000000
+++ /dev/null
@@ -1,29 +0,0 @@
-/* ISO C raise function for libpthread.
-   Copyright (C) 2002-2018 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-   Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
-   <http://www.gnu.org/licenses/>.  */
-
-#include <pthread.h>
-#include <signal.h>
-
-
-int
-raise (int sig)
-{
-  /* This is what POSIX says must happen.  */
-  return pthread_kill (pthread_self (), sig);
-}
index bbe57d18c6f63fa54682624e35db7650792bdf9e..c682a422d1725e8eff9499f507b9d4d852f352b5 100644 (file)
@@ -22,7 +22,7 @@
 
 
 int
-__pthread_kill (pthread_t threadid, int signo)
+__libc_pthread_kill (pthread_t threadid, int signo)
 {
   struct pthread *pd = (struct pthread *) threadid;
 
@@ -33,6 +33,7 @@ __pthread_kill (pthread_t threadid, int signo)
 
   return ENOSYS;
 }
-strong_alias (__pthread_kill, pthread_kill)
+strong_alias (__libc_pthread_kill, __pthread_kill)
+weak_alias (__libc_pthread_kill, pthread_kill)
 
 stub_warning (pthread_kill)
index ae173c4661ba746a4a2e031f3b9b155ada157133..bcf32068ea41d5cc9f311b10f7bb7f0df8883137 100644 (file)
@@ -20,7 +20,8 @@
 #include <tls.h>
 
 pthread_t
-pthread_self (void)
+__pthread_self (void)
 {
   return (pthread_t) THREAD_SELF;
 }
+weak_alias (__pthread_self, pthread_self)
index 2590adac4f17e16a8234d09e014880ffe5e31cd8..fb695277b3ea736aa5a88bf61c040fad09c72e7e 100644 (file)
 
 /* Raise the signal SIG.  */
 int
-raise (int sig)
+__libc_raise (int sig)
 {
   __set_errno (ENOSYS);
   return -1;
 }
-weak_alias (raise, gsignal)
+strong_alias (__libc_raise, raise)
+libc_hidden_def (raise)
+weak_alias (__libc_raise, gsignal)
 
 stub_warning (raise)
 stub_warning (gsignal)
index 01e5b75b6b15faa4bd1fa46bd4807b6ec9880e3b..1bae0fd87525855e94cfaa9e4ac75750bb2b3758 100644 (file)
@@ -1,4 +1,4 @@
-/* Special use of signals internally.  Stub version.
+/* Special use of signals internally.  Generic version.
    Copyright (C) 2014-2018 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
    You should have received a copy of the GNU Lesser General Public
    License along with the GNU C Library; if not, see
    <http://www.gnu.org/licenses/>.  */
+
+#ifndef __INTERNAL_SIGNALS_H
+# define __INTERNAL_SIGNALS_H
+
+#include <signal.h>
+#include <sigsetops.h>
+
+/* Return whether sig is used internally.  */
+static inline int
+__is_internal_signal (int sig)
+{
+  return 0;
+}
+
+/* Remove internal glibc signals from the mask.  */
+static inline void
+__clear_internal_signals (sigset_t *set)
+{
+}
+
+/* Block all signals, including internal glibc ones; write the previous
+   signal mask to SET.  */
+static inline int
+__libc_signal_block_all (sigset_t *set)
+{
+  sigset_t allset;
+  __sigfillset (&allset);
+  return __sigprocmask (SIG_BLOCK, &allset, set);
+}
+
+/* Block all application signals (excluding internal glibc ones); write
+   the previous signal mask to SET.  */
+static inline int
+__libc_signal_block_app (sigset_t *set)
+{
+  sigset_t allset;
+  __sigfillset (&allset);
+  __clear_internal_signals (&allset);
+  return __sigprocmask (SIG_BLOCK, &allset, set);
+}
+
+/* Restore process signal mask according to SET.  */
+static inline int
+__libc_signal_restore_set (const sigset_t *set)
+{
+  return __sigprocmask (SIG_SETMASK, set, NULL);
+}
+
+#endif
index 426689a18da156d21689bff0ddd7d2ae29ca9eb4..d9d49f6b169df81487f268f07fd64b4e28fb717e 100644 (file)
         define_stub(pause)
         compat_stub(pause, pause, GLIBC_2_0)
 
+       define_stub(raise)
+       compat_stub(raise, raise, GLIBC_2_0)
+
         define_stub(read)
         compat_stub(read, read, GLIBC_2_0)
         compat_stub(read, __read, GLIBC_2_0)
         compat_stub(write, write, GLIBC_2_0)
         compat_stub(write, __write, GLIBC_2_0)
 
+        define_stub(pthread_kill)
+        compat_stub(pthread_kill, pthread_kill, GLIBC_2_0)
+
 #endif
 
 /* The off64_t functions were added in glibc 2.2, but some architectures
index 9545e898c1f969c6d26a4513442342dd6b068f21..daf8c16aaec4cf9921821750a9cd4a1bcab4fbee 100644 (file)
@@ -2049,6 +2049,8 @@ GLIBC_2.27 wcstof64 F
 GLIBC_2.27 wcstof64_l F
 GLIBC_2.27 wcstof64x F
 GLIBC_2.27 wcstof64x_l F
+GLIBC_2.28 GLIBC_2.28 A
+GLIBC_2.28 pthread_kill F
 GLIBC_2.3 GLIBC_2.3 A
 GLIBC_2.3 __ctype_b_loc F
 GLIBC_2.3 __ctype_tolower_loc F
index 1f02b201e126104dbb6a55f8c4ff0eeb824b74b2..f171dc2407ca313f07b8d7ce1edf02460a3f01dd 100644 (file)
    License along with the GNU C Library; if not, see
    <http://www.gnu.org/licenses/>.  */
 
+#include <errno.h>
 #include <signal.h>
 #include <unistd.h>
+#include <internal-signals.h>
 
-/* Raise the signal SIG.  */
+/* Raise the signal SIG.  POSIX requires raise to be async-signal-safe,
+   but calling getpid and then raise is *not* async-signal-safe; if an
+   async signal handler calls fork (which is also async-signal-safe)
+   in between the two operations, and returns normally on both sides
+   of the fork, kill will be called twice.  So we must block signals
+   around the operation.  See bug 15368 for more detail.
+ */
 int
-raise (int sig)
+__libc_raise (int sig)
 {
-  return __kill (__getpid (), sig);
+  /* Disallow sending the signals we use for cancellation, timers,
+     setxid, etc.  This check is also performed in __kill, but
+     if we do it now we can avoid blocking and then unblocking signals
+     unnecessarily.  */
+  if (__glibc_unlikely (__is_internal_signal (sig)))
+    {
+      __set_errno (EINVAL);
+      return -1;
+    }
+
+  /* We can safely assume that __libc_signal_block_app and
+     __libc_signal_restore_set will not fail, because
+     sigprocmask can only fail under three circumstances:
+
+     1. sigsetsize != sizeof (sigset_t) (EINVAL)
+     2. a failure in copy from/to user space (EFAULT)
+     3. an invalid 'how' operation (EINVAL)
+
+     Getting any of these would indicate a bug in either the
+     definition of sigset_t or the implementations of the
+     wrappers.  */
+  sigset_t omask;
+  __libc_signal_block_app (&omask);
+
+  int ret = __kill (__getpid (), sig);
+
+  /* ... But just because sigprocmask will not fail here, that doesn't
+     mean it won't clobber errno.  */
+  int save_errno = errno;
+  __libc_signal_restore_set (&omask);
+  __set_errno (errno);
+
+  return ret;
 }
+strong_alias (__libc_raise, raise)
 libc_hidden_def (raise)
 weak_alias (raise, gsignal)
diff --git a/sysdeps/pthread/raise.c b/sysdeps/pthread/raise.c
new file mode 100644 (file)
index 0000000..583cd15
--- /dev/null
@@ -0,0 +1,76 @@
+/* ISO C raise function for libpthread.
+   Copyright (C) 2002-2018 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <http://www.gnu.org/licenses/>.  */
+
+#include <errno.h>
+#include <pthread.h>
+#include <signal.h>
+#include <internal-signals.h>
+
+/* Raise the signal SIG.  POSIX requires raise to be async-signal-safe,
+   but also requires it to be equivalent to pthread_kill (pthread_self (), sig),
+   and that construct is *not* async-signal safe.  In particular, an
+   async signal handler that calls fork (which is also async-signal-safe)
+   could invalidate the handle returned by pthread_self, and/or cause
+   pthread_kill to be called twice.  So we must block signals around
+   the operation.  See bug 15368 for more detail.
+
+   Also, raise sets errno on failure, whereas pthread_kill returns the
+   error code.  (It is not possible for pthread_self to fail.)  */
+
+int
+__libc_raise (int sig)
+{
+  /* Disallow sending the signals we use for cancellation, timers,
+     setxid, etc.  This check is also performed in pthread_kill, but
+     if we do it now we can avoid blocking and then unblocking signals
+     unnecessarily.  */
+  if (__glibc_unlikely (__is_internal_signal (sig)))
+    {
+      __set_errno (EINVAL);
+      return -1;
+    }
+
+  /* We can safely assume that __libc_signal_block_app and
+     __libc_signal_restore_set will not fail, because
+     sigprocmask can only fail under three circumstances:
+
+     1. sigsetsize != sizeof (sigset_t) (EINVAL)
+     2. a failure in copy from/to user space (EFAULT)
+     3. an invalid 'how' operation (EINVAL)
+
+     Getting any of these would indicate a bug in either the
+     definition of sigset_t or the implementations of the
+     wrappers.  */
+  sigset_t omask;
+  __libc_signal_block_app (&omask);
+
+  int ret = __pthread_kill (__pthread_self (), sig);
+
+  __libc_signal_restore_set (&omask);
+
+  if (__glibc_unlikely (ret))
+    {
+      __set_errno (ret);
+      return -1;
+    }
+  return 0;
+}
+strong_alias (__libc_raise, raise)
+libc_hidden_def (raise)
+weak_alias (__libc_raise, gsignal)
index 90c9bc84e1fdf218d7996b880e9cb90313243fd7..8c0cf4d7aff4a98dc7337bc2e0b8d5dffe6bf10d 100644 (file)
@@ -2139,3 +2139,5 @@ GLIBC_2.27 wcstof64 F
 GLIBC_2.27 wcstof64_l F
 GLIBC_2.27 wcstof64x F
 GLIBC_2.27 wcstof64x_l F
+GLIBC_2.28 GLIBC_2.28 A
+GLIBC_2.28 pthread_kill F
index 8674a874b4e7afe083a07846fc8092082042173e..df3e7d6628bcf0e9b158fd625d0d6acd5e209469 100644 (file)
@@ -2054,6 +2054,8 @@ GLIBC_2.27 wcstof64 F
 GLIBC_2.27 wcstof64_l F
 GLIBC_2.27 wcstof64x F
 GLIBC_2.27 wcstof64x_l F
+GLIBC_2.28 GLIBC_2.28 A
+GLIBC_2.28 pthread_kill F
 GLIBC_2.3 GLIBC_2.3 A
 GLIBC_2.3 __ctype_b_loc F
 GLIBC_2.3 __ctype_tolower_loc F
index 044ec102c2567d35fe654ce4d304d478179be1b4..52ab98b3de6dea185baf2c58b0d674f4b07fbe85 100644 (file)
@@ -130,6 +130,8 @@ GLIBC_2.27 wcstof32x F
 GLIBC_2.27 wcstof32x_l F
 GLIBC_2.27 wcstof64 F
 GLIBC_2.27 wcstof64_l F
+GLIBC_2.28 GLIBC_2.28 A
+GLIBC_2.28 pthread_kill F
 GLIBC_2.4 GLIBC_2.4 A
 GLIBC_2.4 _Exit F
 GLIBC_2.4 _IO_2_1_stderr_ D 0xa0
index 2360130abed2e218a892b4ec22a86104ac53c572..e2f2a991feaf4a35d7073ee669656c8343942bb7 100644 (file)
@@ -1894,6 +1894,8 @@ GLIBC_2.27 wcstof32x F
 GLIBC_2.27 wcstof32x_l F
 GLIBC_2.27 wcstof64 F
 GLIBC_2.27 wcstof64_l F
+GLIBC_2.28 GLIBC_2.28 A
+GLIBC_2.28 pthread_kill F
 GLIBC_2.3 GLIBC_2.3 A
 GLIBC_2.3 __ctype_b_loc F
 GLIBC_2.3 __ctype_tolower_loc F
index 39c993fd79cb4e099a46dbd21246a1cfbd8332b1..bacf5a184da3e389f97c018c0d21ac93c7a5f324 100644 (file)
@@ -2064,6 +2064,8 @@ GLIBC_2.27 wcstof64 F
 GLIBC_2.27 wcstof64_l F
 GLIBC_2.27 wcstof64x F
 GLIBC_2.27 wcstof64x_l F
+GLIBC_2.28 GLIBC_2.28 A
+GLIBC_2.28 pthread_kill F
 GLIBC_2.3 GLIBC_2.3 A
 GLIBC_2.3 __ctype_b_loc F
 GLIBC_2.3 __ctype_tolower_loc F
index 68496aa6ace45bc31f895bd58c78423d667e488c..236f087894e43a16a9b95a6c77cdb87e1479ce1f 100644 (file)
@@ -1928,6 +1928,8 @@ GLIBC_2.27 wcstof64 F
 GLIBC_2.27 wcstof64_l F
 GLIBC_2.27 wcstof64x F
 GLIBC_2.27 wcstof64x_l F
+GLIBC_2.28 GLIBC_2.28 A
+GLIBC_2.28 pthread_kill F
 GLIBC_2.3 GLIBC_2.3 A
 GLIBC_2.3 __ctype_b_loc F
 GLIBC_2.3 __ctype_tolower_loc F
index e007372f2109f43bf1b542b2c032f1b305aba007..ad828ff56a18a6284f4080ccf1f4256fbe30e966 100644 (file)
 #define SIGSETXID       (__SIGRTMIN + 1)
 
 
-/* Return is sig is used internally.  */
+/* Return whether sig is used internally.  */
 static inline int
 __is_internal_signal (int sig)
 {
   return (sig == SIGCANCEL) || (sig == SIGSETXID);
 }
 
-/* Remove internal glibc signal from the mask.  */
+/* Remove internal glibc signals from the mask.  */
 static inline void
 __clear_internal_signals (sigset_t *set)
 {
@@ -54,7 +54,8 @@ __clear_internal_signals (sigset_t *set)
 #define SIGALL_SET \
   ((__sigset_t) { .__val = {[0 ...  _SIGSET_NWORDS-1 ] =  -1 } })
 
-/* Block all signals, including internal glibc ones.  */
+/* Block all signals, including internal glibc ones; write the previous
+   signal mask to SET.  */
 static inline int
 __libc_signal_block_all (sigset_t *set)
 {
@@ -63,7 +64,8 @@ __libc_signal_block_all (sigset_t *set)
                           set, _NSIG / 8);
 }
 
-/* Block all application signals (excluding internal glibc ones).  */
+/* Block all application signals (excluding internal glibc ones); write
+   the previous signal mask to SET.  */
 static inline int
 __libc_signal_block_app (sigset_t *set)
 {
@@ -74,7 +76,7 @@ __libc_signal_block_app (sigset_t *set)
                           _NSIG / 8);
 }
 
-/* Restore current process signal mask.  */
+/* Restore process signal mask according to SET.  */
 static inline int
 __libc_signal_restore_set (const sigset_t *set)
 {
index b6760252618663c24cebd2c18c7ba72fe0a0b8b0..206341cd8d514542be446b9248f4aa4effbab548 100644 (file)
@@ -131,6 +131,8 @@ GLIBC_2.27 wcstof32x F
 GLIBC_2.27 wcstof32x_l F
 GLIBC_2.27 wcstof64 F
 GLIBC_2.27 wcstof64_l F
+GLIBC_2.28 GLIBC_2.28 A
+GLIBC_2.28 pthread_kill F
 GLIBC_2.4 GLIBC_2.4 A
 GLIBC_2.4 _Exit F
 GLIBC_2.4 _IO_2_1_stderr_ D 0x98
index cdd1df55d0932fb2cb7a1252f2c8694c29e20e4d..9d476461c87b837cf01ee8a735d23d5fd49bec01 100644 (file)
@@ -2008,6 +2008,8 @@ GLIBC_2.27 wcstof32x F
 GLIBC_2.27 wcstof32x_l F
 GLIBC_2.27 wcstof64 F
 GLIBC_2.27 wcstof64_l F
+GLIBC_2.28 GLIBC_2.28 A
+GLIBC_2.28 pthread_kill F
 GLIBC_2.3 GLIBC_2.3 A
 GLIBC_2.3 __ctype_b_loc F
 GLIBC_2.3 __ctype_tolower_loc F
index e4265fd74dd6a42664aa59056801ccf543defee9..6bb0c62b622ade28f1ac358c860be24bd53f90b6 100644 (file)
@@ -2129,3 +2129,5 @@ GLIBC_2.27 wcstof32x F
 GLIBC_2.27 wcstof32x_l F
 GLIBC_2.27 wcstof64 F
 GLIBC_2.27 wcstof64_l F
+GLIBC_2.28 GLIBC_2.28 A
+GLIBC_2.28 pthread_kill F
index 3a7e0b4c296bd13be56aa95e3ba29be5d2678761..840093d0ac412ff27930a1e9c35b4e930a92779c 100644 (file)
@@ -1983,6 +1983,8 @@ GLIBC_2.27 wcstof32x F
 GLIBC_2.27 wcstof32x_l F
 GLIBC_2.27 wcstof64 F
 GLIBC_2.27 wcstof64_l F
+GLIBC_2.28 GLIBC_2.28 A
+GLIBC_2.28 pthread_kill F
 GLIBC_2.3 GLIBC_2.3 A
 GLIBC_2.3 __ctype_b_loc F
 GLIBC_2.3 __ctype_tolower_loc F
index 5e805924fa347fb73cbb65ddf6cece17aba877ab..cccc333aeb505bc814d2b1d8ca17411b3781e9f5 100644 (file)
@@ -1981,6 +1981,8 @@ GLIBC_2.27 wcstof32x F
 GLIBC_2.27 wcstof32x_l F
 GLIBC_2.27 wcstof64 F
 GLIBC_2.27 wcstof64_l F
+GLIBC_2.28 GLIBC_2.28 A
+GLIBC_2.28 pthread_kill F
 GLIBC_2.3 GLIBC_2.3 A
 GLIBC_2.3 __ctype_b_loc F
 GLIBC_2.3 __ctype_tolower_loc F
index 1973fac36d77dbd5ac0cb565e0ec609ee77c01b9..4128e9f72a707a1ae84d5454d7574c4ab4dcbfca 100644 (file)
@@ -1989,6 +1989,8 @@ GLIBC_2.27 wcstof64 F
 GLIBC_2.27 wcstof64_l F
 GLIBC_2.27 wcstof64x F
 GLIBC_2.27 wcstof64x_l F
+GLIBC_2.28 GLIBC_2.28 A
+GLIBC_2.28 pthread_kill F
 GLIBC_2.3 GLIBC_2.3 A
 GLIBC_2.3 __ctype_b_loc F
 GLIBC_2.3 __ctype_tolower_loc F
index 5e18ab83b4de9ad7c57f51902eb6d450c0b24637..601b038eded578d277df56894e01d7fb5c9ec35d 100644 (file)
@@ -1984,6 +1984,8 @@ GLIBC_2.27 wcstof64 F
 GLIBC_2.27 wcstof64_l F
 GLIBC_2.27 wcstof64x F
 GLIBC_2.27 wcstof64x_l F
+GLIBC_2.28 GLIBC_2.28 A
+GLIBC_2.28 pthread_kill F
 GLIBC_2.3 GLIBC_2.3 A
 GLIBC_2.3 __ctype_b_loc F
 GLIBC_2.3 __ctype_tolower_loc F
index cc5885ab9bb1ee54b45098f61151f235b24eefdd..4edb4667a8c737504865fb270110426d8f0ee111 100644 (file)
@@ -2170,3 +2170,5 @@ GLIBC_2.27 wcstof32x F
 GLIBC_2.27 wcstof32x_l F
 GLIBC_2.27 wcstof64 F
 GLIBC_2.27 wcstof64_l F
+GLIBC_2.28 GLIBC_2.28 A
+GLIBC_2.28 pthread_kill F
index 676aa50c8129fd6e8091113934cef247f67bf9ad..0c6f194b74a2835efd55f55d6c32e3f5d39f6bb1 100644 (file)
@@ -2012,6 +2012,8 @@ GLIBC_2.27 wcstof32x F
 GLIBC_2.27 wcstof32x_l F
 GLIBC_2.27 wcstof64 F
 GLIBC_2.27 wcstof64_l F
+GLIBC_2.28 GLIBC_2.28 A
+GLIBC_2.28 pthread_kill F
 GLIBC_2.3 GLIBC_2.3 A
 GLIBC_2.3 __ctype_b_loc F
 GLIBC_2.3 __ctype_tolower_loc F
index 2016c7c1e52071313dc52803b6a88ccafa40a994..9a9be2258a49b24ab612115121b86a8b28bacd30 100644 (file)
@@ -2017,6 +2017,8 @@ GLIBC_2.27 wcstof32x F
 GLIBC_2.27 wcstof32x_l F
 GLIBC_2.27 wcstof64 F
 GLIBC_2.27 wcstof64_l F
+GLIBC_2.28 GLIBC_2.28 A
+GLIBC_2.28 pthread_kill F
 GLIBC_2.3 GLIBC_2.3 A
 GLIBC_2.3 __ctype_b_loc F
 GLIBC_2.3 __ctype_tolower_loc F
index 3d19e38dbd7324ab2644ece9e64ad38516bfc609..f4b710075e30623e523e6569e9837b12e773be72 100644 (file)
@@ -2229,3 +2229,5 @@ GLIBC_2.27 wcstof64 F
 GLIBC_2.27 wcstof64_l F
 GLIBC_2.27 wcstof64x F
 GLIBC_2.27 wcstof64x_l F
+GLIBC_2.28 GLIBC_2.28 A
+GLIBC_2.28 pthread_kill F
index c57ab21b825a273480f5980da3e1c130f10b4a56..658dd0f0df40ee7ea38e7192b6a14c1603f705b9 100644 (file)
@@ -131,6 +131,8 @@ GLIBC_2.27 wcstof32x F
 GLIBC_2.27 wcstof32x_l F
 GLIBC_2.27 wcstof64 F
 GLIBC_2.27 wcstof64_l F
+GLIBC_2.28 GLIBC_2.28 A
+GLIBC_2.28 pthread_kill F
 GLIBC_2.3 GLIBC_2.3 A
 GLIBC_2.3 _Exit F
 GLIBC_2.3 _IO_2_1_stderr_ D 0xe0
diff --git a/sysdeps/unix/sysv/linux/pt-raise.c b/sysdeps/unix/sysv/linux/pt-raise.c
deleted file mode 100644 (file)
index b5513d4..0000000
+++ /dev/null
@@ -1,20 +0,0 @@
-/* ISO C raise function for libpthread.
-   Copyright (C) 2002-2018 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-   Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
-   <http://www.gnu.org/licenses/>.  */
-
-#include <sysdeps/unix/sysv/linux/raise.c>
index 3a6171b81589b0be1093e5c2d6c28495c8d611bc..80939cdd92c7d845a74cc20aa58c11fec9f824e6 100644 (file)
 #include <tls.h>
 #include <sysdep.h>
 #include <unistd.h>
-
+#include <internal-signals.h>
 
 int
-__pthread_kill (pthread_t threadid, int signo)
+__libc_pthread_kill (pthread_t threadid, int signo)
 {
   struct pthread *pd = (struct pthread *) threadid;
 
@@ -42,18 +42,18 @@ __pthread_kill (pthread_t threadid, int signo)
     /* Not a valid thread handle.  */
     return ESRCH;
 
-  /* Disallow sending the signal we use for cancellation, timers,
-     for the setxid implementation.  */
-  if (signo == SIGCANCEL || signo == SIGTIMER || signo == SIGSETXID)
+  /* Disallow sending the signals we use for cancellation, timers,
+     setxid, etc.  */
+  if (__is_internal_signal (signo))
     return EINVAL;
 
   /* We have a special syscall to do the work.  */
   INTERNAL_SYSCALL_DECL (err);
 
-  pid_t pid = __getpid ();
-
+  pid_t pid = INTERNAL_SYSCALL_CALL (getpid, err);
   int val = INTERNAL_SYSCALL_CALL (tgkill, err, pid, tid, signo);
   return (INTERNAL_SYSCALL_ERROR_P (val, err)
          ? INTERNAL_SYSCALL_ERRNO (val, err) : 0);
 }
-strong_alias (__pthread_kill, pthread_kill)
+strong_alias (__libc_pthread_kill, __pthread_kill)
+weak_alias (__libc_pthread_kill, pthread_kill)
diff --git a/sysdeps/unix/sysv/linux/raise.c b/sysdeps/unix/sysv/linux/raise.c
deleted file mode 100644 (file)
index b05eae2..0000000
+++ /dev/null
@@ -1,53 +0,0 @@
-/* Copyright (C) 2002-2018 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-   Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
-   <http://www.gnu.org/licenses/>.  */
-
-#include <signal.h>
-#include <sysdep.h>
-#include <errno.h>
-#include <sys/types.h>
-#include <unistd.h>
-#include <internal-signals.h>
-
-int
-raise (int sig)
-{
-  /* rt_sigprocmask may fail if:
-
-     1. sigsetsize != sizeof (sigset_t) (EINVAL)
-     2. a failure in copy from/to user space (EFAULT)
-     3. an invalid 'how' operation (EINVAL)
-
-     The first case is already handle in glibc syscall call by using the arch
-     defined _NSIG.  Second case is handled by using a stack allocated mask.
-     The last one should be handled by the block/unblock functions.  */
-
-  sigset_t set;
-  __libc_signal_block_app (&set);
-
-  INTERNAL_SYSCALL_DECL (err);
-  pid_t pid = INTERNAL_SYSCALL (getpid, err, 0);
-  pid_t tid = INTERNAL_SYSCALL (gettid, err, 0);
-
-  int ret = INLINE_SYSCALL (tgkill, 3, pid, tid, sig);
-
-  __libc_signal_restore_set (&set);
-
-  return ret;
-}
-libc_hidden_def (raise)
-weak_alias (raise, gsignal)
index 8ab44ec41f4692d462182135eda81466f1945740..60342db2a971e9ef6eb9d64978a687454daba375 100644 (file)
@@ -2094,3 +2094,5 @@ GLIBC_2.27 xdrstdio_create F
 GLIBC_2.27 xencrypt F
 GLIBC_2.27 xprt_register F
 GLIBC_2.27 xprt_unregister F
+GLIBC_2.28 GLIBC_2.28 A
+GLIBC_2.28 pthread_kill F
index 25903720e3572a4125f1d05f0ddc9ca16bd958b0..4f5d0bb82fa45996f9c93ef1c5999dda9a632810 100644 (file)
@@ -2022,6 +2022,8 @@ GLIBC_2.27 wcstof64 F
 GLIBC_2.27 wcstof64_l F
 GLIBC_2.27 wcstof64x F
 GLIBC_2.27 wcstof64x_l F
+GLIBC_2.28 GLIBC_2.28 A
+GLIBC_2.28 pthread_kill F
 GLIBC_2.3 GLIBC_2.3 A
 GLIBC_2.3 __ctype_b_loc F
 GLIBC_2.3 __ctype_tolower_loc F
index 5d6800c236be0d132d8e6b04830189e431e1d878..1810c6e152fe04bc306095f18095c640e35201b0 100644 (file)
@@ -1923,6 +1923,8 @@ GLIBC_2.27 wcstof64 F
 GLIBC_2.27 wcstof64_l F
 GLIBC_2.27 wcstof64x F
 GLIBC_2.27 wcstof64x_l F
+GLIBC_2.28 GLIBC_2.28 A
+GLIBC_2.28 pthread_kill F
 GLIBC_2.3 GLIBC_2.3 A
 GLIBC_2.3 __ctype_b_loc F
 GLIBC_2.3 __ctype_tolower_loc F
index c04872ca7f2456db85a1973fd976053901b8f058..0d1a7d095f610ead486dd34ff4c20ebaabf2639d 100644 (file)
@@ -1898,6 +1898,8 @@ GLIBC_2.27 wcstof32x F
 GLIBC_2.27 wcstof32x_l F
 GLIBC_2.27 wcstof64 F
 GLIBC_2.27 wcstof64_l F
+GLIBC_2.28 GLIBC_2.28 A
+GLIBC_2.28 pthread_kill F
 GLIBC_2.3 GLIBC_2.3 A
 GLIBC_2.3 __ctype_b_loc F
 GLIBC_2.3 __ctype_tolower_loc F
index 85cbe308d6355fa402c3d0c988c8b304aca6aa05..182f7d6e2c0164b6a5a6915f49577991a968137d 100644 (file)
@@ -2015,6 +2015,8 @@ GLIBC_2.27 wcstof64 F
 GLIBC_2.27 wcstof64_l F
 GLIBC_2.27 wcstof64x F
 GLIBC_2.27 wcstof64x_l F
+GLIBC_2.28 GLIBC_2.28 A
+GLIBC_2.28 pthread_kill F
 GLIBC_2.3 GLIBC_2.3 A
 GLIBC_2.3 __ctype_b_loc F
 GLIBC_2.3 __ctype_tolower_loc F
index f7a1ab8edbd809c80112a5786577dace3131dfeb..1ed8c8a5aeef903ef9fc37bda28b1eab8872b85f 100644 (file)
@@ -1952,6 +1952,8 @@ GLIBC_2.27 wcstof64 F
 GLIBC_2.27 wcstof64_l F
 GLIBC_2.27 wcstof64x F
 GLIBC_2.27 wcstof64x_l F
+GLIBC_2.28 GLIBC_2.28 A
+GLIBC_2.28 pthread_kill F
 GLIBC_2.3 GLIBC_2.3 A
 GLIBC_2.3 __ctype_b_loc F
 GLIBC_2.3 __ctype_tolower_loc F
index ab56ecee447db7cbe6b5a3fe7dc6a359645a5036..e1cea90f3055a3e55769878a018a25e3e99954c7 100644 (file)
@@ -2136,3 +2136,5 @@ GLIBC_2.27 wcstof32x F
 GLIBC_2.27 wcstof32x_l F
 GLIBC_2.27 wcstof64 F
 GLIBC_2.27 wcstof64_l F
+GLIBC_2.28 GLIBC_2.28 A
+GLIBC_2.28 pthread_kill F
index f2518c08ff6ba782e994f8ede724b386bf986132..78bdfa766baf9b44e343bab3b32c08475ce38327 100644 (file)
@@ -2136,3 +2136,5 @@ GLIBC_2.27 wcstof32x F
 GLIBC_2.27 wcstof32x_l F
 GLIBC_2.27 wcstof64 F
 GLIBC_2.27 wcstof64_l F
+GLIBC_2.28 GLIBC_2.28 A
+GLIBC_2.28 pthread_kill F
index 2a3cc406747e35f5255b241d1067488752ca363b..89f19bbc9d06c1bb2136808dcdc36f96e85ba2da 100644 (file)
@@ -1905,6 +1905,8 @@ GLIBC_2.27 wcstof64 F
 GLIBC_2.27 wcstof64_l F
 GLIBC_2.27 wcstof64x F
 GLIBC_2.27 wcstof64x_l F
+GLIBC_2.28 GLIBC_2.28 A
+GLIBC_2.28 pthread_kill F
 GLIBC_2.3 GLIBC_2.3 A
 GLIBC_2.3 __ctype_b_loc F
 GLIBC_2.3 __ctype_tolower_loc F
index 8bc16b9004b8eb3dfc69411e50eeea85b3bd728b..727a8b41510ca713f3da5c970bf15a404d82ea1f 100644 (file)
@@ -2148,3 +2148,5 @@ GLIBC_2.27 wcstof64 F
 GLIBC_2.27 wcstof64_l F
 GLIBC_2.27 wcstof64x F
 GLIBC_2.27 wcstof64x_l F
+GLIBC_2.28 GLIBC_2.28 A
+GLIBC_2.28 pthread_kill F