From 8cb27223b8eda4767179a1f226f96d2bdec2fe44 Mon Sep 17 00:00:00 2001 From: Edward Thomson Date: Fri, 25 Sep 2015 10:48:19 -0400 Subject: [PATCH] git_buf_quote/unquote: handle > \177 Parse values up to and including `\377` (`0xff`) when unquoting. Print octal values as an unsigned char when quoting, lest `printf` think we're talking about negatives. --- src/buffer.c | 4 ++-- tests/buf/quote.c | 5 +++++ 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/src/buffer.c b/src/buffer.c index 31341c4b5..d135ebe4a 100644 --- a/src/buffer.c +++ b/src/buffer.c @@ -901,7 +901,7 @@ int git_buf_quote(git_buf *buf) /* escape anything unprintable as octal */ else if (buf->ptr[i] != ' ' && (buf->ptr[i] < '!' || buf->ptr[i] > '~')) { - git_buf_printf("ed, "\\%03o", buf->ptr[i]); + git_buf_printf("ed, "\\%03o", (unsigned char)buf->ptr[i]); } /* yay, printable! */ @@ -959,7 +959,7 @@ int git_buf_unquote(git_buf *buf) case 'v': ch = '\v'; break; /* \xyz digits convert to the char*/ - case '0': case '1': case '2': + case '0': case '1': case '2': case '3': if (j == buf->size-3) { giterr_set(GITERR_INVALID, "Truncated quoted character \\%c", ch); diff --git a/tests/buf/quote.c b/tests/buf/quote.c index ed5021e25..6f77ab9c1 100644 --- a/tests/buf/quote.c +++ b/tests/buf/quote.c @@ -25,6 +25,7 @@ void test_buf_quote__quote_succeeds(void) expect_quote_pass("\"foo\\r\\nbar\"", "foo\r\nbar"); expect_quote_pass("\"foo\\177bar\"", "foo\177bar"); expect_quote_pass("\"foo\\001bar\"", "foo\001bar"); + expect_quote_pass("\"foo\\377bar\"", "foo\377bar"); } static void expect_unquote_pass(const char *expected, const char *quoted) @@ -64,6 +65,7 @@ void test_buf_quote__unquote_succeeds(void) expect_unquote_pass("foo\r\nbar", "\"foo\\015\\012bar\""); expect_unquote_pass("foo\r\nbar", "\"\\146\\157\\157\\015\\012\\142\\141\\162\""); expect_unquote_pass("newline: \n", "\"newline: \\012\""); + expect_unquote_pass("0xff: \377", "\"0xff: \\377\""); } void test_buf_quote__unquote_fails(void) @@ -76,6 +78,9 @@ void test_buf_quote__unquote_fails(void) expect_unquote_fail("\"invalid escape char \\p\""); expect_unquote_fail("\"invalid \\1 escape char \""); expect_unquote_fail("\"invalid \\14 escape char \""); + expect_unquote_fail("\"invalid \\280 escape char\""); + expect_unquote_fail("\"invalid \\378 escape char\""); + expect_unquote_fail("\"invalid \\380 escape char\""); expect_unquote_fail("\"invalid \\411 escape char\""); expect_unquote_fail("\"truncated escape char \\\""); expect_unquote_fail("\"truncated escape char \\0\"");