Skip to content

Commit 19db909

Browse files
committed
fix(quickjs): fixed every public napi_* function that ignored a napi_status
1 parent 441f2aa commit 19db909

1 file changed

Lines changed: 40 additions & 14 deletions

File tree

test-app/runtime/src/main/cpp/napi/quickjs/quickjs-api.c

Lines changed: 40 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -889,7 +889,7 @@ napi_status napi_get_reference_value(napi_env env, napi_ref ref, napi_value *res
889889
CHECK_ARG(result)
890890

891891
if (!ref->referenceCount && JS_IsUndefined(ref->value)) {
892-
CreateScopedResult(env, JS_UNDEFINED, result);
892+
return CreateScopedResult(env, JS_UNDEFINED, result);
893893
}
894894

895895
JSValue value;
@@ -1270,7 +1270,9 @@ napi_create_external(napi_env env, void *data, napi_finalize finalize_cb, void *
12701270

12711271
JS_SetOpaque(object, externalInfo);
12721272

1273-
napi_status status = CreateScopedResult(env, object, result);
1273+
// On failure CreateScopedResult frees `object`, which runs the external
1274+
// finalizer and frees `externalInfo`; do not touch it afterwards.
1275+
CHECK_NAPI(CreateScopedResult(env, object, result));
12741276

12751277
externalInfo->finalizeCallback = finalize_cb;
12761278

@@ -1784,7 +1786,7 @@ napi_status napi_get_typedarray_info(napi_env env,
17841786
}
17851787

17861788
if (arraybuffer) {
1787-
CreateScopedResult(env, jsArrayBuffer, arraybuffer);
1789+
CHECK_NAPI(CreateScopedResult(env, jsArrayBuffer, arraybuffer));
17881790
} else {
17891791
JS_FreeValue(env->context, jsArrayBuffer);
17901792
}
@@ -1830,7 +1832,7 @@ napi_status napi_get_dataview_info(napi_env env,
18301832
}
18311833

18321834
if (arraybuffer) {
1833-
CreateScopedResult(env, jsArrayBuffer, arraybuffer);
1835+
CHECK_NAPI(CreateScopedResult(env, jsArrayBuffer, arraybuffer));
18341836
} else {
18351837
JS_FreeValue(env->context, jsArrayBuffer);
18361838
}
@@ -2981,7 +2983,7 @@ napi_status napi_delete_element(napi_env env, napi_value object, uint32_t index,
29812983
return napi_clear_last_error(env);
29822984
}
29832985

2984-
static inline void
2986+
static inline napi_status
29852987
napi_set_property_descriptor(napi_env env, napi_value object, napi_property_descriptor descriptor) {
29862988
JSAtom key;
29872989

@@ -3016,15 +3018,25 @@ napi_set_property_descriptor(napi_env env, napi_value object, napi_property_desc
30163018
} else if (descriptor.method) {
30173019
flags |= JS_PROP_HAS_VALUE;
30183020
napi_value function = NULL;
3019-
napi_create_function(env, descriptor.utf8name, NAPI_AUTO_LENGTH, descriptor.method, descriptor.data, &function);
3021+
napi_status status = napi_create_function(env, descriptor.utf8name, NAPI_AUTO_LENGTH,
3022+
descriptor.method, descriptor.data, &function);
3023+
if (status != napi_ok) {
3024+
JS_FreeAtom(env->context, key);
3025+
return napi_set_last_error(env, status, NULL, 0, NULL);
3026+
}
30203027
if (function) {
30213028
value = *((JSValue *) function);
30223029
}
30233030
} else if (descriptor.getter || descriptor.setter) {
30243031
if (descriptor.getter) {
30253032
napi_value getter = NULL;
30263033
flags |= JS_PROP_HAS_GET;
3027-
napi_create_function(env, descriptor.utf8name, NAPI_AUTO_LENGTH, descriptor.getter, descriptor.data, &getter);
3034+
napi_status status = napi_create_function(env, descriptor.utf8name, NAPI_AUTO_LENGTH,
3035+
descriptor.getter, descriptor.data, &getter);
3036+
if (status != napi_ok) {
3037+
JS_FreeAtom(env->context, key);
3038+
return napi_set_last_error(env, status, NULL, 0, NULL);
3039+
}
30283040
if (getter) {
30293041
getterValue = *((JSValue *) getter);
30303042
}
@@ -3033,7 +3045,12 @@ napi_set_property_descriptor(napi_env env, napi_value object, napi_property_desc
30333045
if (descriptor.setter) {
30343046
napi_value setter = NULL;
30353047
flags |= JS_PROP_HAS_SET;
3036-
napi_create_function(env, descriptor.utf8name, NAPI_AUTO_LENGTH, descriptor.setter, descriptor.data, &setter);
3048+
napi_status status = napi_create_function(env, descriptor.utf8name, NAPI_AUTO_LENGTH,
3049+
descriptor.setter, descriptor.data, &setter);
3050+
if (status != napi_ok) {
3051+
JS_FreeAtom(env->context, key);
3052+
return napi_set_last_error(env, status, NULL, 0, NULL);
3053+
}
30373054
if (setter) {
30383055
setterValue = *((JSValue *) setter);
30393056
}
@@ -3042,6 +3059,8 @@ napi_set_property_descriptor(napi_env env, napi_value object, napi_property_desc
30423059

30433060
JS_DefineProperty(env->context, jsObject, key, value, getterValue, setterValue, flags);
30443061
JS_FreeAtom(env->context, key);
3062+
3063+
return napi_clear_last_error(env);
30453064
}
30463065

30473066
napi_status napi_define_properties(napi_env env, napi_value object, size_t property_count,
@@ -3057,7 +3076,7 @@ napi_status napi_define_properties(napi_env env, napi_value object, size_t prope
30573076
}
30583077

30593078
for (size_t i = 0; i < property_count; i++) {
3060-
napi_set_property_descriptor(env, object, properties[i]);
3079+
CHECK_NAPI(napi_set_property_descriptor(env, object, properties[i]));
30613080
}
30623081

30633082
return napi_clear_last_error(env);
@@ -3455,10 +3474,17 @@ napi_status napi_define_class(napi_env env,
34553474
JS_SetConstructor(env->context, cls, prototype);
34563475

34573476
for (size_t i = 0; i < property_count; i++) {
3477+
napi_status status;
34583478
if (properties[i].attributes & napi_static) {
3459-
napi_set_property_descriptor(env, (napi_value) &cls, properties[i]);
3479+
status = napi_set_property_descriptor(env, (napi_value) &cls, properties[i]);
34603480
} else {
3461-
napi_set_property_descriptor(env, (napi_value) &prototype, properties[i]);
3481+
status = napi_set_property_descriptor(env, (napi_value) &prototype, properties[i]);
3482+
}
3483+
if (status != napi_ok) {
3484+
JS_FreeValue(env->context, external);
3485+
JS_FreeValue(env->context, prototype);
3486+
JS_FreeValue(env->context, cls);
3487+
return napi_set_last_error(env, status, NULL, 0, NULL);
34623488
}
34633489
}
34643490

@@ -3507,7 +3533,7 @@ napi_wrap(napi_env env, napi_value jsObject, void *nativeObject, napi_finalize f
35073533

35083534
if (result) {
35093535
napi_ref ref;
3510-
napi_create_reference(env, jsObject, 0, &ref);
3536+
CHECK_NAPI(napi_create_reference(env, jsObject, 0, &ref));
35113537
*result = ref;
35123538
}
35133539

@@ -3636,7 +3662,7 @@ napi_add_finalizer(napi_env env, napi_value jsObject, void *nativeObject, napi_f
36363662

36373663
if (result) {
36383664
napi_ref ref;
3639-
napi_create_reference(env, jsObject, 0, &ref);
3665+
CHECK_NAPI(napi_create_reference(env, jsObject, 0, &ref));
36403666
*result = ref;
36413667
}
36423668

@@ -4376,7 +4402,7 @@ napi_status qjs_execute_script(napi_env env,
43764402
}
43774403

43784404
if (result) {
4379-
CreateScopedResult(env, eval_result, result);
4405+
CHECK_NAPI(CreateScopedResult(env, eval_result, result));
43804406
} else {
43814407
JS_FreeValue(env->context, eval_result);
43824408
}

0 commit comments

Comments
 (0)