#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
#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);
}
#include <tls.h>
#include <stap-probe.h>
#include <stackinfo.h>
+#include <pthread-pids.h>
#include <assert.h>
_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;
}
+#ifndef _INCLUDE_PTHREAD_H
+#define _INCLUDE_PTHREAD_H 1
#include_next <pthread.h>
#ifndef _ISOMAC
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
--- /dev/null
+#include <nptl/pthreadP.h>
extern __typeof (__libc_sigaction) __libc_sigaction attribute_hidden;
# endif
+extern typeof (pthread_kill) __pthread_kill attribute_hidden;
+
# endif /* _ISOMAC */
#endif /* signal.h */
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
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 \
cancellation \
lowlevellock \
lll_timedlock_wait lll_timedwait_tid \
- pt-raise \
pt-compat-stubs \
flockfile ftrylockfile funlockfile \
sigaction \
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
__libc_pthread_init;
__libc_current_sigrtmin_private; __libc_current_sigrtmax_private;
__libc_allocate_rtsig_private;
+ # Used by compat stubs
+ __libc_pthread_kill;
+ __libc_raise;
}
}
#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. */
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)
+++ /dev/null
-/* 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);
-}
int
-__pthread_kill (pthread_t threadid, int signo)
+__libc_pthread_kill (pthread_t threadid, int signo)
{
struct pthread *pd = (struct pthread *) threadid;
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)
#include <tls.h>
pthread_t
-pthread_self (void)
+__pthread_self (void)
{
return (pthread_t) THREAD_SELF;
}
+weak_alias (__pthread_self, pthread_self)
/* 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)
-/* 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
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
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
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)
--- /dev/null
+/* 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)
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.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
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
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
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
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
#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)
{
#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)
{
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)
{
_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)
{
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
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
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.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
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
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
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
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.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
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
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.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
+++ /dev/null
-/* 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>
#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;
/* 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)
+++ /dev/null
-/* 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)
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
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
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
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
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
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
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.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.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
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