]> git.lizzy.rs Git - bspwm.git/commitdiff
Fix segfault for `bspc subscribe -f report`
authorJunak <vlypak@gmail.com>
Sun, 15 Oct 2017 21:01:39 +0000 (00:01 +0300)
committerBastien Dejean <nihilhill@gmail.com>
Mon, 16 Oct 2017 08:18:05 +0000 (10:18 +0200)
`sb->stream` is `NULL` in `add_subscriber` when called with `--fifo` option.
Also make first report message be taken into account for `--count` option.

src/messages.c
src/messages.h
src/subscribe.c

index d9d7a688a0f8d60f2cc081a01e82b9f7a6c90c05..3f80f9db7c19cd97f7df744acae46e536f9a87b8 100644 (file)
@@ -84,8 +84,6 @@ void handle_message(char *msg, int msg_len, FILE *rsp)
 
 void process_message(char **args, int num, FILE *rsp)
 {
-       int ret = SUBSCRIBE_FAILURE;
-
        if (streq("node", *args)) {
                cmd_node(++args, --num, rsp);
        } else if (streq("desktop", *args)) {
@@ -95,7 +93,8 @@ void process_message(char **args, int num, FILE *rsp)
        } else if (streq("query", *args)) {
                cmd_query(++args, --num, rsp);
        } else if (streq("subscribe", *args)) {
-               ret = cmd_subscribe(++args, --num, rsp);
+               cmd_subscribe(++args, --num, rsp);
+               return;
        } else if (streq("wm", *args)) {
                cmd_wm(++args, --num, rsp);
        } else if (streq("rule", *args)) {
@@ -109,10 +108,7 @@ void process_message(char **args, int num, FILE *rsp)
        }
 
        fflush(rsp);
-
-       if (ret != SUBSCRIBE_SOCKET) {
-               fclose(rsp);
-       }
+       fclose(rsp);
 }
 
 void cmd_node(char **args, int num, FILE *rsp)
@@ -1237,52 +1233,68 @@ void cmd_wm(char **args, int num, FILE *rsp)
        }
 }
 
