diff options
Diffstat (limited to 'src/lib/libc/stdlib/system.c')
| -rw-r--r-- | src/lib/libc/stdlib/system.c | 21 | 
1 files changed, 17 insertions, 4 deletions
| diff --git a/src/lib/libc/stdlib/system.c b/src/lib/libc/stdlib/system.c index fe718276b9..28f01a9c5d 100644 --- a/src/lib/libc/stdlib/system.c +++ b/src/lib/libc/stdlib/system.c | |||
| @@ -1,4 +1,4 @@ | |||
| 1 | /* $OpenBSD: system.c,v 1.12 2016/03/13 18:34:21 guenther Exp $ */ | 1 | /* $OpenBSD: system.c,v 1.13 2022/05/21 00:53:53 millert Exp $ */ | 
| 2 | /* | 2 | /* | 
| 3 | * Copyright (c) 1988 The Regents of the University of California. | 3 | * Copyright (c) 1988 The Regents of the University of California. | 
| 4 | * All rights reserved. | 4 | * All rights reserved. | 
| @@ -33,6 +33,7 @@ | |||
| 33 | #include <errno.h> | 33 | #include <errno.h> | 
| 34 | #include <signal.h> | 34 | #include <signal.h> | 
| 35 | #include <stdlib.h> | 35 | #include <stdlib.h> | 
| 36 | #include <string.h> | ||
| 36 | #include <unistd.h> | 37 | #include <unistd.h> | 
| 37 | #include <paths.h> | 38 | #include <paths.h> | 
| 38 | 39 | ||
| @@ -40,7 +41,7 @@ int | |||
| 40 | system(const char *command) | 41 | system(const char *command) | 
| 41 | { | 42 | { | 
| 42 | pid_t pid, cpid; | 43 | pid_t pid, cpid; | 
| 43 | struct sigaction intsave, quitsave; | 44 | struct sigaction intsave, quitsave, sa; | 
| 44 | sigset_t mask, omask; | 45 | sigset_t mask, omask; | 
| 45 | int pstat; | 46 | int pstat; | 
| 46 | char *argp[] = {"sh", "-c", NULL, NULL}; | 47 | char *argp[] = {"sh", "-c", NULL, NULL}; | 
| @@ -52,6 +53,8 @@ system(const char *command) | |||
| 52 | 53 | ||
| 53 | sigemptyset(&mask); | 54 | sigemptyset(&mask); | 
| 54 | sigaddset(&mask, SIGCHLD); | 55 | sigaddset(&mask, SIGCHLD); | 
| 56 | sigaddset(&mask, SIGINT); | ||
| 57 | sigaddset(&mask, SIGQUIT); | ||
| 55 | sigprocmask(SIG_BLOCK, &mask, &omask); | 58 | sigprocmask(SIG_BLOCK, &mask, &omask); | 
| 56 | switch (cpid = vfork()) { | 59 | switch (cpid = vfork()) { | 
| 57 | case -1: /* error */ | 60 | case -1: /* error */ | 
| @@ -63,11 +66,21 @@ system(const char *command) | |||
| 63 | _exit(127); | 66 | _exit(127); | 
| 64 | } | 67 | } | 
| 65 | 68 | ||
| 66 | sigaction(SIGINT, NULL, &intsave); | 69 | /* Ignore SIGINT and SIGQUIT while waiting for command to complete. */ | 
| 67 | sigaction(SIGQUIT, NULL, &quitsave); | 70 | memset(&sa, 0, sizeof(sa)); | 
| 71 | sigemptyset(&sa.sa_mask); | ||
| 72 | sa.sa_handler = SIG_IGN; | ||
| 73 | sigaction(SIGINT, &sa, &intsave); | ||
| 74 | sigaction(SIGQUIT, &sa, &quitsave); | ||
| 75 | sigemptyset(&mask); | ||
| 76 | sigaddset(&mask, SIGINT); | ||
| 77 | sigaddset(&mask, SIGQUIT); | ||
| 78 | sigprocmask(SIG_UNBLOCK, &mask, NULL); | ||
| 79 | |||
| 68 | do { | 80 | do { | 
| 69 | pid = waitpid(cpid, &pstat, 0); | 81 | pid = waitpid(cpid, &pstat, 0); | 
| 70 | } while (pid == -1 && errno == EINTR); | 82 | } while (pid == -1 && errno == EINTR); | 
| 83 | |||
| 71 | sigprocmask(SIG_SETMASK, &omask, NULL); | 84 | sigprocmask(SIG_SETMASK, &omask, NULL); | 
| 72 | sigaction(SIGINT, &intsave, NULL); | 85 | sigaction(SIGINT, &intsave, NULL); | 
| 73 | sigaction(SIGQUIT, &quitsave, NULL); | 86 | sigaction(SIGQUIT, &quitsave, NULL); | 
