Fix packing of invalid UTF-8 strings

This commit is contained in:
Petri Lehtinen 2011-02-27 21:34:12 +02:00
parent 387298d4a6
commit 42b651ef56
2 changed files with 24 additions and 3 deletions

View File

@ -9,6 +9,7 @@
#include <string.h> #include <string.h>
#include <jansson.h> #include <jansson.h>
#include "jansson_private.h" #include "jansson_private.h"
#include "utf.h"
typedef struct { typedef struct {
const char *start; const char *start;
@ -110,13 +111,18 @@ static json_t *pack_object(scanner_t *s, va_list *ap)
goto error; goto error;
} }
if(!utf8_check_string(key, -1)) {
set_error(s, "<args>", "Invalid UTF-8 in object key");
goto error;
}
next_token(s); next_token(s);
value = pack(s, ap); value = pack(s, ap);
if(!value) if(!value)
goto error; goto error;
if(json_object_set_new(object, key, value)) { if(json_object_set_new_nocheck(object, key, value)) {
set_error(s, "<internal>", "Unable to add key \"%s\"", key); set_error(s, "<internal>", "Unable to add key \"%s\"", key);
goto error; goto error;
} }
@ -178,7 +184,11 @@ static json_t *pack(scanner_t *s, va_list *ap)
set_error(s, "<args>", "NULL string argument"); set_error(s, "<args>", "NULL string argument");
return NULL; return NULL;
} }
return json_string(str); if(!utf8_check_string(str, -1)) {
set_error(s, "<args>", "Invalid UTF-8 string");
return NULL;
}
return json_string_nocheck(str);
} }
case 'n': /* null */ case 'n': /* null */

View File

@ -208,14 +208,25 @@ int main()
fail("json_pack failed to catch object as key"); fail("json_pack failed to catch object as key");
check_error("Expected format 's', got '{'", "<format>", 1, 3, 3); check_error("Expected format 's', got '{'", "<format>", 1, 3, 3);
/* Complex object */
if(json_pack_ex(&error, 0, "{ s: {}, s:[ii{} }", "foo", "bar", 12, 13)) if(json_pack_ex(&error, 0, "{ s: {}, s:[ii{} }", "foo", "bar", 12, 13))
fail("json_pack failed to catch missing ]"); fail("json_pack failed to catch missing ]");
check_error("Unexpected format character '}'", "<format>", 1, 19, 19); check_error("Unexpected format character '}'", "<format>", 1, 19, 19);
/* Complex array */
if(json_pack_ex(&error, 0, "[[[[[ [[[[[ [[[[ }]]]] ]]]] ]]]]]")) if(json_pack_ex(&error, 0, "[[[[[ [[[[[ [[[[ }]]]] ]]]] ]]]]]"))
fail("json_pack failed to catch extra }"); fail("json_pack failed to catch extra }");
check_error("Unexpected format character '}'", "<format>", 1, 21, 21); check_error("Unexpected format character '}'", "<format>", 1, 21, 21);
/* Invalid UTF-8 in object key */
if(json_pack_ex(&error, 0, "{s:i}", "\xff\xff", 42))
fail("json_pack failed to catch invalid UTF-8 in an object key");
check_error("Invalid UTF-8 in object key", "<args>", 1, 2, 2);
/* Invalid UTF-8 in a string */
if(json_pack_ex(&error, 0, "{s:s}", "foo", "\xff\xff"))
fail("json_pack failed to catch invalid UTF-8 in a string");
check_error("Invalid UTF-8 string", "<args>", 1, 4, 4);
return 0; return 0;
} }