X-Git-Url: https://ruderich.org/simon/gitweb/?a=blobdiff_plain;f=src%2Fwall-notify.c;h=95c4d8f8fad53d19534e449aff21b5c078914f30;hb=5f81debda61d93b35c5aee600e895263a7b04ba6;hp=e7106be07ca58a8cb731d3f7bcdce839bde76b63;hpb=4fc49b7b8d439b53f17536c11fc7f608e9e9f6d5;p=wall-notify%2Fwall-notify.git diff --git a/src/wall-notify.c b/src/wall-notify.c index e7106be..95c4d8f 100644 --- a/src/wall-notify.c +++ b/src/wall-notify.c @@ -67,6 +67,17 @@ static void setup_signals(void) { sigaction(SIGUSR2, &action, NULL); } +static int set_cloexec(int fd) { + int flags = fcntl(fd, F_GETFD); + if (flags == -1) { + return 0; + } + if (fcntl(fd, F_SETFD, flags | FD_CLOEXEC) == -1) { + return 0; + } + return 1; +} + static int open_tty(int public) { int ptm; const char *name; @@ -78,6 +89,9 @@ static int open_tty(int public) { if (grantpt(ptm) != 0) { return -1; } + if (!set_cloexec(ptm)) { + return -1; + } /* Prevent write access for other users so they can't use wall to send * messages to this program. */ @@ -377,6 +391,7 @@ static void usage(const char *argv0) { int main(int argc, char **argv) { int option, enable_x11, mesg_yes; + const char *argv0; int ptm, pts; char *name; @@ -386,6 +401,8 @@ int main(int argc, char **argv) { enable_x11 = 0; mesg_yes = 0; + argv0 = argv[0]; + /* * Glibc violates POSIX by default and skips over non-option arguments and * parses later arguments which look like options as well. But we want to @@ -402,25 +419,25 @@ int main(int argc, char **argv) { mesg_yes = 1; break; case 'h': - usage(argv[0]); + usage(argv0); break; case 'v': printf("%s%s\n", PACKAGE_STRING, strlen(GIT_VERSION) ? " (Git " GIT_VERSION ")" : ""); - exit(0); + exit(EXIT_SUCCESS); break; default: fprintf(stderr, "%s: unknown option '%s'!\n\n", - argv[0], argv[optind - 1]); - usage(argv[0]); + argv0, argv[optind - 1]); + usage(argv0); break; } } /* No arguments remaining, abort. */ if (!argv[optind]) { - usage(argv[0]); + usage(argv0); } /* Arguments for notification program. */ argv += optind; @@ -442,7 +459,7 @@ int main(int argc, char **argv) { /* We need to open the slave or reading from the master yields EOF after * the first wall write to it. */ - pts = open(name, O_RDWR); + pts = open(name, O_RDWR | O_CLOEXEC); if (pts < 0) { perror(name); exit(EXIT_FAILURE);