From: Alexander Borisov Date: Wed, 26 Feb 2020 09:41:51 +0000 (+0300) Subject: Fixed handling of space argument in JSON.stringify(). X-Git-Url: http://www.kaiwu.me/postgresql/commit/?a=commitdiff_plain;h=c4a56693b99711c4575eaf573810e629b034bf75;p=njs.git Fixed handling of space argument in JSON.stringify(). This closes #294 issue on GitHub. --- diff --git a/src/njs_json.c b/src/njs_json.c index 52c52b55..2f8e86c4 100644 --- a/src/njs_json.c +++ b/src/njs_json.c @@ -187,10 +187,13 @@ static njs_int_t njs_json_stringify(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs, njs_index_t unused) { + size_t length; double num; njs_int_t i; njs_int_t ret; njs_value_t *replacer, *space; + const u_char *p; + njs_string_prop_t prop; njs_json_stringify_t *stringify, json_stringify; stringify = &json_stringify; @@ -220,8 +223,23 @@ njs_json_stringify(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs, if (njs_is_string(space) || njs_is_number(space)) { if (njs_is_string(space)) { - njs_string_get(space, &stringify->space); - stringify->space.length = njs_min(stringify->space.length, 10); + length = njs_string_prop(&prop, space); + + if (njs_is_byte_string(&prop)) { + njs_internal_error(vm, "space argument cannot be" + " a byte string"); + return NJS_ERROR; + } + + if (length > 10) { + p = njs_string_offset(prop.start, prop.start + prop.size, 10); + + } else { + p = prop.start + prop.size; + } + + stringify->space.start = prop.start; + stringify->space.length = p - prop.start; } else { num = njs_number(space); diff --git a/src/test/njs_unit_test.c b/src/test/njs_unit_test.c index c8f65abe..0b5b9037 100644 --- a/src/test/njs_unit_test.c +++ b/src/test/njs_unit_test.c @@ -15674,6 +15674,18 @@ static njs_unit_test_t njs_test[] = { njs_str("JSON.stringify([{a:1,b:{c:2}},1], undefined, new Date())"), njs_str("[{\"a\":1,\"b\":{\"c\":2}},1]") }, + { njs_str("JSON.stringify([], null, '!βββββ').length"), + njs_str("10") }, + + { njs_str("JSON.stringify([], null, '!!βββββββββββββββββ').length"), + njs_str("14") }, + + { njs_str("JSON.stringify([], null, '!βββββββββββββββββ').length"), + njs_str("14") }, + + { njs_str("JSON.stringify([], null, String.bytesFrom([0x9d])).length"), + njs_str("InternalError: space argument cannot be a byte string") }, + { njs_str("var o = Object.defineProperty({}, 'a', { get() { return ()=> 1}, enumerable: true });" "JSON.stringify(o)"), njs_str("{}") },