[njs] QuickJS: fix exception handling during configuration phase.
noreply at nginx.com
noreply at nginx.com
Thu Apr 3 04:11:02 UTC 2025
details: https://github.com/nginx/njs/commit/a4d0f9478dc0fb5c0cd5e9003a208ca3fb8ecb15
branches: master
commit: a4d0f9478dc0fb5c0cd5e9003a208ca3fb8ecb15
user: Zhidao HONG <z.hong at f5.com>
date: Thu, 3 Apr 2025 11:44:57 +0800
description:
QuickJS: fix exception handling during configuration phase.
The issue was introduced in 9010aee (not released yet).
---
nginx/ngx_js.c | 50 +++++++++++++++++++++-----------------------
nginx/ngx_js.h | 2 +-
nginx/ngx_stream_js_module.c | 2 +-
3 files changed, 26 insertions(+), 28 deletions(-)
diff --git a/nginx/ngx_js.c b/nginx/ngx_js.c
index c91a5530..ba0fee92 100644
--- a/nginx/ngx_js.c
+++ b/nginx/ngx_js.c
@@ -101,7 +101,7 @@ static void ngx_qjs_rejection_tracker(JSContext *ctx, JSValueConst promise,
JSValueConst reason, JS_BOOL is_handled, void *opaque);
static JSValue ngx_qjs_value(JSContext *cx, const ngx_str_t *path);
-static ngx_int_t ngx_qjs_dump_obj(JSContext *cx, JSValueConst val,
+static ngx_int_t ngx_qjs_dump_obj(ngx_engine_t *e, JSValueConst val,
ngx_str_t *dst);
static JSModuleDef *ngx_qjs_core_init(JSContext *cx, const char *name);
@@ -849,7 +849,7 @@ ngx_engine_qjs_compile(ngx_js_loc_conf_t *conf, ngx_log_t *log, u_char *start,
JS_EVAL_TYPE_MODULE | JS_EVAL_FLAG_COMPILE_ONLY);
if (JS_IsException(code)) {
- ngx_qjs_exception(cx, &text);
+ ngx_qjs_exception(engine, &text);
ngx_log_error(NGX_LOG_EMERG, log, 0, "js compile %V", &text);
return NGX_ERROR;
}
@@ -972,7 +972,7 @@ ngx_qjs_clone(ngx_js_ctx_t *ctx, ngx_js_loc_conf_t *cf, void *external)
rv = JS_ReadObject(cx, pc[i].code, pc[i].code_size,
JS_READ_OBJ_BYTECODE);
if (JS_IsException(rv)) {
- ngx_qjs_exception(cx, &exception);
+ ngx_qjs_exception(engine, &exception);
ngx_log_error(NGX_LOG_ERR, ctx->log, 0,
"js load module exception: %V", &exception);
@@ -988,7 +988,7 @@ ngx_qjs_clone(ngx_js_ctx_t *ctx, ngx_js_loc_conf_t *cf, void *external)
rv = JS_EvalFunction(cx, rv);
if (JS_IsException(rv)) {
- ngx_qjs_exception(cx, &exception);
+ ngx_qjs_exception(engine, &exception);
ngx_log_error(NGX_LOG_ERR, ctx->log, 0, "js eval exception: %V",
&exception);
@@ -997,7 +997,7 @@ ngx_qjs_clone(ngx_js_ctx_t *ctx, ngx_js_loc_conf_t *cf, void *external)
rv = js_std_await(cx, rv);
if (JS_IsException(rv)) {
- ngx_qjs_exception(cx, &exception);
+ ngx_qjs_exception(engine, &exception);
ngx_log_error(NGX_LOG_ERR, ctx->log, 0, "js eval exception: %V",
&exception);
@@ -1042,7 +1042,7 @@ ngx_engine_qjs_call(ngx_js_ctx_t *ctx, ngx_str_t *fname,
val = JS_Call(cx, fn, JS_UNDEFINED, nargs, &ngx_qjs_arg(args[0]));
JS_FreeValue(cx, fn);
if (JS_IsException(val)) {
- ngx_qjs_exception(cx, &exception);
+ ngx_qjs_exception(ctx->engine, &exception);
ngx_log_error(NGX_LOG_ERR, ctx->log, 0,
"js call exception: %V", &exception);
@@ -1059,7 +1059,7 @@ ngx_engine_qjs_call(ngx_js_ctx_t *ctx, ngx_str_t *fname,
rc = JS_ExecutePendingJob(rt, &cx1);
if (rc <= 0) {
if (rc == -1) {
- ngx_qjs_exception(cx, &exception);
+ ngx_qjs_exception(ctx->engine, &exception);
ngx_log_error(NGX_LOG_ERR, ctx->log, 0,
"js job exception: %V", &exception);
@@ -1093,7 +1093,7 @@ static ngx_int_t
ngx_engine_qjs_string(ngx_engine_t *e, njs_opaque_value_t *value,
ngx_str_t *str)
{
- return ngx_qjs_dump_obj(e->u.qjs.ctx, ngx_qjs_arg(*value), str);
+ return ngx_qjs_dump_obj(e, ngx_qjs_arg(*value), str);
}
@@ -1150,7 +1150,7 @@ ngx_engine_qjs_destroy(ngx_engine_t *e, ngx_js_ctx_t *ctx,
}
if (ngx_qjs_unhandled_rejection(ctx)) {
- ngx_qjs_exception(cx, &exception);
+ ngx_qjs_exception(e, &exception);
ngx_log_error(NGX_LOG_ERR, ctx->log, 0,
"js unhandled rejection: %V", &exception);
}
@@ -1255,17 +1255,13 @@ ngx_qjs_value(JSContext *cx, const ngx_str_t *path)
static ngx_int_t
-ngx_qjs_dump_obj(JSContext *cx, JSValueConst val, ngx_str_t *dst)
+ngx_qjs_dump_obj(ngx_engine_t *e, JSValueConst val, ngx_str_t *dst)
{
- size_t len, byte_offset, byte_length;
- u_char *start, *p;
- JSValue buffer, stack;
- ngx_str_t str, stack_str;
- ngx_js_ctx_t *ctx;
- ngx_engine_t *e;
-
- ctx = ngx_qjs_external_ctx(cx, JS_GetContextOpaque(cx));
- e = ctx->engine;
+ size_t len, byte_offset, byte_length;
+ u_char *start, *p;
+ JSValue buffer, stack;
+ ngx_str_t str, stack_str;
+ JSContext *cx;
if (JS_IsNullOrUndefined(val)) {
dst->data = NULL;
@@ -1367,7 +1363,7 @@ ngx_qjs_call(JSContext *cx, JSValue fn, JSValue *argv, int argc)
ret = JS_Call(cx, fn, JS_UNDEFINED, argc, argv);
if (JS_IsException(ret)) {
- ngx_qjs_exception(cx, &exception);
+ ngx_qjs_exception(ctx->engine, &exception);
ngx_log_error(NGX_LOG_ERR, ctx->log, 0,
"js call exception: %V", &exception);
@@ -1383,7 +1379,7 @@ ngx_qjs_call(JSContext *cx, JSValue fn, JSValue *argv, int argc)
rc = JS_ExecutePendingJob(rt, &cx1);
if (rc <= 0) {
if (rc == -1) {
- ngx_qjs_exception(cx, &exception);
+ ngx_qjs_exception(ctx->engine, &exception);
ngx_log_error(NGX_LOG_ERR, ctx->log, 0,
"js job exception: %V", &exception);
@@ -1400,16 +1396,16 @@ ngx_qjs_call(JSContext *cx, JSValue fn, JSValue *argv, int argc)
ngx_int_t
-ngx_qjs_exception(JSContext *cx, ngx_str_t *s)
+ngx_qjs_exception(ngx_engine_t *e, ngx_str_t *s)
{
JSValue exception;
- exception = JS_GetException(cx);
- if (ngx_qjs_dump_obj(cx, exception, s) != NGX_OK) {
+ exception = JS_GetException(e->u.qjs.ctx);
+ if (ngx_qjs_dump_obj(e, exception, s) != NGX_OK) {
return NGX_ERROR;
}
- JS_FreeValue(cx, exception);
+ JS_FreeValue(e->u.qjs.ctx, exception);
return NGX_OK;
}
@@ -1746,6 +1742,7 @@ ngx_qjs_ext_log(JSContext *cx, JSValueConst this_val, int argc,
char *p;
uint32_t level;
ngx_str_t msg;
+ ngx_js_ctx_t *ctx;
ngx_connection_t *c;
p = JS_GetContextOpaque(cx);
@@ -1764,10 +1761,11 @@ ngx_qjs_ext_log(JSContext *cx, JSValueConst this_val, int argc,
argv++;
}
+ ctx = ngx_qjs_external_ctx(cx, p);
c = ngx_qjs_external_connection(cx, p);
for ( ; argc > 0; argc--, argv++) {
- if (ngx_qjs_dump_obj(cx, argv[0], &msg) != NGX_OK) {
+ if (ngx_qjs_dump_obj(ctx->engine, argv[0], &msg) != NGX_OK) {
return JS_EXCEPTION;
}
diff --git a/nginx/ngx_js.h b/nginx/ngx_js.h
index ba4cbdf9..51b8916c 100644
--- a/nginx/ngx_js.h
+++ b/nginx/ngx_js.h
@@ -342,7 +342,7 @@ void ngx_engine_qjs_destroy(ngx_engine_t *e, ngx_js_ctx_t *ctx,
ngx_js_loc_conf_t *conf);
ngx_int_t ngx_qjs_call(JSContext *cx, JSValue function, JSValue *argv,
int argc);
-ngx_int_t ngx_qjs_exception(JSContext *cx, ngx_str_t *s);
+ngx_int_t ngx_qjs_exception(ngx_engine_t *e, ngx_str_t *s);
ngx_int_t ngx_qjs_integer(JSContext *cx, JSValueConst val, ngx_int_t *n);
ngx_int_t ngx_qjs_string(JSContext *cx, JSValueConst val, ngx_str_t *str);
diff --git a/nginx/ngx_stream_js_module.c b/nginx/ngx_stream_js_module.c
index a7dddd04..b1e175d2 100644
--- a/nginx/ngx_stream_js_module.c
+++ b/nginx/ngx_stream_js_module.c
@@ -2672,7 +2672,7 @@ ngx_stream_qjs_run_event(ngx_stream_session_t *s, ngx_stream_js_ctx_t *ctx,
if (rc == NGX_ERROR) {
error:
- ngx_qjs_exception(cx, &exception);
+ ngx_qjs_exception(ctx->engine, &exception);
ngx_log_error(NGX_LOG_ERR, c->log, 0, "js exception: %V",
&exception);
More information about the nginx-devel
mailing list