Fix segfault for bspc subscribe -f report

`sb->stream` is `NULL` in `add_subscriber` when called with `--fifo` option.
Also make first report message be taken into account for `--count` option.
This commit is contained in:
Junak 2017-10-16 00:01:39 +03:00 committed by Bastien Dejean
parent 469a9bf521
commit 4b1840bad0
3 changed files with 57 additions and 51 deletions

View file

@ -84,8 +84,6 @@ void handle_message(char *msg, int msg_len, FILE *rsp)
void process_message(char **args, int num, FILE *rsp) void process_message(char **args, int num, FILE *rsp)
{ {
int ret = SUBSCRIBE_FAILURE;
if (streq("node", *args)) { if (streq("node", *args)) {
cmd_node(++args, --num, rsp); cmd_node(++args, --num, rsp);
} else if (streq("desktop", *args)) { } else if (streq("desktop", *args)) {
@ -95,7 +93,8 @@ void process_message(char **args, int num, FILE *rsp)
} else if (streq("query", *args)) { } else if (streq("query", *args)) {
cmd_query(++args, --num, rsp); cmd_query(++args, --num, rsp);
} else if (streq("subscribe", *args)) { } else if (streq("subscribe", *args)) {
ret = cmd_subscribe(++args, --num, rsp); cmd_subscribe(++args, --num, rsp);
return;
} else if (streq("wm", *args)) { } else if (streq("wm", *args)) {
cmd_wm(++args, --num, rsp); cmd_wm(++args, --num, rsp);
} else if (streq("rule", *args)) { } else if (streq("rule", *args)) {
@ -109,10 +108,7 @@ void process_message(char **args, int num, FILE *rsp)
} }
fflush(rsp); fflush(rsp);
fclose(rsp);
if (ret != SUBSCRIBE_SOCKET) {
fclose(rsp);
}
} }
void cmd_node(char **args, int num, FILE *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 field = 0;
int count = -1; int count = -1;
FILE *stream = rsp; FILE *stream = rsp;
char *fifo_path = NULL; char *fifo_path = NULL;
subscriber_mask_t mask;
if (num < 1) { while (num > 0) {
field = SBSC_MASK_REPORT; if (streq("-c", *args) || streq("--count", *args)) {
} 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;
}
num--, 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); add_subscriber(stream, fifo_path, field, count);
return;
if (stream != NULL) { failed:
return SUBSCRIBE_SOCKET; fflush(rsp);
} else { fclose(rsp);
return SUBSCRIBE_FIFO;
free_fifo_path:
if (fifo_path) {
unlink(fifo_path);
free(fifo_path);
} }
} }

View file

@ -28,12 +28,6 @@
#include "types.h" #include "types.h"
#include "subscribe.h" #include "subscribe.h"
enum {
SUBSCRIBE_SOCKET,
SUBSCRIBE_FIFO,
SUBSCRIBE_FAILURE
};
void handle_message(char *msg, int msg_len, FILE *rsp); void handle_message(char *msg, int msg_len, FILE *rsp);
void process_message(char **args, int num, FILE *rsp); void process_message(char **args, int num, FILE *rsp);
void cmd_node(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_query(char **args, int num, FILE *rsp);
void cmd_rule(char **args, int num, FILE *rsp); void cmd_rule(char **args, int num, FILE *rsp);
void cmd_wm(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_quit(char **args, int num, FILE *rsp);
void cmd_config(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); void set_setting(coordinates_t loc, char *name, char *value, FILE *rsp);

View file

@ -80,6 +80,9 @@ void add_subscriber(FILE *stream, char* fifo_path, int field, int count)
} }
if (sb->field & SBSC_MASK_REPORT) { if (sb->field & SBSC_MASK_REPORT) {
print_report(sb->stream); 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) { if (sb->count > 0) {
sb->count--; sb->count--;
} }
if (sb->stream == NULL) {
sb->stream = fopen(sb->fifo_path, "w");
}
if (mask == SBSC_MASK_REPORT) { if (mask == SBSC_MASK_REPORT) {
ret = print_report(sb->stream); ret = print_report(sb->stream);
} else { } else {