details: https://hg.nginx.org/njs/rev/9fadb2e9c6ea branches: changeset: 2253:9fadb2e9c6ea user: Dmitry Volyntsev <xei...@nginx.com> date: Mon Jan 08 16:40:42 2024 -0800 description: Fixed external values initialization in unit tests.
Since 0.8.0 modules can create their own constructors and prototypes. A modules has two method: preinit() and init(). A module should add its constructors and prototypes in preinit() and create its own values in init(). Creating a value in preinit() results in an error. The patch fixes the issue by creating an external value in init() instead of preinit(). Found by UndefinedBehaviorSanitizer. diffstat: src/test/njs_externals_test.c | 136 ++++++++++++++++++++++------------------- 1 files changed, 72 insertions(+), 64 deletions(-) diffs (176 lines): diff -r 721475693b80 -r 9fadb2e9c6ea src/test/njs_externals_test.c --- a/src/test/njs_externals_test.c Mon Jan 08 16:40:42 2024 -0800 +++ b/src/test/njs_externals_test.c Mon Jan 08 16:40:42 2024 -0800 @@ -28,6 +28,7 @@ typedef struct { static njs_int_t njs_externals_262_init(njs_vm_t *vm); static njs_int_t njs_externals_shared_preinit(njs_vm_t *vm); +static njs_int_t njs_externals_shared_init(njs_vm_t *vm); njs_int_t njs_array_buffer_detach(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs, njs_index_t unused, njs_value_t *retval); @@ -47,7 +48,7 @@ njs_module_t njs_unit_test_262_module = njs_module_t njs_unit_test_external_module = { .name = njs_str("external"), .preinit = njs_externals_shared_preinit, - .init = NULL, + .init = njs_externals_shared_init, }; @@ -1253,77 +1254,15 @@ njs_externals_init_internal(njs_vm_t *vm { njs_int_t ret; njs_uint_t i, j; - njs_function_t *f; - njs_opaque_value_t value; njs_unit_test_req_t *requests; njs_unit_test_prop_t *prop; - static const njs_str_t external_ctor = njs_str("ExternalConstructor"); - static const njs_str_t external_null = njs_str("ExternalNull"); - static const njs_str_t external_error = njs_str("ExternalError"); - - if (shared) { - njs_external_r_proto_id = njs_vm_external_prototype(vm, - njs_unit_test_r_external, - njs_nitems(njs_unit_test_r_external)); - if (njs_slow_path(njs_external_r_proto_id < 0)) { - njs_printf("njs_vm_external_prototype() failed\n"); - return NJS_ERROR; - } - - f = njs_vm_function_alloc(vm, njs_unit_test_constructor, 1, 1); - if (f == NULL) { - njs_printf("njs_vm_function_alloc() failed\n"); - return NJS_ERROR; - } - - njs_value_function_set(njs_value_arg(&value), f); - - ret = njs_vm_bind(vm, &external_ctor, njs_value_arg(&value), 1); - if (njs_slow_path(ret != NJS_OK)) { - njs_printf("njs_vm_bind() failed\n"); - return NJS_ERROR; - } - - njs_external_null_proto_id = njs_vm_external_prototype(vm, - njs_unit_test_null_external, - njs_nitems(njs_unit_test_null_external)); - if (njs_slow_path(njs_external_null_proto_id < 0)) { - njs_printf("njs_vm_external_prototype() failed\n"); - return NJS_ERROR; - } - - ret = njs_vm_external_create(vm, njs_value_arg(&value), - njs_external_null_proto_id, NULL, 1); - if (njs_slow_path(ret != NJS_OK)) { - return NJS_ERROR; - } - - ret = njs_vm_bind(vm, &external_null, njs_value_arg(&value), 1); - if (njs_slow_path(ret != NJS_OK)) { - njs_printf("njs_vm_bind() failed\n"); - return NJS_ERROR; - } - - njs_external_error_ctor_id = - njs_vm_external_constructor(vm, &external_error, - njs_error_constructor, njs_unit_test_ctor_props, - njs_nitems(njs_unit_test_ctor_props), - njs_unit_test_proto_props, - njs_nitems(njs_unit_test_proto_props)); - if (njs_slow_path(njs_external_error_ctor_id < 0)) { - njs_printf("njs_vm_external_constructor() failed\n"); - return NJS_ERROR; - } - } - requests = njs_mp_zalloc(vm->mem_pool, n * sizeof(njs_unit_test_req_t)); if (njs_slow_path(requests == NULL)) { return NJS_ERROR; } for (i = 0; i < n; i++) { - requests[i] = init[i].request; ret = njs_vm_external_create(vm, njs_value_arg(&requests[i].value), @@ -1396,7 +1335,76 @@ njs_externals_262_init(njs_vm_t *vm) static njs_int_t njs_externals_shared_preinit(njs_vm_t *vm) { - return njs_externals_init_internal(vm, njs_test_requests, 1, 1); + static const njs_str_t external_error = njs_str("ExternalError"); + + njs_external_r_proto_id = njs_vm_external_prototype(vm, + njs_unit_test_r_external, + njs_nitems(njs_unit_test_r_external)); + if (njs_slow_path(njs_external_r_proto_id < 0)) { + njs_printf("njs_vm_external_prototype() failed\n"); + return NJS_ERROR; + } + + njs_external_null_proto_id = njs_vm_external_prototype(vm, + njs_unit_test_null_external, + njs_nitems(njs_unit_test_null_external)); + if (njs_slow_path(njs_external_null_proto_id < 0)) { + njs_printf("njs_vm_external_prototype() failed\n"); + return NJS_ERROR; + } + + njs_external_error_ctor_id = + njs_vm_external_constructor(vm, &external_error, + njs_error_constructor, njs_unit_test_ctor_props, + njs_nitems(njs_unit_test_ctor_props), + njs_unit_test_proto_props, + njs_nitems(njs_unit_test_proto_props)); + if (njs_slow_path(njs_external_error_ctor_id < 0)) { + njs_printf("njs_vm_external_constructor() failed\n"); + return NJS_ERROR; + } + + return NJS_OK; +} + + +static njs_int_t +njs_externals_shared_init(njs_vm_t *vm) +{ + njs_int_t ret; + njs_function_t *f; + njs_opaque_value_t value; + + static const njs_str_t external_ctor = njs_str("ExternalConstructor"); + static const njs_str_t external_null = njs_str("ExternalNull"); + + f = njs_vm_function_alloc(vm, njs_unit_test_constructor, 1, 1); + if (f == NULL) { + njs_printf("njs_vm_function_alloc() failed\n"); + return NJS_ERROR; + } + + njs_value_function_set(njs_value_arg(&value), f); + + ret = njs_vm_bind(vm, &external_ctor, njs_value_arg(&value), 1); + if (njs_slow_path(ret != NJS_OK)) { + njs_printf("njs_vm_bind() failed\n"); + return NJS_ERROR; + } + + ret = njs_vm_external_create(vm, njs_value_arg(&value), + njs_external_null_proto_id, NULL, 1); + if (njs_slow_path(ret != NJS_OK)) { + return NJS_ERROR; + } + + ret = njs_vm_bind(vm, &external_null, njs_value_arg(&value), 1); + if (njs_slow_path(ret != NJS_OK)) { + njs_printf("njs_vm_bind() failed\n"); + return NJS_ERROR; + } + + return njs_externals_init_internal(vm, &njs_test_requests[0], 1, 1); } _______________________________________________ nginx-devel mailing list nginx-devel@nginx.org https://mailman.nginx.org/mailman/listinfo/nginx-devel