mirror of
https://git.proxmox.com/git/libgit2
synced 2025-05-30 00:04:03 +00:00
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.
This commit is contained in:
parent
0267c34c0c
commit
8cb27223b8
@ -901,7 +901,7 @@ int git_buf_quote(git_buf *buf)
|
|||||||
/* escape anything unprintable as octal */
|
/* escape anything unprintable as octal */
|
||||||
else if (buf->ptr[i] != ' ' &&
|
else if (buf->ptr[i] != ' ' &&
|
||||||
(buf->ptr[i] < '!' || 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! */
|
/* yay, printable! */
|
||||||
@ -959,7 +959,7 @@ int git_buf_unquote(git_buf *buf)
|
|||||||
case 'v': ch = '\v'; break;
|
case 'v': ch = '\v'; break;
|
||||||
|
|
||||||
/* \xyz digits convert to the char*/
|
/* \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) {
|
if (j == buf->size-3) {
|
||||||
giterr_set(GITERR_INVALID,
|
giterr_set(GITERR_INVALID,
|
||||||
"Truncated quoted character \\%c", ch);
|
"Truncated quoted character \\%c", ch);
|
||||||
|
@ -25,6 +25,7 @@ void test_buf_quote__quote_succeeds(void)
|
|||||||
expect_quote_pass("\"foo\\r\\nbar\"", "foo\r\nbar");
|
expect_quote_pass("\"foo\\r\\nbar\"", "foo\r\nbar");
|
||||||
expect_quote_pass("\"foo\\177bar\"", "foo\177bar");
|
expect_quote_pass("\"foo\\177bar\"", "foo\177bar");
|
||||||
expect_quote_pass("\"foo\\001bar\"", "foo\001bar");
|
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)
|
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", "\"foo\\015\\012bar\"");
|
||||||
expect_unquote_pass("foo\r\nbar", "\"\\146\\157\\157\\015\\012\\142\\141\\162\"");
|
expect_unquote_pass("foo\r\nbar", "\"\\146\\157\\157\\015\\012\\142\\141\\162\"");
|
||||||
expect_unquote_pass("newline: \n", "\"newline: \\012\"");
|
expect_unquote_pass("newline: \n", "\"newline: \\012\"");
|
||||||
|
expect_unquote_pass("0xff: \377", "\"0xff: \\377\"");
|
||||||
}
|
}
|
||||||
|
|
||||||
void test_buf_quote__unquote_fails(void)
|
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 escape char \\p\"");
|
||||||
expect_unquote_fail("\"invalid \\1 escape char \"");
|
expect_unquote_fail("\"invalid \\1 escape char \"");
|
||||||
expect_unquote_fail("\"invalid \\14 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("\"invalid \\411 escape char\"");
|
||||||
expect_unquote_fail("\"truncated escape char \\\"");
|
expect_unquote_fail("\"truncated escape char \\\"");
|
||||||
expect_unquote_fail("\"truncated escape char \\0\"");
|
expect_unquote_fail("\"truncated escape char \\0\"");
|
||||||
|
Loading…
Reference in New Issue
Block a user