From b209d069639885831ae20d696a37f750cfb7e53f Mon Sep 17 00:00:00 2001 From: Benedikt Heine Date: Sat, 13 Jan 2018 15:04:30 +0100 Subject: [PATCH 1/3] Handle execvp error in open_browser The execvp function usually doesn't return and exits by itself. But, when having an error, it returns. As a faulty browser setting could trigger this, dunst has to handle this, as the forked child wants to access the X11 server too, resulting in XIO errors. Fixes #476 --- src/menu.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/menu.c b/src/menu.c index 9699b4b..3c4b890 100644 --- a/src/menu.c +++ b/src/menu.c @@ -119,6 +119,12 @@ void open_browser(const char *in) string_append(settings.browser, url, " "); char **cmd = g_strsplit(browser_cmd, " ", 0); execvp(cmd[0], cmd); + // execvp won't return if it's successful + // so, if we're here, it's definitely an error + fprintf(stderr, "Warning: failed to execute '%s': %s\n", + settings.browser, + strerror(errno)); + exit(EXIT_FAILURE); } } } From 87c0fd4d90a0547a7cc744aaaa39d25eeb2c9334 Mon Sep 17 00:00:00 2001 From: Benedikt Heine Date: Sat, 13 Jan 2018 23:52:40 +0100 Subject: [PATCH 2/3] Don't overwrite settings in children string_append frees the first argument. While it's a setting, settings.browser will contain a false dangling pointer. --- src/menu.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/menu.c b/src/menu.c index 3c4b890..0af694c 100644 --- a/src/menu.c +++ b/src/menu.c @@ -115,8 +115,7 @@ void open_browser(const char *in) if (browser_pid2) { exit(0); } else { - char *browser_cmd = - string_append(settings.browser, url, " "); + char *browser_cmd = g_strconcat(settings.browser, " ", url, NULL); char **cmd = g_strsplit(browser_cmd, " ", 0); execvp(cmd[0], cmd); // execvp won't return if it's successful From 7bfb0b9b5f6123a0feff6d624fc0a5f7bd750463 Mon Sep 17 00:00:00 2001 From: Benedikt Heine Date: Sun, 14 Jan 2018 00:31:20 +0100 Subject: [PATCH 3/3] Handle execvp error when opening dmenu The execvp function usually doesn't return and exits by itself. But, when having an error, it returns. A faulty dmenu setting could trigger this and stop dunst receiving signals. --- src/menu.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/menu.c b/src/menu.c index 0af694c..4e2389d 100644 --- a/src/menu.c +++ b/src/menu.c @@ -243,6 +243,10 @@ void context_menu(void) exit(EXIT_FAILURE); } execvp(settings.dmenu_cmd[0], settings.dmenu_cmd); + fprintf(stderr, "Warning: failed to execute '%s': %s\n", + settings.dmenu, + strerror(errno)); + exit(EXIT_FAILURE); } else { close(child_io[0]); close(parent_io[1]);