From d2c71088281ec5d820042b861805e03834e88662 Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Sun, 1 Aug 2004 00:39:45 +0000 Subject: [PATCH] Include a test involving consecutive backslashes followed by a non-escaped Sat Jul 31 20:33:07 2004 Matthias Clasen * tests/shell-test.c: Include a test involving consecutive backslashes followed by a non-escaped doublequote. * glib/gshell.c (tokenize_command_line): Count consecutive backslashes mod 2 to detect escaped doubleqotes. (#127306) --- ChangeLog | 8 ++++++++ ChangeLog.pre-2-10 | 8 ++++++++ ChangeLog.pre-2-12 | 8 ++++++++ ChangeLog.pre-2-6 | 8 ++++++++ ChangeLog.pre-2-8 | 8 ++++++++ glib/gshell.c | 18 ++++++++++++++---- tests/shell-test.c | 5 ++++- 7 files changed, 58 insertions(+), 5 deletions(-) diff --git a/ChangeLog b/ChangeLog index 8835bd217..44786c82f 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +Sat Jul 31 20:33:07 2004 Matthias Clasen + + * tests/shell-test.c: Include a test involving consecutive + backslashes followed by a non-escaped doublequote. + + * glib/gshell.c (tokenize_command_line): Count consecutive + backslashes mod 2 to detect escaped doubleqotes. (#127306) + 2004-07-30 Matthias Clasen * glib/gconvert.c (g_unescape_uri_string): Don't validate diff --git a/ChangeLog.pre-2-10 b/ChangeLog.pre-2-10 index 8835bd217..44786c82f 100644 --- a/ChangeLog.pre-2-10 +++ b/ChangeLog.pre-2-10 @@ -1,3 +1,11 @@ +Sat Jul 31 20:33:07 2004 Matthias Clasen + + * tests/shell-test.c: Include a test involving consecutive + backslashes followed by a non-escaped doublequote. + + * glib/gshell.c (tokenize_command_line): Count consecutive + backslashes mod 2 to detect escaped doubleqotes. (#127306) + 2004-07-30 Matthias Clasen * glib/gconvert.c (g_unescape_uri_string): Don't validate diff --git a/ChangeLog.pre-2-12 b/ChangeLog.pre-2-12 index 8835bd217..44786c82f 100644 --- a/ChangeLog.pre-2-12 +++ b/ChangeLog.pre-2-12 @@ -1,3 +1,11 @@ +Sat Jul 31 20:33:07 2004 Matthias Clasen + + * tests/shell-test.c: Include a test involving consecutive + backslashes followed by a non-escaped doublequote. + + * glib/gshell.c (tokenize_command_line): Count consecutive + backslashes mod 2 to detect escaped doubleqotes. (#127306) + 2004-07-30 Matthias Clasen * glib/gconvert.c (g_unescape_uri_string): Don't validate diff --git a/ChangeLog.pre-2-6 b/ChangeLog.pre-2-6 index 8835bd217..44786c82f 100644 --- a/ChangeLog.pre-2-6 +++ b/ChangeLog.pre-2-6 @@ -1,3 +1,11 @@ +Sat Jul 31 20:33:07 2004 Matthias Clasen + + * tests/shell-test.c: Include a test involving consecutive + backslashes followed by a non-escaped doublequote. + + * glib/gshell.c (tokenize_command_line): Count consecutive + backslashes mod 2 to detect escaped doubleqotes. (#127306) + 2004-07-30 Matthias Clasen * glib/gconvert.c (g_unescape_uri_string): Don't validate diff --git a/ChangeLog.pre-2-8 b/ChangeLog.pre-2-8 index 8835bd217..44786c82f 100644 --- a/ChangeLog.pre-2-8 +++ b/ChangeLog.pre-2-8 @@ -1,3 +1,11 @@ +Sat Jul 31 20:33:07 2004 Matthias Clasen + + * tests/shell-test.c: Include a test involving consecutive + backslashes followed by a non-escaped doublequote. + + * glib/gshell.c (tokenize_command_line): Count consecutive + backslashes mod 2 to detect escaped doubleqotes. (#127306) + 2004-07-30 Matthias Clasen * glib/gconvert.c (g_unescape_uri_string): Don't validate diff --git a/glib/gshell.c b/glib/gshell.c index 9cc49c82b..849e015dc 100644 --- a/glib/gshell.c +++ b/glib/gshell.c @@ -413,10 +413,12 @@ tokenize_command_line (const gchar *command_line, const gchar *p; GString *current_token = NULL; GSList *retval = NULL; - - current_quote = '\0'; - p = command_line; + gboolean quoted;; + current_quote = '\0'; + quoted = FALSE; + p = command_line; + while (*p) { if (current_quote == '\\') @@ -452,7 +454,7 @@ tokenize_command_line (const gchar *command_line, { if (*p == current_quote && /* check that it isn't an escaped double quote */ - !(current_quote == '"' && p != command_line && *(p - 1) == '\\')) + !(current_quote == '"' && quoted)) { /* close the quote */ current_quote = '\0'; @@ -516,6 +518,14 @@ tokenize_command_line (const gchar *command_line, } } + /* We need to count consecutive backslashes mod 2, + * to detect escaped doublequotes. + */ + if (*p != '\\') + quoted = FALSE; + else + quoted = !quoted; + ++p; } diff --git a/tests/shell-test.c b/tests/shell-test.c index 0142b2540..3762cb4cb 100644 --- a/tests/shell-test.c +++ b/tests/shell-test.c @@ -56,6 +56,7 @@ test_command_lines[] = /* 9 */ "foo \\\" la la la", /* 10 */ "foo \\ foo woo woo\\ ", /* 11 */ "foo \"yada yada \\$\\\"\"", + /* 12 */ "foo \"c:\\\\\"", NULL }; @@ -71,6 +72,7 @@ static const gchar *result8[] = { "foo", "", "", NULL }; static const gchar *result9[] = { "foo", "\"", "la", "la", "la", NULL }; static const gchar *result10[] = { "foo", " foo", "woo", "woo ", NULL }; static const gchar *result11[] = { "foo", "yada yada $\"", NULL }; +static const gchar *result12[] = { "foo", "c:\\", NULL }; static const TestResult correct_results[] = @@ -86,7 +88,8 @@ correct_results[] = { G_N_ELEMENTS (result8) - 1, result8 }, { G_N_ELEMENTS (result9) - 1, result9 }, { G_N_ELEMENTS (result10) - 1, result10 }, - { G_N_ELEMENTS (result11) - 1, result11 } + { G_N_ELEMENTS (result11) - 1, result11 }, + { G_N_ELEMENTS (result12) - 1, result12 } }; static void