]> ruderich.org/simon Gitweb - wall-notify/wall-notify.git/blobdiff - src/wall-notify.c
fix race condition in handle_wall()
[wall-notify/wall-notify.git] / src / wall-notify.c
index 57ec37f00a60cef695e28b536055551716c4f391..efe500513f760cff017b631486c6cabfbf6094c2 100644 (file)
 #endif
 
 
+static sig_atomic_t signaled = 0;
+
+
 static void sig_handler(int signal) {
     (void)signal;
+
+    signaled = 1;
 }
 static void setup_signals(void) {
     struct sigaction action;
@@ -332,7 +337,7 @@ static void handle_wall(int fd, char **argv) {
     ssize_t r;
 
     assert(SSIZE_MAX <= SIZE_MAX);
-    while ((r = read(fd, buffer, sizeof(buffer))) > 0) {
+    while (!signaled && (r = read(fd, buffer, sizeof(buffer))) > 0) {
         size_t space;
         ssize_t r2;
 
@@ -391,6 +396,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;
 
@@ -400,6 +406,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
@@ -416,25 +424,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;