Latest stable (r287104) bash leaves zombies on exit
Konstantin Belousov
kostikbel at gmail.com
Fri Aug 28 10:01:29 UTC 2015
On Fri, Aug 28, 2015 at 08:08:27AM +0200, Michiel Boland wrote:
> On 08/27/2015 22:16, Konstantin Belousov wrote:
> [...]
> > I just verified that the signal handler is correctly wrapped for me, on
> > the latest stable/10. Both with the pre-linked libthr.so and with the
> > library loaded dynamically at runtime. I used the test program at the
> > end of the message, put breakpoint on the sigusr2_handler, and looked
> > at the backtrace, which must include thr_sighandler(). It did in my
> > case, for binary built with and without -lpthread.
> >
> > Can you verify the presence of thr_sighandler() in the backtrace for
> > this test program, on your system ?
>
> Verified, see below.
> Cheers
> Michiel
>
> Breakpoint 1, sigusr2_handler (signo=31, si=0x7fffffffe430, u=0x7fffffffe0c0)
> at rtld_sigresolv.c:24
> 24 wait(NULL);
> Current language: auto; currently minimal
> (gdb) bt
> #0 sigusr2_handler (signo=31, si=0x7fffffffe430, u=0x7fffffffe0c0)
> at rtld_sigresolv.c:24
> #1 0x000000080100d947 in handle_signal (actp=<value optimized out>, sig=31,
> info=0x7fffffffe430, ucp=0x7fffffffe0c0)
> at /usr/src/lib/libthr/thread/thr_sig.c:243
> #2 0x000000080100d158 in thr_sighandler (sig=<value optimized out>,
> info=<value optimized out>, _ucp=<value optimized out>)
> at /usr/src/lib/libthr/thread/thr_sig.c:188
> #3 <signal handler called>
I suppose this is with the binary built without -lpthread ?
I probably have an idea what is going wrong. Please try the patch
below. Libc does not used interposed sig{procmask,action,suspend}
entries itself, which resulted in e.g. signal(3) breaking libthr
hooks.
> #4 thr_kill () at thr_kill.S:3
> #5 0x0000000800965066 in __raise (s=<value optimized out>)
> at /usr/src/lib/libc/gen/raise.c:51
> #6 0x0000000000400c72 in atexit_code () at rtld_sigresolv.c:31
> #7 0x000000080093d406 in __cxa_finalize (dso=0x0)
> at /usr/src/lib/libc/stdlib/atexit.c:200
> #8 0x00000008008de92c in exit (status=0) at /usr/src/lib/libc/stdlib/exit.c:67
> #9 0x0000000000400946 in _start (ap=<value optimized out>,
> cleanup=<value optimized out>) at /usr/src/lib/csu/amd64/crt1.c:78
> #10 0x0000000800621000 in ?? ()
> #11 0x0000000000000000 in ?? ()
diff --git a/lib/libc/amd64/gen/setjmp.S b/lib/libc/amd64/gen/setjmp.S
index c26f52f..826220e 100644
--- a/lib/libc/amd64/gen/setjmp.S
+++ b/lib/libc/amd64/gen/setjmp.S
@@ -55,7 +55,7 @@ ENTRY(setjmp)
movq $0,%rsi /* (sigset_t*)set */
leaq 72(%rcx),%rdx /* 9,10; (sigset_t*)oset */
/* stack is 16-byte aligned */
- call PIC_PLT(CNAME(_sigprocmask))
+ call __libc_sigprocmask
popq %rdi
movq %rdi,%rcx
movq 0(%rsp),%rdx /* retval */
@@ -82,7 +82,7 @@ ENTRY(__longjmp)
leaq 72(%rdx),%rsi /* (sigset_t*)set */
movq $0,%rdx /* (sigset_t*)oset */
subq $0x8,%rsp /* make the stack 16-byte aligned */
- call PIC_PLT(CNAME(_sigprocmask))
+ call __libc_sigprocmask
addq $0x8,%rsp
popq %rsi
popq %rdi /* jmpbuf */
diff --git a/lib/libc/amd64/gen/sigsetjmp.S b/lib/libc/amd64/gen/sigsetjmp.S
index 9a20556..1e8e77c 100644
--- a/lib/libc/amd64/gen/sigsetjmp.S
+++ b/lib/libc/amd64/gen/sigsetjmp.S
@@ -63,7 +63,7 @@ ENTRY(sigsetjmp)
movq $0,%rsi /* (sigset_t*)set */
leaq 72(%rcx),%rdx /* 9,10 (sigset_t*)oset */
/* stack is 16-byte aligned */
- call PIC_PLT(CNAME(_sigprocmask))
+ call __libc_sigprocmask
popq %rdi
2: movq %rdi,%rcx
movq 0(%rsp),%rdx /* retval */
@@ -91,7 +91,7 @@ ENTRY(__siglongjmp)
leaq 72(%rdx),%rsi /* (sigset_t*)set */
movq $0,%rdx /* (sigset_t*)oset */
subq $0x8,%rsp /* make the stack 16-byte aligned */
- call PIC_PLT(CNAME(_sigprocmask))
+ call __libc_sigprocmask
addq $0x8,%rsp
popq %rsi
popq %rdi /* jmpbuf */
diff --git a/lib/libc/compat-43/sigcompat.c b/lib/libc/compat-43/sigcompat.c
index 199846f..a8cef1c 100644
--- a/lib/libc/compat-43/sigcompat.c
+++ b/lib/libc/compat-43/sigcompat.c
@@ -59,7 +59,7 @@ sigvec(signo, sv, osv)
} else
sap = NULL;
osap = osv != NULL ? &osa : NULL;
- ret = _sigaction(signo, sap, osap);
+ ret = __libc_sigaction(signo, sap, osap);
if (ret == 0 && osv != NULL) {
osv->sv_handler = osa.sa_handler;
osv->sv_flags = osa.sa_flags ^ SV_INTERRUPT;
@@ -77,7 +77,7 @@ sigsetmask(mask)
sigemptyset(&set);
set.__bits[0] = mask;
- n = _sigprocmask(SIG_SETMASK, &set, &oset);
+ n = __libc_sigprocmask(SIG_SETMASK, &set, &oset);
if (n)
return (n);
return (oset.__bits[0]);
@@ -92,7 +92,7 @@ sigblock(mask)
sigemptyset(&set);
set.__bits[0] = mask;
- n = _sigprocmask(SIG_BLOCK, &set, &oset);
+ n = __libc_sigprocmask(SIG_BLOCK, &set, &oset);
if (n)
return (n);
return (oset.__bits[0]);
@@ -105,7 +105,7 @@ sigpause(int mask)
sigemptyset(&set);
set.__bits[0] = mask;
- return (_sigsuspend(&set));
+ return (__libc_sigsuspend(&set));
}
int
@@ -113,11 +113,11 @@ xsi_sigpause(int sig)
{
sigset_t set;
- if (_sigprocmask(SIG_BLOCK, NULL, &set) == -1)
+ if (__libc_sigprocmask(SIG_BLOCK, NULL, &set) == -1)
return (-1);
if (sigdelset(&set, sig) == -1)
return (-1);
- return (_sigsuspend(&set));
+ return (__libc_sigsuspend(&set));
}
int
@@ -128,7 +128,7 @@ sighold(int sig)
sigemptyset(&set);
if (sigaddset(&set, sig) == -1)
return (-1);
- return (_sigprocmask(SIG_BLOCK, &set, NULL));
+ return (__libc_sigprocmask(SIG_BLOCK, &set, NULL));
}
int
@@ -138,7 +138,7 @@ sigignore(int sig)
bzero(&sa, sizeof(sa));
sa.sa_handler = SIG_IGN;
- return (_sigaction(sig, &sa, NULL));
+ return (__libc_sigaction(sig, &sa, NULL));
}
int
@@ -149,7 +149,7 @@ sigrelse(int sig)
sigemptyset(&set);
if (sigaddset(&set, sig) == -1)
return (-1);
- return (_sigprocmask(SIG_UNBLOCK, &set, NULL));
+ return (__libc_sigprocmask(SIG_UNBLOCK, &set, NULL));
}
void
@@ -161,26 +161,26 @@ void
sigemptyset(&set);
if (sigaddset(&set, sig) == -1)
return (SIG_ERR);
- if (_sigprocmask(SIG_BLOCK, NULL, &pset) == -1)
+ if (__libc_sigprocmask(SIG_BLOCK, NULL, &pset) == -1)
return (SIG_ERR);
if ((__sighandler_t *)disp == SIG_HOLD) {
- if (_sigprocmask(SIG_BLOCK, &set, &pset) == -1)
+ if (__libc_sigprocmask(SIG_BLOCK, &set, &pset) == -1)
return (SIG_ERR);
if (sigismember(&pset, sig))
return (SIG_HOLD);
else {
- if (_sigaction(sig, NULL, &psa) == -1)
+ if (__libc_sigaction(sig, NULL, &psa) == -1)
return (SIG_ERR);
return (psa.sa_handler);
}
} else {
- if (_sigprocmask(SIG_UNBLOCK, &set, &pset) == -1)
+ if (__libc_sigprocmask(SIG_UNBLOCK, &set, &pset) == -1)
return (SIG_ERR);
}
bzero(&sa, sizeof(sa));
sa.sa_handler = disp;
- if (_sigaction(sig, &sa, &psa) == -1)
+ if (__libc_sigaction(sig, &sa, &psa) == -1)
return (SIG_ERR);
if (sigismember(&pset, sig))
return (SIG_HOLD);
diff --git a/lib/libc/db/btree/bt_open.c b/lib/libc/db/btree/bt_open.c
index 94ba014..051fc28 100644
--- a/lib/libc/db/btree/bt_open.c
+++ b/lib/libc/db/btree/bt_open.c
@@ -57,6 +57,7 @@ __FBSDID("$FreeBSD$");
#include <string.h>
#include <unistd.h>
#include "un-namespace.h"
+#include "libc_private.h"
#include <db.h>
#include "btree.h"
@@ -401,10 +402,10 @@ tmp(void)
}
(void)sigfillset(&set);
- (void)_sigprocmask(SIG_BLOCK, &set, &oset);
+ (void)__libc_sigprocmask(SIG_BLOCK, &set, &oset);
if ((fd = mkostemp(path, O_CLOEXEC)) != -1)
(void)unlink(path);
- (void)_sigprocmask(SIG_SETMASK, &oset, NULL);
+ (void)__libc_sigprocmask(SIG_SETMASK, &oset, NULL);
return(fd);
}
diff --git a/lib/libc/db/hash/hash_page.c b/lib/libc/db/hash/hash_page.c
index d319d98..8040419 100644
--- a/lib/libc/db/hash/hash_page.c
+++ b/lib/libc/db/hash/hash_page.c
@@ -66,6 +66,7 @@ __FBSDID("$FreeBSD$");
#include <assert.h>
#endif
#include "un-namespace.h"
+#include "libc_private.h"
#include <db.h>
#include "hash.h"
@@ -861,10 +862,10 @@ open_temp(HTAB *hashp)
/* Block signals; make sure file goes away at process exit. */
(void)sigfillset(&set);
- (void)_sigprocmask(SIG_BLOCK, &set, &oset);
+ (void)__libc_sigprocmask(SIG_BLOCK, &set, &oset);
if ((hashp->fp = mkostemp(path, O_CLOEXEC)) != -1)
(void)unlink(path);
- (void)_sigprocmask(SIG_SETMASK, &oset, (sigset_t *)NULL);
+ (void)__libc_sigprocmask(SIG_SETMASK, &oset, (sigset_t *)NULL);
return (hashp->fp != -1 ? 0 : -1);
}
diff --git a/lib/libc/gen/daemon.c b/lib/libc/gen/daemon.c
index b359a87..15c6f4a 100644
--- a/lib/libc/gen/daemon.c
+++ b/lib/libc/gen/daemon.c
@@ -41,10 +41,10 @@ __FBSDID("$FreeBSD$");
#include <signal.h>
#include <unistd.h>
#include "un-namespace.h"
+#include "libc_private.h"
int
-daemon(nochdir, noclose)
- int nochdir, noclose;
+daemon(int nochdir, int noclose)
{
struct sigaction osa, sa;
int fd;
@@ -56,7 +56,7 @@ daemon(nochdir, noclose)
sigemptyset(&sa.sa_mask);
sa.sa_handler = SIG_IGN;
sa.sa_flags = 0;
- osa_ok = _sigaction(SIGHUP, &sa, &osa);
+ osa_ok = __libc_sigaction(SIGHUP, &sa, &osa);
switch (fork()) {
case -1:
@@ -74,7 +74,7 @@ daemon(nochdir, noclose)
newgrp = setsid();
oerrno = errno;
if (osa_ok != -1)
- _sigaction(SIGHUP, &osa, NULL);
+ __libc_sigaction(SIGHUP, &osa, NULL);
if (newgrp == -1) {
errno = oerrno;
diff --git a/lib/libc/gen/posix_spawn.c b/lib/libc/gen/posix_spawn.c
index e3124b2..e795095 100644
--- a/lib/libc/gen/posix_spawn.c
+++ b/lib/libc/gen/posix_spawn.c
@@ -120,13 +120,13 @@ process_spawnattr(const posix_spawnattr_t sa)
/* Set signal masks/defaults */
if (sa->sa_flags & POSIX_SPAWN_SETSIGMASK) {
- _sigprocmask(SIG_SETMASK, &sa->sa_sigmask, NULL);
+ __libc_sigprocmask(SIG_SETMASK, &sa->sa_sigmask, NULL);
}
if (sa->sa_flags & POSIX_SPAWN_SETSIGDEF) {
for (i = 1; i <= _SIG_MAXSIG; i++) {
if (sigismember(&sa->sa_sigdefault, i))
- if (_sigaction(i, &sigact, NULL) != 0)
+ if (__libc_sigaction(i, &sigact, NULL) != 0)
return (errno);
}
}
diff --git a/lib/libc/gen/readpassphrase.c b/lib/libc/gen/readpassphrase.c
index 95ae725..60051a1 100644
--- a/lib/libc/gen/readpassphrase.c
+++ b/lib/libc/gen/readpassphrase.c
@@ -36,6 +36,7 @@ __FBSDID("$FreeBSD$");
#include <unistd.h>
#include <readpassphrase.h>
#include "un-namespace.h"
+#include "libc_private.h"
static volatile sig_atomic_t signo[NSIG];
@@ -104,15 +105,15 @@ restart:
sigemptyset(&sa.sa_mask);
sa.sa_flags = 0; /* don't restart system calls */
sa.sa_handler = handler;
- (void)_sigaction(SIGALRM, &sa, &savealrm);
- (void)_sigaction(SIGHUP, &sa, &savehup);
- (void)_sigaction(SIGINT, &sa, &saveint);
- (void)_sigaction(SIGPIPE, &sa, &savepipe);
- (void)_sigaction(SIGQUIT, &sa, &savequit);
- (void)_sigaction(SIGTERM, &sa, &saveterm);
- (void)_sigaction(SIGTSTP, &sa, &savetstp);
- (void)_sigaction(SIGTTIN, &sa, &savettin);
- (void)_sigaction(SIGTTOU, &sa, &savettou);
+ (void)__libc_sigaction(SIGALRM, &sa, &savealrm);
+ (void)__libc_sigaction(SIGHUP, &sa, &savehup);
+ (void)__libc_sigaction(SIGINT, &sa, &saveint);
+ (void)__libc_sigaction(SIGPIPE, &sa, &savepipe);
+ (void)__libc_sigaction(SIGQUIT, &sa, &savequit);
+ (void)__libc_sigaction(SIGTERM, &sa, &saveterm);
+ (void)__libc_sigaction(SIGTSTP, &sa, &savetstp);
+ (void)__libc_sigaction(SIGTTIN, &sa, &savettin);
+ (void)__libc_sigaction(SIGTTOU, &sa, &savettou);
if (!(flags & RPP_STDIN))
(void)_write(output, prompt, strlen(prompt));
@@ -142,15 +143,15 @@ restart:
errno == EINTR && !signo[SIGTTOU])
continue;
}
- (void)_sigaction(SIGALRM, &savealrm, NULL);
- (void)_sigaction(SIGHUP, &savehup, NULL);
- (void)_sigaction(SIGINT, &saveint, NULL);
- (void)_sigaction(SIGQUIT, &savequit, NULL);
- (void)_sigaction(SIGPIPE, &savepipe, NULL);
- (void)_sigaction(SIGTERM, &saveterm, NULL);
- (void)_sigaction(SIGTSTP, &savetstp, NULL);
- (void)_sigaction(SIGTTIN, &savettin, NULL);
- (void)_sigaction(SIGTTOU, &savettou, NULL);
+ (void)__libc_sigaction(SIGALRM, &savealrm, NULL);
+ (void)__libc_sigaction(SIGHUP, &savehup, NULL);
+ (void)__libc_sigaction(SIGINT, &saveint, NULL);
+ (void)__libc_sigaction(SIGQUIT, &savequit, NULL);
+ (void)__libc_sigaction(SIGPIPE, &savepipe, NULL);
+ (void)__libc_sigaction(SIGTERM, &saveterm, NULL);
+ (void)__libc_sigaction(SIGTSTP, &savetstp, NULL);
+ (void)__libc_sigaction(SIGTTIN, &savettin, NULL);
+ (void)__libc_sigaction(SIGTTOU, &savettou, NULL);
if (input != STDIN_FILENO)
(void)_close(input);
diff --git a/lib/libc/gen/setmode.c b/lib/libc/gen/setmode.c
index 815cf14..7525567 100644
--- a/lib/libc/gen/setmode.c
+++ b/lib/libc/gen/setmode.c
@@ -53,6 +53,7 @@ __FBSDID("$FreeBSD$");
#include <stdio.h>
#endif
#include "un-namespace.h"
+#include "libc_private.h"
#define SET_LEN 6 /* initial # of bitcmd struct to malloc */
#define SET_LEN_INCR 4 /* # of bitcmd structs to add as needed */
@@ -364,9 +365,9 @@ getumask(void)
* handler, protect them as best we can.
*/
sigfillset(&sigset);
- (void)_sigprocmask(SIG_BLOCK, &sigset, &sigoset);
+ (void)__libc_sigprocmask(SIG_BLOCK, &sigset, &sigoset);
(void)umask(mask = umask(0));
- (void)_sigprocmask(SIG_SETMASK, &sigoset, NULL);
+ (void)__libc_sigprocmask(SIG_SETMASK, &sigoset, NULL);
return (mask);
}
diff --git a/lib/libc/gen/siginterrupt.c b/lib/libc/gen/siginterrupt.c
index fde33ca..d99b772 100644
--- a/lib/libc/gen/siginterrupt.c
+++ b/lib/libc/gen/siginterrupt.c
@@ -43,14 +43,13 @@ __FBSDID("$FreeBSD$");
* after an instance of the indicated signal.
*/
int
-siginterrupt(sig, flag)
- int sig, flag;
+siginterrupt(int sig, int flag)
{
extern sigset_t _sigintr __hidden;
struct sigaction sa;
int ret;
- if ((ret = _sigaction(sig, (struct sigaction *)0, &sa)) < 0)
+ if ((ret = __libc_sigaction(sig, (struct sigaction *)0, &sa)) < 0)
return (ret);
if (flag) {
sigaddset(&_sigintr, sig);
@@ -59,5 +58,5 @@ siginterrupt(sig, flag)
sigdelset(&_sigintr, sig);
sa.sa_flags |= SA_RESTART;
}
- return (_sigaction(sig, &sa, (struct sigaction *)0));
+ return (__libc_sigaction(sig, &sa, (struct sigaction *)0));
}
diff --git a/lib/libc/gen/signal.c b/lib/libc/gen/signal.c
index ee96dcc..70e7f17 100644
--- a/lib/libc/gen/signal.c
+++ b/lib/libc/gen/signal.c
@@ -44,9 +44,7 @@ __FBSDID("$FreeBSD$");
sigset_t _sigintr __hidden; /* shared with siginterrupt */
sig_t
-signal(s, a)
- int s;
- sig_t a;
+signal(int s, sig_t a)
{
struct sigaction sa, osa;
@@ -55,7 +53,7 @@ signal(s, a)
sa.sa_flags = 0;
if (!sigismember(&_sigintr, s))
sa.sa_flags |= SA_RESTART;
- if (_sigaction(s, &sa, &osa) < 0)
+ if (__libc_sigaction(s, &sa, &osa) < 0)
return (SIG_ERR);
return (osa.sa_handler);
}
diff --git a/lib/libc/gen/wordexp.c b/lib/libc/gen/wordexp.c
index 958ddc6..859ca50 100644
--- a/lib/libc/gen/wordexp.c
+++ b/lib/libc/gen/wordexp.c
@@ -38,6 +38,7 @@
#include <unistd.h>
#include <wordexp.h>
#include "un-namespace.h"
+#include "libc_private.h"
__FBSDID("$FreeBSD$");
@@ -127,12 +128,12 @@ we_askshell(const char *words, wordexp_t *we, int flags)
return (WRDE_NOSPACE); /* XXX */
(void)sigemptyset(&newsigblock);
(void)sigaddset(&newsigblock, SIGCHLD);
- (void)_sigprocmask(SIG_BLOCK, &newsigblock, &oldsigblock);
+ (void)__libc_sigprocmask(SIG_BLOCK, &newsigblock, &oldsigblock);
if ((pid = fork()) < 0) {
serrno = errno;
_close(pdes[0]);
_close(pdes[1]);
- (void)_sigprocmask(SIG_SETMASK, &oldsigblock, NULL);
+ (void)__libc_sigprocmask(SIG_SETMASK, &oldsigblock, NULL);
errno = serrno;
return (WRDE_NOSPACE); /* XXX */
}
@@ -140,7 +141,7 @@ we_askshell(const char *words, wordexp_t *we, int flags)
/*
* We are the child; make /bin/sh expand `words'.
*/
- (void)_sigprocmask(SIG_SETMASK, &oldsigblock, NULL);
+ (void)__libc_sigprocmask(SIG_SETMASK, &oldsigblock, NULL);
if ((pdes[1] != STDOUT_FILENO ?
_dup2(pdes[1], STDOUT_FILENO) :
_fcntl(pdes[1], F_SETFD, 0)) < 0)
@@ -222,7 +223,7 @@ cleanup:
do
wpid = _waitpid(pid, &status, 0);
while (wpid < 0 && errno == EINTR);
- (void)_sigprocmask(SIG_SETMASK, &oldsigblock, NULL);
+ (void)__libc_sigprocmask(SIG_SETMASK, &oldsigblock, NULL);
if (error != 0) {
errno = serrno;
return (error);
diff --git a/lib/libc/i386/gen/setjmp.S b/lib/libc/i386/gen/setjmp.S
index 6e15868..1e6cd1b 100644
--- a/lib/libc/i386/gen/setjmp.S
+++ b/lib/libc/i386/gen/setjmp.S
@@ -58,7 +58,7 @@ ENTRY(setjmp)
pushl %eax /* (sigset_t*)oset */
pushl $0 /* (sigset_t*)set */
pushl $1 /* SIG_BLOCK */
- call PIC_PLT(CNAME(_sigprocmask))
+ call __libc_sigprocmask
#ifdef PIC
addl $24,%esp
#else
@@ -89,7 +89,7 @@ ENTRY(__longjmp)
leal 28(%edx), %eax
pushl %eax /* (sigset_t*)set */
pushl $3 /* SIG_SETMASK */
- call PIC_PLT(CNAME(_sigprocmask))
+ call __libc_sigprocmask
#ifdef PIC
addl $24,%esp
#else
diff --git a/lib/libc/i386/gen/sigsetjmp.S b/lib/libc/i386/gen/sigsetjmp.S
index 1c63649..6fa0c6b 100644
--- a/lib/libc/i386/gen/sigsetjmp.S
+++ b/lib/libc/i386/gen/sigsetjmp.S
@@ -67,7 +67,7 @@ ENTRY(sigsetjmp)
pushl %eax /* (sigset_t*)oset */
pushl $0 /* (sigset_t*)set */
pushl $1 /* SIG_BLOCK */
- call PIC_PLT(CNAME(_sigprocmask))
+ call __libc_sigprocmask
#ifdef PIC
addl $24,%esp
#else
@@ -100,7 +100,7 @@ ENTRY(__siglongjmp)
leal 28(%edx), %eax
pushl %eax /* (sigset_t*)set */
pushl $3 /* SIG_SETMASK */
- call PIC_PLT(CNAME(_sigprocmask))
+ call __libc_sigprocmask
#ifdef PIC
addl $24,%esp
#else
diff --git a/lib/libc/include/libc_private.h b/lib/libc/include/libc_private.h
index a670d63..b440703 100644
--- a/lib/libc/include/libc_private.h
+++ b/lib/libc/include/libc_private.h
@@ -359,6 +359,10 @@ __pid_t __sys_wait6(enum idtype, __id_t, int *, int,
__ssize_t __sys_write(int, const void *, __size_t);
__ssize_t __sys_writev(int, const struct iovec *, int);
+int __libc_sigaction(int, const struct sigaction *,
+ struct sigaction *);
+int __libc_sigprocmask(int, const __sigset_t *, __sigset_t *);
+int __libc_sigsuspend(const __sigset_t *);
int __libc_sigwait(const __sigset_t * __restrict,
int * restrict sig);
int __libc_system(const char *);
diff --git a/lib/libc/net/rcmd.c b/lib/libc/net/rcmd.c
index 2885dc3..1ba9888 100644
--- a/lib/libc/net/rcmd.c
+++ b/lib/libc/net/rcmd.c
@@ -58,6 +58,7 @@ __FBSDID("$FreeBSD$");
#endif
#include <arpa/nameser.h>
#include "un-namespace.h"
+#include "libc_private.h"
extern int innetgr( const char *, const char *, const char *, const char * );
@@ -148,7 +149,7 @@ rcmd_af(ahost, rport, locuser, remuser, cmd, fd2p, af)
refused = 0;
sigemptyset(&newmask);
sigaddset(&newmask, SIGURG);
- _sigprocmask(SIG_BLOCK, (const sigset_t *)&newmask, &oldmask);
+ __libc_sigprocmask(SIG_BLOCK, (const sigset_t *)&newmask, &oldmask);
for (timo = 1, lport = IPPORT_RESERVED - 1;;) {
s = rresvport_af(&lport, ai->ai_family);
if (s < 0) {
@@ -163,7 +164,7 @@ rcmd_af(ahost, rport, locuser, remuser, cmd, fd2p, af)
(void)fprintf(stderr, "rcmd: socket: %s\n",
strerror(errno));
freeaddrinfo(res);
- _sigprocmask(SIG_SETMASK, (const sigset_t *)&oldmask,
+ __libc_sigprocmask(SIG_SETMASK, (const sigset_t *)&oldmask,
NULL);
return (-1);
}
@@ -181,7 +182,7 @@ rcmd_af(ahost, rport, locuser, remuser, cmd, fd2p, af)
(void)fprintf(stderr, "%s: %s\n",
*ahost, strerror(errno));
freeaddrinfo(res);
- _sigprocmask(SIG_SETMASK, (const sigset_t *)&oldmask,
+ __libc_sigprocmask(SIG_SETMASK, (const sigset_t *)&oldmask,
NULL);
return (-1);
}
@@ -306,7 +307,7 @@ again:
}
goto bad2;
}
- _sigprocmask(SIG_SETMASK, (const sigset_t *)&oldmask, NULL);
+ __libc_sigprocmask(SIG_SETMASK, (const sigset_t *)&oldmask, NULL);
freeaddrinfo(res);
return (s);
bad2:
@@ -314,7 +315,7 @@ bad2:
(void)_close(*fd2p);
bad:
(void)_close(s);
- _sigprocmask(SIG_SETMASK, (const sigset_t *)&oldmask, NULL);
+ __libc_sigprocmask(SIG_SETMASK, (const sigset_t *)&oldmask, NULL);
freeaddrinfo(res);
return (-1);
}
diff --git a/lib/libc/stdio/tmpfile.c b/lib/libc/stdio/tmpfile.c
index c67d1e4..e5a2be1 100644
--- a/lib/libc/stdio/tmpfile.c
+++ b/lib/libc/stdio/tmpfile.c
@@ -46,9 +46,10 @@ __FBSDID("$FreeBSD$");
#include <string.h>
#include <paths.h>
#include "un-namespace.h"
+#include "libc_private.h"
FILE *
-tmpfile()
+tmpfile(void)
{
sigset_t set, oset;
FILE *fp;
@@ -69,7 +70,7 @@ tmpfile()
return (NULL);
sigfillset(&set);
- (void)_sigprocmask(SIG_BLOCK, &set, &oset);
+ (void)__libc_sigprocmask(SIG_BLOCK, &set, &oset);
fd = mkstemp(buf);
if (fd != -1)
@@ -77,7 +78,7 @@ tmpfile()
free(buf);
- (void)_sigprocmask(SIG_SETMASK, &oset, NULL);
+ (void)__libc_sigprocmask(SIG_SETMASK, &oset, NULL);
if (fd == -1)
return (NULL);
diff --git a/lib/libc/stdlib/abort.c b/lib/libc/stdlib/abort.c
index b137e49..022c6aa 100644
--- a/lib/libc/stdlib/abort.c
+++ b/lib/libc/stdlib/abort.c
@@ -61,7 +61,7 @@ abort()
* any errors -- ISO C doesn't allow abort to return anyway.
*/
sigdelset(&act.sa_mask, SIGABRT);
- (void)_sigprocmask(SIG_SETMASK, &act.sa_mask, NULL);
+ (void)__libc_sigprocmask(SIG_SETMASK, &act.sa_mask, NULL);
(void)raise(SIGABRT);
/*
@@ -71,9 +71,9 @@ abort()
act.sa_handler = SIG_DFL;
act.sa_flags = 0;
sigfillset(&act.sa_mask);
- (void)_sigaction(SIGABRT, &act, NULL);
+ (void)__libc_sigaction(SIGABRT, &act, NULL);
sigdelset(&act.sa_mask, SIGABRT);
- (void)_sigprocmask(SIG_SETMASK, &act.sa_mask, NULL);
+ (void)__libc_sigprocmask(SIG_SETMASK, &act.sa_mask, NULL);
(void)raise(SIGABRT);
exit(1);
}
diff --git a/lib/libc/stdlib/system.c b/lib/libc/stdlib/system.c
index bd9ea5a..d1cdb68 100644
--- a/lib/libc/stdlib/system.c
+++ b/lib/libc/stdlib/system.c
@@ -70,16 +70,16 @@ __libc_system(const char *command)
(void)sigaddset(&newsigblock, SIGCHLD);
(void)sigaddset(&newsigblock, SIGINT);
(void)sigaddset(&newsigblock, SIGQUIT);
- (void)_sigprocmask(SIG_BLOCK, &newsigblock, &oldsigblock);
+ (void)__libc_sigprocmask(SIG_BLOCK, &newsigblock, &oldsigblock);
switch(pid = vfork()) {
case -1: /* error */
- (void)_sigprocmask(SIG_SETMASK, &oldsigblock, NULL);
+ (void)__libc_sigprocmask(SIG_SETMASK, &oldsigblock, NULL);
return (-1);
case 0: /* child */
/*
* Restore original signal dispositions and exec the command.
*/
- (void)_sigprocmask(SIG_SETMASK, &oldsigblock, NULL);
+ (void)__libc_sigprocmask(SIG_SETMASK, &oldsigblock, NULL);
execl(_PATH_BSHELL, "sh", "-c", command, (char *)NULL);
_exit(127);
}
@@ -92,16 +92,16 @@ __libc_system(const char *command)
memset(&ign, 0, sizeof(ign));
ign.sa_handler = SIG_IGN;
(void)sigemptyset(&ign.sa_mask);
- (void)_sigaction(SIGINT, &ign, &intact);
- (void)_sigaction(SIGQUIT, &ign, &quitact);
+ (void)__libc_sigaction(SIGINT, &ign, &intact);
+ (void)__libc_sigaction(SIGQUIT, &ign, &quitact);
savedpid = pid;
do {
pid = _wait4(savedpid, &pstat, 0, (struct rusage *)0);
} while (pid == -1 && errno == EINTR);
- (void)_sigaction(SIGINT, &intact, NULL);
- (void)_sigaction(SIGQUIT, &quitact, NULL);
- (void)_sigprocmask(SIG_SETMASK, &oldsigblock, NULL);
- return(pid == -1 ? -1 : pstat);
+ (void)__libc_sigaction(SIGINT, &intact, NULL);
+ (void)__libc_sigaction(SIGQUIT, &quitact, NULL);
+ (void)__libc_sigprocmask(SIG_SETMASK, &oldsigblock, NULL);
+ return (pid == -1 ? -1 : pstat);
}
__weak_reference(__libc_system, __system);
diff --git a/lib/libc/sys/sigaction.c b/lib/libc/sys/sigaction.c
index 7645538..b4d6563 100644
--- a/lib/libc/sys/sigaction.c
+++ b/lib/libc/sys/sigaction.c
@@ -38,6 +38,7 @@ __FBSDID("$FreeBSD$");
#include "libc_private.h"
__weak_reference(__sys_sigaction, __sigaction);
+__weak_reference(sigaction, __libc_sigaction);
#pragma weak sigaction
int
diff --git a/lib/libc/sys/sigprocmask.c b/lib/libc/sys/sigprocmask.c
index 40dba95..d24bb89 100644
--- a/lib/libc/sys/sigprocmask.c
+++ b/lib/libc/sys/sigprocmask.c
@@ -38,6 +38,7 @@ __FBSDID("$FreeBSD$");
#include "libc_private.h"
__weak_reference(__sys_sigprocmask, __sigprocmask);
+__weak_reference(sigprocmask, __libc_sigprocmask);
#pragma weak sigprocmask
int
diff --git a/lib/libc/sys/sigsuspend.c b/lib/libc/sys/sigsuspend.c
index 6e47368..1f980a1 100644
--- a/lib/libc/sys/sigsuspend.c
+++ b/lib/libc/sys/sigsuspend.c
@@ -38,6 +38,7 @@ __FBSDID("$FreeBSD$");
#include "libc_private.h"
__weak_reference(__sys_sigsuspend, __sigsuspend);
+__weak_reference(sigsuspend, __libc_sigsuspend);
#pragma weak sigsuspend
int
More information about the freebsd-stable
mailing list