json: handle incomplete strings

If we run to the end of the string and the string is not closed,
assume it closed.
This commit is contained in:
Wim Taymans 2020-12-31 17:16:32 +01:00
parent 799bc13c85
commit d09cb1f05b
2 changed files with 14 additions and 2 deletions

View file

@ -166,7 +166,7 @@ static inline int spa_json_next(struct spa_json * iter, const char **value)
} }
if (iter->depth != 0) if (iter->depth != 0)
return -1; return -1;
if (iter->state == __BARE) { if (iter->state != __STRUCT) {
iter->state = __STRUCT; iter->state = __STRUCT;
return iter->cur - *value; return iter->cur - *value;
} }
@ -290,7 +290,7 @@ static inline int spa_json_parse_string(const char *val, int len, char *result)
result[len] = '\0'; result[len] = '\0';
return 1; return 1;
} }
for (p = val+1; p < val + len-1; p++) { for (p = val+1; p < val + len; p++) {
if (*p == '\\') { if (*p == '\\') {
p++; p++;
if (*p == 'n') if (*p == 'n')
@ -305,6 +305,8 @@ static inline int spa_json_parse_string(const char *val, int len, char *result)
*result++ = '\f'; *result++ = '\f';
else else
*result++ = *p; *result++ = *p;
} else if (*p == '\"') {
break;
} else } else
*result++ = *p; *result++ = *p;
} }

View file

@ -232,6 +232,16 @@ static void test_new_string(void)
spa_assert(!strcmp(pw_properties_get(props, "bar"), "baz")); spa_assert(!strcmp(pw_properties_get(props, "bar"), "baz"));
pw_properties_free(props); pw_properties_free(props);
props = pw_properties_new_string("foo=bar bar=\"baz");
spa_assert(props != NULL);
spa_assert(props->flags == 0);
spa_assert(props->dict.n_items == 2);
spa_assert(!strcmp(pw_properties_get(props, "foo"), "bar"));
spa_assert(!strcmp(pw_properties_get(props, "bar"), "baz"));
pw_properties_free(props);
} }
static void test_update(void) static void test_update(void)