[Bug 1485168] [NEW] pthread_kill(0, 0) Segmentation fault rather than ESRCH

WaltSullivan 1485168 at bugs.launchpad.net
Sat Aug 15 04:04:32 UTC 2015


Public bug reported:

The simple program:

#include <signal.h>
int
main (int arcg, char *argv[])   
{
  pthread_kill((pthread_t)0,0);
  return 0;
}
 
Gets "Segmentation fault". The man page says it should return ESRCH. Looking at the eglibc-2.19 source I found:

In ./nptl/sysdeps/unix/sysv/linux/pthread_sigqueue.c
     27 
     29 int
     30 pthread_sigqueue (threadid, signo, value)
     31      pthread_t threadid;
     32      int signo;
     33      const union sigval value;
     34 {
     35 #ifdef __NR_rt_tgsigqueueinfo
     36   struct pthread *pd = (struct pthread *) threadid;
     37 
     38   /* Make sure the descriptor is valid.  */
     39   if (DEBUGGING_P && INVALID_TD_P (pd))
     40     /* Not a valid thread handle.  */
     41     return ESRCH;
     42 

and in ./nptl/sysdeps/unix/sysv/linux/pthread_kill.c
     27 int
     28 __pthread_kill (threadid, signo)
     29      pthread_t threadid;
     30      int signo;
     31 {
     32   struct pthread *pd = (struct pthread *) threadid;
     33 
     34   /* Make sure the descriptor is valid.  */
     35   if (DEBUGGING_P && INVALID_TD_P (pd))
     36     /* Not a valid thread handle.  */
     37     return ESRCH;
     38 

and in ./ports/sysdeps/unix/bsd/bsd4.4/kfreebsd/fbtl/pthread_kill.c
     27 int
     28 __pthread_kill (threadid, signo)
     29      pthread_t threadid;
     30      int signo;
     31 {
     32   struct pthread *pd = (struct pthread *) threadid;
     33 
     34   /* Make sure the descriptor is valid.  */
     35   if (DEBUGGING_P && INVALID_TD_P (pd))
     36     /* Not a valid thread handle.  */
     37     return ESRCH;
     38 

In all of these cases, the "DEBUGGING_P &&" causes the "INVALID_TD_P
(pd)" test to not be generated, since DEBUGGING_P is #defined as 0. We
need to do the test!

The Ubuntu man page for pthread_kill says:

If sig is 0, then no signal is sent, but error checking is still
performed; this can be used to check for the existence of a thread ID.

$ lsb_release -rd
Description:	Ubuntu 14.04.3 LTS
Release:	14.04
$ apt-cache policy libc6
libc6:
  Installed: 2.19-0ubuntu6.6
  Candidate: 2.19-0ubuntu6.6
  Version table:
 *** 2.19-0ubuntu6.6 0
        500 http://ca.archive.ubuntu.com/ubuntu/ trusty-updates/main amd64 Packages
        500 http://security.ubuntu.com/ubuntu/ trusty-security/main amd64 Packages
        100 /var/lib/dpkg/status
     2.19-0ubuntu6 0
        500 http://ca.archive.ubuntu.com/ubuntu/ trusty/main amd64 Packages

** Affects: glibc (Ubuntu)
     Importance: Undecided
         Status: New

-- 
You received this bug notification because you are a member of Ubuntu
Foundations Bugs, which is subscribed to glibc in Ubuntu.
https://bugs.launchpad.net/bugs/1485168

Title:
  pthread_kill(0,0) Segmentation fault rather than ESRCH

Status in glibc package in Ubuntu:
  New

Bug description:
  The simple program:

  #include <signal.h>
  int
  main (int arcg, char *argv[])   
  {
    pthread_kill((pthread_t)0,0);
    return 0;
  }
   
  Gets "Segmentation fault". The man page says it should return ESRCH. Looking at the eglibc-2.19 source I found:

  In ./nptl/sysdeps/unix/sysv/linux/pthread_sigqueue.c
       27 
       29 int
       30 pthread_sigqueue (threadid, signo, value)
       31      pthread_t threadid;
       32      int signo;
       33      const union sigval value;
       34 {
       35 #ifdef __NR_rt_tgsigqueueinfo
       36   struct pthread *pd = (struct pthread *) threadid;
       37 
       38   /* Make sure the descriptor is valid.  */
       39   if (DEBUGGING_P && INVALID_TD_P (pd))
       40     /* Not a valid thread handle.  */
       41     return ESRCH;
       42 

  and in ./nptl/sysdeps/unix/sysv/linux/pthread_kill.c
       27 int
       28 __pthread_kill (threadid, signo)
       29      pthread_t threadid;
       30      int signo;
       31 {
       32   struct pthread *pd = (struct pthread *) threadid;
       33 
       34   /* Make sure the descriptor is valid.  */
       35   if (DEBUGGING_P && INVALID_TD_P (pd))
       36     /* Not a valid thread handle.  */
       37     return ESRCH;
       38 

  and in ./ports/sysdeps/unix/bsd/bsd4.4/kfreebsd/fbtl/pthread_kill.c
       27 int
       28 __pthread_kill (threadid, signo)
       29      pthread_t threadid;
       30      int signo;
       31 {
       32   struct pthread *pd = (struct pthread *) threadid;
       33 
       34   /* Make sure the descriptor is valid.  */
       35   if (DEBUGGING_P && INVALID_TD_P (pd))
       36     /* Not a valid thread handle.  */
       37     return ESRCH;
       38 

  In all of these cases, the "DEBUGGING_P &&" causes the "INVALID_TD_P
  (pd)" test to not be generated, since DEBUGGING_P is #defined as 0. We
  need to do the test!

  The Ubuntu man page for pthread_kill says:

  If sig is 0, then no signal is sent, but error checking is still
  performed; this can be used to check for the existence of a thread ID.

  $ lsb_release -rd
  Description:	Ubuntu 14.04.3 LTS
  Release:	14.04
  $ apt-cache policy libc6
  libc6:
    Installed: 2.19-0ubuntu6.6
    Candidate: 2.19-0ubuntu6.6
    Version table:
   *** 2.19-0ubuntu6.6 0
          500 http://ca.archive.ubuntu.com/ubuntu/ trusty-updates/main amd64 Packages
          500 http://security.ubuntu.com/ubuntu/ trusty-security/main amd64 Packages
          100 /var/lib/dpkg/status
       2.19-0ubuntu6 0
          500 http://ca.archive.ubuntu.com/ubuntu/ trusty/main amd64 Packages

To manage notifications about this bug go to:
https://bugs.launchpad.net/ubuntu/+source/glibc/+bug/1485168/+subscriptions



More information about the foundations-bugs mailing list