-int cmd_subscribe(char **args, int num, FILE *rsp)
+void cmd_subscribe(char **args, int num, FILE *rsp)
 {
        int field = 0;
        int count = -1;
        FILE *stream = rsp;
        char *fifo_path = NULL;
+       subscriber_mask_t mask;
 
-       if (num < 1) {
-               field = SBSC_MASK_REPORT;
-       } else {
-               subscriber_mask_t mask;
-               while (num > 0) {
-                       if (streq("-c", *args) || streq("--count", *args)) {
-                               num--, args++;
-                               if (num < 1) {
-                                       fail(rsp, "subscribe %s: Not enough arguments.\n", *(args - 1));
-                                       return SUBSCRIBE_FAILURE;
-                               }
-                               if (sscanf(*args, "%i", &count) != 1 || count < 1) {
-                                       fail(rsp, "subscribe %s: Invalid argument: '%s'.\n", *(args - 1), *args);
-                                       return SUBSCRIBE_FAILURE;
-                               }
-                       } else if (streq("-f", *args) || streq("--fifo", *args)) {
-                               fifo_path = mktempfifo(FIFO_TEMPLATE);
-                               if (fifo_path == NULL) {
-                                       fail(rsp, "subscribe %s: Can't create FIFO.\n", *(args - 1));
-                                       return SUBSCRIBE_FAILURE;
-                               }
-                               stream = NULL;
-                               fprintf(rsp, "%s\n", fifo_path);
-                       } else if (parse_subscriber_mask(*args, &mask)) {
-                               field |= mask;
-                       } else {
-                               fail(rsp, "subscribe: Invalid argument: '%s'.\n", *args);
-                               return SUBSCRIBE_FAILURE;
-                       }
+       while (num > 0) {
+               if (streq("-c", *args) || streq("--count", *args)) {
                        num--, args++;
+                       if (num < 1) {
+                               fail(rsp, "subscribe %s: Not enough arguments.\n", *(args - 1));
+                               goto failed;
+                       }
+                       if (sscanf(*args, "%i", &count) != 1 || count < 1) {
+                               fail(rsp, "subscribe %s: Invalid argument: '%s'.\n", *(args - 1), *args);
+                               goto failed;
+                       }
+               } else if (streq("-f", *args) || streq("--fifo", *args)) {
+                       fifo_path = mktempfifo(FIFO_TEMPLATE);
+                       if (fifo_path == NULL) {
+                               fail(rsp, "subscribe %s: Can't create FIFO.\n", *(args - 1));
+                               goto failed;
+                       }
+               } else if (parse_subscriber_mask(*args, &mask)) {
+                       field |= mask;
+               } else {
+                       fail(rsp, "subscribe: Invalid argument: '%s'.\n", *args);
+                       goto failed;
+               }
+               num--, args++;
+       }
+
+       if (field == 0) {
+               field = SBSC_MASK_REPORT;
+       }
+
+       if (fifo_path) {
+               fprintf(rsp, "%s\n", fifo_path);
+               fflush(rsp);
+               fclose(rsp);
+
+               stream = fopen(fifo_path, "w");
+
+               if (stream == NULL) {
+                       perror("subscribe: fopen");
+                       goto free_fifo_path;
                }
        }
 
        add_subscriber(stream, fifo_path, field, count);
+       return;
 
-       if (stream != NULL) {
-               return SUBSCRIBE_SOCKET;
-       } else {
-               return SUBSCRIBE_FIFO;
+failed:
+       fflush(rsp);
+       fclose(rsp);
+
+free_fifo_path:
+       if (fifo_path) {
+               unlink(fifo_path);
+               free(fifo_path);
        }
 }
 
index e6a54ffbbbcae8bfef26af436b11441fd0b4409a..8f45434b8e2cadb970fd7f0b54d75d946f7065b2 100644 (file)
 #include "types.h"
 #include "subscribe.h"
 
-enum {
-       SUBSCRIBE_SOCKET,
-       SUBSCRIBE_FIFO,
-       SUBSCRIBE_FAILURE
-};
-
 void handle_message(char *msg, int msg_len, FILE *rsp);
 void process_message(char **args, int num, FILE *rsp);
 void cmd_node(char **args, int num, FILE *rsp);
@@ -42,7 +36,7 @@ void cmd_monitor(char **args, int num, FILE *rsp);
 void cmd_query(char **args, int num, FILE *rsp);
 void cmd_rule(char **args, int num, FILE *rsp);
 void cmd_wm(char **args, int num, FILE *rsp);
-int cmd_subscribe(char **args, int num, FILE *rsp);
+void cmd_subscribe(char **args, int num, FILE *rsp);
 void cmd_quit(char **args, int num, FILE *rsp);
 void cmd_config(char **args, int num, FILE *rsp);
 void set_setting(coordinates_t loc, char *name, char *value, FILE *rsp);
index 5e8037c386760e0049900bddc6af4643c26583c2..f9cd9a1132c76657cd8e8d7e155fab9e94614310 100644 (file)
@@ -80,6 +80,9 @@ void add_subscriber(FILE *stream, char* fifo_path, int field, int count)
        }
        if (sb->field & SBSC_MASK_REPORT) {
                print_report(sb->stream);
+               if (sb->count-- == 1) {
+                       remove_subscriber(sb);
+               }
        }
 }
 
@@ -137,9 +140,6 @@ void put_status(subscriber_mask_t mask, ...)
                        if (sb->count > 0) {
                                sb->count--;
                        }
-                       if (sb->stream == NULL) {
-                               sb->stream = fopen(sb->fifo_path, "w");
-                       }
                        if (mask == SBSC_MASK_REPORT) {
                                ret = print_report(sb->stream);
                        } else {