From 0c49b4925470d7e1a04e585c382931c6a7aa4064 Mon Sep 17 00:00:00 2001 From: Nikos Tsipinakis Date: Sun, 5 Feb 2017 12:55:10 +0200 Subject: [PATCH] Replace string_to_argv util function with g_shell_parse_argv string_to_argv parsing was very simplistic and didn't properly handle quotations. Since we are already using glib, g_shell_parse_argv serves the same purpose with much better parsing and error handling. --- src/menu.c | 4 ++++ src/settings.c | 11 ++++++++++- test/utils.c | 26 -------------------------- 3 files changed, 14 insertions(+), 27 deletions(-) diff --git a/src/menu.c b/src/menu.c index 06de61e..a3319c1 100644 --- a/src/menu.c +++ b/src/menu.c @@ -188,6 +188,10 @@ void dispatch_menu_result(const char *input) */ void context_menu(void) { + if (settings.dmenu_cmd == NULL) { + fprintf(stderr, "dmenu command not set properly. Cowardly refusing to open the context menu.\n"); + return; + } char *dmenu_input = NULL; for (GList * iter = g_queue_peek_head_link(displayed); iter; diff --git a/src/settings.c b/src/settings.c index 1b5432a..9826167 100644 --- a/src/settings.c +++ b/src/settings.c @@ -325,7 +325,16 @@ void load_settings(char *cmdline_config_path) "path to dmenu" ); - settings.dmenu_cmd = string_to_argv(settings.dmenu); + { + GError *error = NULL; + if (!g_shell_parse_argv(settings.dmenu, NULL, &settings.dmenu_cmd, &error)) { + fprintf(stderr, "Unable to parse dmenu command: %s\n", error->message); + fprintf(stderr, "dmenu functionality will be disabled.\n"); + g_error_free(error); + settings.dmenu_cmd = NULL; + } + } + settings.browser = option_get_string( "global", diff --git a/test/utils.c b/test/utils.c index d510d5f..509bf78 100644 --- a/test/utils.c +++ b/test/utils.c @@ -74,31 +74,6 @@ TEST test_string_append(void) PASS(); } -TEST test_string_to_argv(void) -{ - char **argv = string_to_argv("argv"); - ASSERT_STR_EQ("argv", argv[0]); - ASSERT_EQ( NULL, argv[1]); - free(argv[0]); - free(argv); - argv = NULL; - - argv = string_to_argv("echo test"); - ASSERT_STR_EQ("echo", argv[0]); - ASSERT_STR_EQ("test", argv[1]); - ASSERT_EQ( NULL, argv[2]); - free(argv[0]); - free(argv[1]); - free(argv); - argv = NULL; - - argv = string_to_argv(""); - ASSERT_EQ( NULL, argv[0]); - free(argv); - - PASS(); -} - TEST test_string_strip_delimited(void) { char *text = malloc(128 * sizeof(char)); @@ -133,7 +108,6 @@ SUITE(suite_utils) RUN_TEST(test_string_replace_all); RUN_TEST(test_string_replace); RUN_TEST(test_string_append); - RUN_TEST(test_string_to_argv); RUN_TEST(test_string_strip_delimited); } /* vim: set tabstop=8 shiftwidth=8 expandtab textwidth=0: */