Fix packing of invalid UTF-8 strings
This commit is contained in:
parent
387298d4a6
commit
42b651ef56
@ -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 */
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user