mirror of
https://github.com/systemd/systemd
synced 2024-10-07 00:30:59 +00:00
util: fix unicode decoding in unquote_first_word()
This commit is contained in:
parent
f3ee629711
commit
8ebac1f9a6
|
@ -7284,7 +7284,7 @@ int unquote_first_word(const char **p, char **ret, UnquoteFlags flags) {
|
|||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (!GREEDY_REALLOC(s, allocated, sz+2))
|
||||
if (!GREEDY_REALLOC(s, allocated, sz+7))
|
||||
return -ENOMEM;
|
||||
|
||||
if (flags & UNQUOTE_CUNESCAPE) {
|
||||
|
@ -7299,7 +7299,7 @@ int unquote_first_word(const char **p, char **ret, UnquoteFlags flags) {
|
|||
if (c != 0)
|
||||
s[sz++] = c; /* normal explicit char */
|
||||
else
|
||||
sz += utf8_encode_unichar(s, u); /* unicode chars we'll encode as utf8 */
|
||||
sz += utf8_encode_unichar(s + sz, u); /* unicode chars we'll encode as utf8 */
|
||||
} else
|
||||
s[sz++] = c;
|
||||
|
||||
|
@ -7331,7 +7331,7 @@ int unquote_first_word(const char **p, char **ret, UnquoteFlags flags) {
|
|||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (!GREEDY_REALLOC(s, allocated, sz+2))
|
||||
if (!GREEDY_REALLOC(s, allocated, sz+7))
|
||||
return -ENOMEM;
|
||||
|
||||
if (flags & UNQUOTE_CUNESCAPE) {
|
||||
|
@ -7346,7 +7346,7 @@ int unquote_first_word(const char **p, char **ret, UnquoteFlags flags) {
|
|||
if (c != 0)
|
||||
s[sz++] = c;
|
||||
else
|
||||
sz += utf8_encode_unichar(s, u);
|
||||
sz += utf8_encode_unichar(s + sz, u);
|
||||
} else
|
||||
s[sz++] = c;
|
||||
|
||||
|
@ -7376,7 +7376,7 @@ int unquote_first_word(const char **p, char **ret, UnquoteFlags flags) {
|
|||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (!GREEDY_REALLOC(s, allocated, sz+2))
|
||||
if (!GREEDY_REALLOC(s, allocated, sz+7))
|
||||
return -ENOMEM;
|
||||
|
||||
if (flags & UNQUOTE_CUNESCAPE) {
|
||||
|
@ -7391,7 +7391,7 @@ int unquote_first_word(const char **p, char **ret, UnquoteFlags flags) {
|
|||
if (c != 0)
|
||||
s[sz++] = c;
|
||||
else
|
||||
sz += utf8_encode_unichar(s, u);
|
||||
sz += utf8_encode_unichar(s + sz, u);
|
||||
} else
|
||||
s[sz++] = c;
|
||||
|
||||
|
|
|
@ -1376,6 +1376,17 @@ static void test_unquote_first_word(void) {
|
|||
assert_se(streq(t, "foobax6ar"));
|
||||
free(t);
|
||||
assert_se(p == original + 13);
|
||||
|
||||
p = original = " f\\u00f6o \"pi\\U0001F4A9le\" ";
|
||||
assert_se(unquote_first_word(&p, &t, UNQUOTE_CUNESCAPE) > 0);
|
||||
assert_se(streq(t, "föo"));
|
||||
free(t);
|
||||
assert_se(p == original + 13);
|
||||
|
||||
assert_se(unquote_first_word(&p, &t, UNQUOTE_CUNESCAPE) > 0);
|
||||
assert_se(streq(t, "pi\360\237\222\251le"));
|
||||
free(t);
|
||||
assert_se(p == original + 32);
|
||||
}
|
||||
|
||||
static void test_unquote_many_words(void) {
|
||||
|
|
Loading…
Reference in a new issue