From: Dmitry Volyntsev Date: Wed, 27 Nov 2019 12:40:44 +0000 (+0300) Subject: Checking extensible flag in ValidateAndApplyPropertyDescriptor(). X-Git-Tag: 0.3.8~45 X-Git-Url: http://www.kaiwu.me/postgresql/commit/?a=commitdiff_plain;h=78dc18d8c7da8ada31269c24b57b227ef22f5763;p=njs.git Checking extensible flag in ValidateAndApplyPropertyDescriptor(). --- diff --git a/src/njs_object.c b/src/njs_object.c index 7ab79c21..7980ba8e 100644 --- a/src/njs_object.c +++ b/src/njs_object.c @@ -1232,15 +1232,7 @@ njs_object_define_property(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs, njs_value_t *value, *name, *desc, lvalue; if (!njs_is_object(njs_arg(args, nargs, 1))) { - njs_type_error(vm, "cannot convert %s argument to object", - njs_type_string(njs_arg(args, nargs, 1)->type)); - return NJS_ERROR; - } - - value = njs_argument(args, 1); - - if (!njs_object(value)->extensible) { - njs_type_error(vm, "object is not extensible"); + njs_type_error(vm, "Object.defineProperty is called on non-object"); return NJS_ERROR; } @@ -1251,6 +1243,7 @@ njs_object_define_property(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs, return NJS_ERROR; } + value = njs_argument(args, 1); name = njs_lvalue_arg(&lvalue, args, nargs, 2); ret = njs_object_prop_define(vm, value, name, desc, @@ -1276,18 +1269,12 @@ njs_object_define_properties(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs, njs_object_prop_t *prop; if (!njs_is_object(njs_arg(args, nargs, 1))) { - njs_type_error(vm, "cannot convert %s argument to object", - njs_type_string(njs_arg(args, nargs, 1)->type)); + njs_type_error(vm, "Object.defineProperties is called on non-object"); return NJS_ERROR; } value = njs_argument(args, 1); - if (!njs_object(value)->extensible) { - njs_type_error(vm, "object is not extensible"); - return NJS_ERROR; - } - desc = njs_arg(args, nargs, 2); if (!njs_is_object(desc)) { diff --git a/src/njs_object_prop.c b/src/njs_object_prop.c index 43112765..36379b0a 100644 --- a/src/njs_object_prop.c +++ b/src/njs_object_prop.c @@ -157,6 +157,12 @@ njs_object_prop_define(njs_vm_t *vm, njs_value_t *object, if (njs_fast_path(ret == NJS_DECLINED)) { + if (!njs_object(object)->extensible) { + njs_type_error(vm, "Cannot add property \"%V\", " + "object is not extensible", &pq.lhq.key); + return NJS_ERROR; + } + /* 6.2.5.6 CompletePropertyDescriptor */ if (njs_is_accessor_descriptor(prop)) { diff --git a/src/njs_value.c b/src/njs_value.c index 001c566c..7ca818e0 100644 --- a/src/njs_value.c +++ b/src/njs_value.c @@ -719,6 +719,10 @@ njs_array_property_query(njs_vm_t *vm, njs_property_query_t *pq, return NJS_DECLINED; } + if (!array->object.extensible) { + return NJS_DECLINED; + } + size = index - array->length; ret = njs_array_expand(vm, array, 0, size + 1); diff --git a/src/test/njs_unit_test.c b/src/test/njs_unit_test.c index 7d91d739..0229870d 100644 --- a/src/test/njs_unit_test.c +++ b/src/test/njs_unit_test.c @@ -11074,7 +11074,7 @@ static njs_unit_test_t njs_test[] = njs_str("2") }, { njs_str("var o = {}; Object.defineProperty()"), - njs_str("TypeError: cannot convert undefined argument to object") }, + njs_str("TypeError: Object.defineProperty is called on non-object") }, { njs_str("var o = {}; Object.defineProperty(o)"), njs_str("TypeError: descriptor is not an object") }, @@ -11187,14 +11187,23 @@ static njs_unit_test_t njs_test[] = njs_str("true") }, { njs_str("Object.defineProperties()"), - njs_str("TypeError: cannot convert undefined argument to object") }, + njs_str("TypeError: Object.defineProperties is called on non-object") }, { njs_str("Object.defineProperties(1, {})"), - njs_str("TypeError: cannot convert number argument to object") }, + njs_str("TypeError: Object.defineProperties is called on non-object") }, { njs_str("Object.defineProperties({}, 1)"), njs_str("TypeError: descriptor is not an object") }, + { njs_str("Object.defineProperties(Object.freeze({b:1}), {b:{value:1}}).b"), + njs_str("1") }, + + { njs_str("Object.defineProperties(Object.freeze({b:1}), {b:{value:2}})"), + njs_str("TypeError: Cannot redefine property: \"b\"") }, + + { njs_str("Object.defineProperties(Object.freeze({b:1}), {c:{value:1}})"), + njs_str("TypeError: Cannot add property \"c\", object is not extensible") }, + { njs_str("var o = {a:1}; o.hasOwnProperty('a')"), njs_str("true") }, @@ -11679,10 +11688,10 @@ static njs_unit_test_t njs_test[] = njs_str("name,length") }, { njs_str("Object.defineProperty(Object.freeze({}), 'b', {})"), - njs_str("TypeError: object is not extensible") }, + njs_str("TypeError: Cannot add property \"b\", object is not extensible") }, { njs_str("Object.defineProperties(Object.freeze({}), {b:{}})"), - njs_str("TypeError: object is not extensible") }, + njs_str("TypeError: Cannot add property \"b\", object is not extensible") }, { njs_str("Object.freeze()"), njs_str("undefined") }, @@ -11707,7 +11716,7 @@ static njs_unit_test_t njs_test[] = { njs_str("var a = Object.freeze([1,2]);" "Object.defineProperty(a, 'a', {value:1}).a"), - njs_str("TypeError: object is not extensible") }, + njs_str("TypeError: Cannot add property \"a\", object is not extensible") }, { njs_str("var a = [1,2]; a.a = 1; Object.freeze(a); delete a.a"), njs_str("TypeError: Cannot delete property \"a\" of array") }, @@ -11723,7 +11732,7 @@ static njs_unit_test_t njs_test[] = { njs_str("var f = Object.freeze(function() {});" "Object.defineProperty(f, 'a', {value:1}).a"), - njs_str("TypeError: object is not extensible") }, + njs_str("TypeError: Cannot add property \"a\", object is not extensible") }, { njs_str("var f = function() {}; f.a = 1; Object.freeze(f); delete f.a"), njs_str("TypeError: Cannot delete property \"a\" of function") }, @@ -11739,7 +11748,7 @@ static njs_unit_test_t njs_test[] = { njs_str("var d = Object.freeze(new Date(''));" "Object.defineProperty(d, 'a', {value:1}).a"), - njs_str("TypeError: object is not extensible") }, + njs_str("TypeError: Cannot add property \"a\", object is not extensible") }, { njs_str("var d = new Date(''); d.a = 1; Object.freeze(d);" "delete d.a"), @@ -11756,7 +11765,7 @@ static njs_unit_test_t njs_test[] = { njs_str("var r = Object.freeze(new RegExp(''));" "Object.defineProperty(r, 'a', {value:1}).a"), - njs_str("TypeError: object is not extensible") }, + njs_str("TypeError: Cannot add property \"a\", object is not extensible") }, { njs_str("var r = new RegExp(''); r.a = 1; Object.freeze(r); delete r.a"), njs_str("TypeError: Cannot delete property \"a\" of regexp") }, @@ -11918,11 +11927,11 @@ static njs_unit_test_t njs_test[] = { njs_str("var o = Object.preventExtensions({a:1});" "Object.defineProperty(o, 'b', {value:1})"), - njs_str("TypeError: object is not extensible") }, + njs_str("TypeError: Cannot add property \"b\", object is not extensible") }, { njs_str("var o = Object.preventExtensions({a:1});" "Object.defineProperties(o, {b:{value:1}})"), - njs_str("TypeError: object is not extensible") }, + njs_str("TypeError: Cannot add property \"b\", object is not extensible") }, { njs_str("var o = Object.preventExtensions({a:1}); o.a = 2; o.a"), njs_str("2") }, @@ -11948,6 +11957,12 @@ static njs_unit_test_t njs_test[] = { njs_str("Object.isExtensible([])"), njs_str("true") }, + { njs_str("var arrObj = [];Object.preventExtensions(arrObj); arrObj[1] = 1"), + njs_str("TypeError: Cannot add property \"1\", object is not extensible") }, + + { njs_str("var arrObj = [1,2];Object.preventExtensions(arrObj); arrObj[1] = 1"), + njs_str("1") }, + { njs_str("Object.isExtensible(function() {})"), njs_str("true") },