X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=lib%2Fjson.c;h=0a8bca27814ba692f817878dc2ccefca83e7e599;hb=1b807595c4e6b4348444852bda8814e92412ad41;hp=0339a368d960268981810677f1f0d2bd913d197f;hpb=36d802ae1fd61d5ae3bfa1b114b8f3a911d987e5;p=sliver-openvswitch.git diff --git a/lib/json.c b/lib/json.c index 0339a368d..0a8bca278 100644 --- a/lib/json.c +++ b/lib/json.c @@ -277,7 +277,7 @@ json_real_create(double real) void json_object_put(struct json *json, const char *name, struct json *value) { - shash_add(json->u.object, name, value); + json_destroy(shash_replace(json->u.object, name, value)); } void @@ -607,7 +607,6 @@ json_lex_number(struct json_parser *p) const char *cp = ds_cstr(&p->buffer); unsigned long long int significand = 0; struct json_token token; - int sig_digits = 0; bool imprecise = false; bool negative = false; int pow10 = 0; @@ -621,7 +620,6 @@ json_lex_number(struct json_parser *p) /* At least one integer digit, but 0 may not be used as a leading digit for * a longer number. */ significand = 0; - sig_digits = 0; if (*cp == '0') { cp++; if (isdigit(*cp)) { @@ -632,7 +630,6 @@ json_lex_number(struct json_parser *p) do { if (significand <= ULLONG_MAX / 10) { significand = significand * 10 + (*cp - '0'); - sig_digits++; } else { pow10++; if (*cp != '0') { @@ -656,7 +653,6 @@ json_lex_number(struct json_parser *p) do { if (significand <= ULLONG_MAX / 10) { significand = significand * 10 + (*cp - '0'); - sig_digits++; pow10--; } else if (*cp != '0') { imprecise = true; @@ -709,7 +705,6 @@ json_lex_number(struct json_parser *p) * * We suppress negative zeros as a matter of policy. */ if (!significand) { - struct json_token token; token.type = T_INTEGER; token.u.integer = 0; json_parser_input(p, &token); @@ -719,12 +714,10 @@ json_lex_number(struct json_parser *p) if (!imprecise) { while (pow10 > 0 && significand < ULLONG_MAX / 10) { significand *= 10; - sig_digits++; pow10--; } while (pow10 < 0 && significand % 10 == 0) { significand /= 10; - sig_digits--; pow10++; } if (pow10 == 0 @@ -753,19 +746,15 @@ json_lex_number(struct json_parser *p) static const char * json_lex_4hex(const char *cp, const char *end, int *valuep) { - int value, i; + unsigned int value; if (cp + 4 > end) { return "quoted string ends within \\u escape"; } - value = 0; - for (i = 0; i < 4; i++) { - unsigned char c = *cp++; - if (!isxdigit(c)) { - return "malformed \\u escape"; - } - value = (value << 4) | hexit_value(c); + value = hexits_value(cp, 4, NULL); + if (value == UINT_MAX) { + return "malformed \\u escape"; } if (!value) { return "null bytes not supported in quoted strings"; @@ -832,7 +821,7 @@ json_string_unescape(const char *in, size_t in_len, char **outp) while (in < end) { if (*in == '"') { ds_clear(&out); - ds_put_cstr(&out, "quoted string may not include unescape \""); + ds_put_cstr(&out, "quoted string may not include unescaped \""); goto exit; } if (*in != '\\') { @@ -1192,7 +1181,7 @@ json_parser_put_value(struct json_parser *p, struct json *value) } } -static struct json_parser_node * +static void json_parser_push(struct json_parser *p, struct json *new_json, enum json_parse_state new_state) { @@ -1211,11 +1200,10 @@ json_parser_push(struct json_parser *p, node = &p->stack[p->height++]; node->json = new_json; p->parse_state = new_state; - return node; } else { + json_destroy(new_json); json_error(p, "input exceeds maximum nesting depth %d", JSON_MAX_HEIGHT); - return NULL; } }