mirror of
https://github.com/json-c/json-c.git
synced 2026-04-06 22:09:06 +08:00
Fix issue #53 - ensure explicit length string are still NUL terminated, and fix json_tokener_parse() to work properly with embedded unicode \u0000 values in strings.
Adjust test_null to check for this case. See also http://bugs.debian.org/687269
This commit is contained in:
@@ -620,8 +620,9 @@ struct json_object* json_object_new_string_len(const char *s, int len)
|
|||||||
if(!jso) return NULL;
|
if(!jso) return NULL;
|
||||||
jso->_delete = &json_object_string_delete;
|
jso->_delete = &json_object_string_delete;
|
||||||
jso->_to_json_string = &json_object_string_to_json_string;
|
jso->_to_json_string = &json_object_string_to_json_string;
|
||||||
jso->o.c_string.str = (char*)malloc(len);
|
jso->o.c_string.str = (char*)malloc(len + 1);
|
||||||
memcpy(jso->o.c_string.str, (void *)s, len);
|
memcpy(jso->o.c_string.str, (void *)s, len);
|
||||||
|
jso->o.c_string.str[len] = '\0';
|
||||||
jso->o.c_string.len = len;
|
jso->o.c_string.len = len;
|
||||||
return jso;
|
return jso;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -393,7 +393,7 @@ struct json_object* json_tokener_parse_ex(struct json_tokener *tok,
|
|||||||
while(1) {
|
while(1) {
|
||||||
if(c == tok->quote_char) {
|
if(c == tok->quote_char) {
|
||||||
printbuf_memappend_fast(tok->pb, case_start, str-case_start);
|
printbuf_memappend_fast(tok->pb, case_start, str-case_start);
|
||||||
current = json_object_new_string(tok->pb->buf);
|
current = json_object_new_string_len(tok->pb->buf, tok->pb->bpos);
|
||||||
saved_state = json_tokener_state_finish;
|
saved_state = json_tokener_state_finish;
|
||||||
state = json_tokener_state_eatws;
|
state = json_tokener_state_eatws;
|
||||||
break;
|
break;
|
||||||
|
|||||||
@@ -8,6 +8,7 @@
|
|||||||
|
|
||||||
#include "json_inttypes.h"
|
#include "json_inttypes.h"
|
||||||
#include "json_object.h"
|
#include "json_object.h"
|
||||||
|
#include "json_tokener.h"
|
||||||
|
|
||||||
int main()
|
int main()
|
||||||
{
|
{
|
||||||
@@ -33,5 +34,24 @@ int main()
|
|||||||
retval=1;
|
retval=1;
|
||||||
}
|
}
|
||||||
json_object_put(string);
|
json_object_put(string);
|
||||||
|
|
||||||
|
struct json_object *parsed_str = json_tokener_parse(expected);
|
||||||
|
if (parsed_str)
|
||||||
|
{
|
||||||
|
int parsed_len = json_object_get_string_len(parsed_str);
|
||||||
|
const char *parsed_cstr = json_object_get_string(parsed_str);
|
||||||
|
int ii;
|
||||||
|
printf("Re-parsed object string len=%d, chars=[", parsed_len);
|
||||||
|
for (ii = 0; ii < parsed_len ; ii++)
|
||||||
|
{
|
||||||
|
printf("%s%d", (ii ? ", " : ""), (int)parsed_cstr[ii]);
|
||||||
|
}
|
||||||
|
printf("]\n");
|
||||||
|
json_object_put(parsed_str);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
printf("ERROR: failed to parse\n");
|
||||||
|
}
|
||||||
return retval;
|
return retval;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user