diff --git a/ChangeLog b/ChangeLog index 5610d0861..30ba5c97b 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +2005-05-27 Matthias Clasen + + * glib/goption.c (parse_short_option, parse_long_option): + Return an error if an option is missing its argument. (#305576, + Björn Lindqvist) + + * tests/option-test.c (missing_arg_test): Add a testcase. + Wed May 25 15:33:51 2005 Manish Singh * glib/goption.c (print_help): rest_description should be const. diff --git a/ChangeLog.pre-2-10 b/ChangeLog.pre-2-10 index 5610d0861..30ba5c97b 100644 --- a/ChangeLog.pre-2-10 +++ b/ChangeLog.pre-2-10 @@ -1,3 +1,11 @@ +2005-05-27 Matthias Clasen + + * glib/goption.c (parse_short_option, parse_long_option): + Return an error if an option is missing its argument. (#305576, + Björn Lindqvist) + + * tests/option-test.c (missing_arg_test): Add a testcase. + Wed May 25 15:33:51 2005 Manish Singh * glib/goption.c (print_help): rest_description should be const. diff --git a/ChangeLog.pre-2-12 b/ChangeLog.pre-2-12 index 5610d0861..30ba5c97b 100644 --- a/ChangeLog.pre-2-12 +++ b/ChangeLog.pre-2-12 @@ -1,3 +1,11 @@ +2005-05-27 Matthias Clasen + + * glib/goption.c (parse_short_option, parse_long_option): + Return an error if an option is missing its argument. (#305576, + Björn Lindqvist) + + * tests/option-test.c (missing_arg_test): Add a testcase. + Wed May 25 15:33:51 2005 Manish Singh * glib/goption.c (print_help): rest_description should be const. diff --git a/ChangeLog.pre-2-8 b/ChangeLog.pre-2-8 index 5610d0861..30ba5c97b 100644 --- a/ChangeLog.pre-2-8 +++ b/ChangeLog.pre-2-8 @@ -1,3 +1,11 @@ +2005-05-27 Matthias Clasen + + * glib/goption.c (parse_short_option, parse_long_option): + Return an error if an option is missing its argument. (#305576, + Björn Lindqvist) + + * tests/option-test.c (missing_arg_test): Add a testcase. + Wed May 25 15:33:51 2005 Manish Singh * glib/goption.c (print_help): rest_description should be const. diff --git a/glib/goption.c b/glib/goption.c index 8fdbdd9e7..4cfd459a7 100644 --- a/glib/goption.c +++ b/glib/goption.c @@ -907,8 +907,13 @@ parse_short_option (GOptionContext *context, *new_index = index + 1; } else - value = ""; - + { + g_set_error (error, + G_OPTION_ERROR, G_OPTION_ERROR_BAD_VALUE, + _("Missing argument for %s"), option_name); + g_free (option_name); + return FALSE; + } option_name = g_strdup_printf ("-%c", group->entries[j].short_name); @@ -964,7 +969,8 @@ parse_long_option (GOptionContext *context, gchar *option_name; add_pending_null (context, &((*argv)[*index]), NULL); - + option_name = g_strconcat ("--", group->entries[j].long_name, NULL); + if (arg[len] == '=') value = arg + len + 1; else if (*index < *argc - 1) @@ -974,10 +980,14 @@ parse_long_option (GOptionContext *context, (*index)++; } else - value = ""; + { + g_set_error (error, + G_OPTION_ERROR, G_OPTION_ERROR_BAD_VALUE, + _("Missing argument for %s"), option_name); + g_free (option_name); + return FALSE; + } - option_name = g_strconcat ("--", group->entries[j].long_name, NULL); - if (!parse_arg (context, group, &group->entries[j], value, option_name, error)) { g_free (option_name); diff --git a/tests/option-test.c b/tests/option-test.c index 1383b2707..3c4035fb8 100644 --- a/tests/option-test.c +++ b/tests/option-test.c @@ -883,6 +883,41 @@ void lonely_dash_test (void) g_option_context_free (context); } +void +missing_arg_test (void) +{ + GOptionContext *context; + gboolean retval; + GError *error = NULL; + gchar **argv; + int argc; + gchar *arg = NULL; + GOptionEntry entries [] = + { { "test", 't', 0, G_OPTION_ARG_STRING, &arg, NULL, NULL }, + { NULL } }; + + context = g_option_context_new (NULL); + g_option_context_add_main_entries (context, entries, NULL); + + /* Now try parsing */ + argv = split_string ("program --test", &argc); + + retval = g_option_context_parse (context, &argc, &argv, &error); + g_assert (retval == FALSE); + g_clear_error (&error); + + g_strfreev (argv); + + /* Try parsing again */ + argv = split_string ("program --t", &argc); + + retval = g_option_context_parse (context, &argc, &argv, &error); + g_assert (retval == FALSE); + + g_strfreev (argv); + g_option_context_free (context); +} + int main (int argc, char **argv) { @@ -931,5 +966,8 @@ main (int argc, char **argv) /* test for bug 168008 */ lonely_dash_test (); + /* test for bug 305576 */ + missing_arg_test (); + return 0; }