Nicolas Iooss <nicolas.iooss@xxxxxxx> writes: > Musl recently added a wrapper for gettid() syscall. There is no way to > detect this new version in a reliable way, so rename our gettid() > wrapper to a non-conflicting name. > > Introduce a new function which, when using a libc known to provide a > wrapper for gettid(), calls it, and which, otherwise, performs the > syscall directly. > > Anyway this function is only used on systems where /proc/thread-self > does not exist, which are therefore running Linux<3.17. > > Fixes: https://github.com/SELinuxProject/selinux/issues/282 > Signed-off-by: Nicolas Iooss <nicolas.iooss@xxxxxxx> Tested on Fedora with musl-1.2.22 scratch build https://koji.fedoraproject.org/koji/taskinfo?taskID=62214131 : Before ^&^ musl-gcc -D_GNU_SOURCE -I../include procattr.c -c procattr.c:38:14: error: static declaration of ‘gettid’ follows non-static declaration 38 | static pid_t gettid(void) | ^~~~~~ In file included from procattr.c:2: /usr/x86_64-linux-musl/include/unistd.h:194:7: note: previous declaration of ‘gettid’ with type ‘pid_t(void)’ {aka ‘int(void)’} 194 | pid_t gettid(void); | ^~~~~~ After ^&^ musl-gcc -D_GNU_SOURCE -I../include procattr.c -c Seems to work. Thanks! Acked-by: Petr Lautrbach <plautrba@xxxxxxxxxx> > diff --git a/libselinux/src/procattr.c b/libselinux/src/procattr.c > index 1aa67ac53f39..840570525f5f 100644 > --- a/libselinux/src/procattr.c > +++ b/libselinux/src/procattr.c > @@ -25,21 +25,23 @@ static __thread char destructor_initialized; > /* Bionic and glibc >= 2.30 declare gettid() system call wrapper in unistd.h and > * has a definition for it */ > #ifdef __BIONIC__ > - #define OVERRIDE_GETTID 0 > + #define HAVE_GETTID 1 > #elif !defined(__GLIBC_PREREQ) > - #define OVERRIDE_GETTID 1 > + #define HAVE_GETTID 0 > #elif !__GLIBC_PREREQ(2,30) > - #define OVERRIDE_GETTID 1 > + #define HAVE_GETTID 0 > #else > - #define OVERRIDE_GETTID 0 > + #define HAVE_GETTID 1 > #endif > > -#if OVERRIDE_GETTID > -static pid_t gettid(void) > +static pid_t selinux_gettid(void) > { > +#if HAVE_GETTID > + return gettid(); > +#else > return syscall(__NR_gettid); > -} > #endif > +} > > static void procattr_thread_destructor(void __attribute__((unused)) *unused) > { > @@ -94,7 +96,7 @@ static int openattr(pid_t pid, const char *attr, int flags) > if (fd >= 0 || errno != ENOENT) > goto out; > free(path); > - tid = gettid(); > + tid = selinux_gettid(); > rc = asprintf(&path, "/proc/self/task/%d/attr/%s", tid, attr); > } else { > errno = EINVAL; > -- > 2.30.0