From: Fabrice Bellard Date: Sat, 31 Oct 2026 12:50:55 +0000 (+0100) Subject: fixed JS_AutoInitProperty() behavior when out of memory (#580) X-Git-Url: https://git.kaiwu.me/?a=commitdiff_plain;h=5febaaa49f4558b93bd637b1bea7473db5a2880e;p=quickjs.git fixed JS_AutoInitProperty() behavior when out of memory (#580) --- diff --git a/quickjs.c b/quickjs.c index 5c84c8b..420b43d 100644 --- a/quickjs.c +++ b/quickjs.c @@ -8299,14 +8299,13 @@ static int JS_AutoInitProperty(JSContext *ctx, JSObject *p, JSAtom prop, func = js_autoinit_func_table[id]; /* 'func' shall not modify the object properties 'pr' */ val = func(realm, p, prop, pr->u.init.opaque); - js_autoinit_free(ctx->rt, pr); - prs->flags &= ~JS_PROP_TMASK; - pr->u.value = JS_UNDEFINED; if (JS_IsException(val)) return -1; if (id == JS_AUTOINIT_ID_MODULE_NS && JS_VALUE_GET_TAG(val) == JS_TAG_STRING) { /* WARNING: a varref is returned as a string ! */ + js_autoinit_free(ctx->rt, pr); + prs->flags &= ~JS_PROP_TMASK; prs->flags |= JS_PROP_VARREF; pr->u.var_ref = JS_VALUE_GET_PTR(val); js_rc(pr->u.var_ref)->ref_count++; @@ -8314,13 +8313,20 @@ static int JS_AutoInitProperty(JSContext *ctx, JSObject *p, JSAtom prop, JSVarRef *var_ref; /* in the global object we use references */ var_ref = js_create_var_ref(ctx, FALSE); - if (!var_ref) + if (!var_ref) { + JS_FreeValue(ctx, val); return -1; + } + js_autoinit_free(ctx->rt, pr); + prs->flags &= ~JS_PROP_TMASK; prs->flags |= JS_PROP_VARREF; pr->u.var_ref = var_ref; var_ref->value = val; var_ref->is_const = !(prs->flags & JS_PROP_WRITABLE); } else { + js_autoinit_free(ctx->rt, pr); + prs->flags &= ~JS_PROP_TMASK; + pr->u.value = JS_UNDEFINED; pr->u.value = val; } return 0; @@ -9973,8 +9979,10 @@ int JS_SetPropertyInternal(JSContext *ctx, JSValueConst obj, return call_setter(ctx, pr->u.getset.setter, this_obj, val, flags); } else if ((prs->flags & JS_PROP_TMASK) == JS_PROP_AUTOINIT) { /* Instantiate property and retry (potentially useless) */ - if (JS_AutoInitProperty(ctx, p1, prop, pr, prs)) + if (JS_AutoInitProperty(ctx, p1, prop, pr, prs)) { + JS_FreeValue(ctx, val); return -1; + } goto retry2; } else if (!(prs->flags & JS_PROP_WRITABLE)) { goto read_only_prop;