From f6fe750d033c40b403688dc3eee9dbff468aa8f3 Mon Sep 17 00:00:00 2001 From: "Joel E. Denny" Date: Sat, 22 Aug 2009 20:26:46 -0400 Subject: [PATCH] quotearg: fix right quote escaping when it's in quote_these_too * lib/quotearg.c (quotearg_buffer_restyled): Upon seeing a right quote, be sure to prepend only one backslash. * tests/test-quotearg.c (use_quote_double_quotes): New function. (main): Test it. --- ChangeLog | 8 ++++++++ lib/quotearg.c | 11 +++++++++-- tests/test-quotearg.c | 13 +++++++++++++ 3 files changed, 30 insertions(+), 2 deletions(-) diff --git a/ChangeLog b/ChangeLog index 469836711..57f5f32e2 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,13 @@ 2009-08-22 Joel E. Denny + quotearg: fix right quote escaping when it's in quote_these_too + * lib/quotearg.c (quotearg_buffer_restyled): Upon seeing a right + quote, be sure to prepend only one backslash. + * tests/test-quotearg.c (use_quote_double_quotes): New function. + (main): Test it. + +2009-08-22 Joel E. Denny + quotearg-tests: test escaping of embedded locale quotes * tests/test-quotearg.c (struct result_strings): Add member for new input. diff --git a/lib/quotearg.c b/lib/quotearg.c index 339bf3494..3f9e628cf 100644 --- a/lib/quotearg.c +++ b/lib/quotearg.c @@ -280,6 +280,7 @@ quotearg_buffer_restyled (char *buffer, size_t buffersize, { unsigned char c; unsigned char esc; + bool is_right_quote = false; if (backslash_escapes && quote_string_len @@ -288,7 +289,7 @@ quotearg_buffer_restyled (char *buffer, size_t buffersize, { if (elide_outer_quotes) goto force_outer_quoting_style; - STORE ('\\'); + is_right_quote = true; } c = arg[i]; @@ -521,6 +522,11 @@ quotearg_buffer_restyled (char *buffer, size_t buffersize, STORE ('0' + ((c >> 3) & 7)); c = '0' + (c & 7); } + else if (is_right_quote) + { + STORE ('\\'); + is_right_quote = false; + } if (ilim <= i + 1) break; STORE (c); @@ -534,7 +540,8 @@ quotearg_buffer_restyled (char *buffer, size_t buffersize, if (! ((backslash_escapes || elide_outer_quotes) && quote_these_too - && quote_these_too[c / INT_BITS] & (1 << (c % INT_BITS)))) + && quote_these_too[c / INT_BITS] & (1 << (c % INT_BITS))) + && !is_right_quote) goto store_c; store_escape: diff --git a/tests/test-quotearg.c b/tests/test-quotearg.c index ef91c8012..2e2c56b0d 100644 --- a/tests/test-quotearg.c +++ b/tests/test-quotearg.c @@ -264,6 +264,15 @@ use_quotearg (const char *str, size_t *len) } static char * +use_quote_double_quotes (const char *str, size_t *len) +{ + char *p = *len == SIZE_MAX ? quotearg_char (str, '"') + : quotearg_char_mem (str, *len, '"'); + *len = strlen (p); + return p; +} + +static char * use_quotearg_colon (const char *str, size_t *len) { char *p = (*len == SIZE_MAX ? quotearg_colon (str) @@ -287,6 +296,8 @@ main (int argc, char *argv[]) set_quoting_style (NULL, i); compare_strings (use_quotearg_buffer, &results_g[i].group1); compare_strings (use_quotearg, &results_g[i].group2); + if (i == c_quoting_style) + compare_strings (use_quote_double_quotes, &results_g[i].group2); compare_strings (use_quotearg_colon, &results_g[i].group3); } @@ -301,12 +312,14 @@ main (int argc, char *argv[]) == QA_ELIDE_NULL_BYTES); compare_strings (use_quotearg_buffer, &flag_results[1].group1); compare_strings (use_quotearg, &flag_results[1].group2); + compare_strings (use_quote_double_quotes, &flag_results[1].group2); compare_strings (use_quotearg_colon, &flag_results[1].group3); ASSERT (set_quoting_flags (NULL, QA_SPLIT_TRIGRAPHS) == QA_ELIDE_OUTER_QUOTES); compare_strings (use_quotearg_buffer, &flag_results[2].group1); compare_strings (use_quotearg, &flag_results[2].group2); + compare_strings (use_quote_double_quotes, &flag_results[2].group2); compare_strings (use_quotearg_colon, &flag_results[2].group3); ASSERT (set_quoting_flags (NULL, 0) == QA_SPLIT_TRIGRAPHS); -- 2.11.0