Skip to content

Instantly share code, notes, and snippets.

@xeioex
Created July 31, 2025 23:24
Show Gist options
  • Save xeioex/230762bc4d06113b6073feedb7d07168 to your computer and use it in GitHub Desktop.
Save xeioex/230762bc4d06113b6073feedb7d07168 to your computer and use it in GitHub Desktop.
diff --git a/nginx/ngx_js.c b/nginx/ngx_js.c
index 5f9ea2fb..06b07f98 100644
--- a/nginx/ngx_js.c
+++ b/nginx/ngx_js.c
@@ -691,10 +691,9 @@ ngx_engine_njs_call(ngx_js_ctx_t *ctx, ngx_str_t *fname,
njs_opaque_value_t *args, njs_uint_t nargs)
{
njs_vm_t *vm;
- njs_int_t ret;
+ njs_int_t ret, job_count;
njs_str_t name;
ngx_str_t exception;
- ngx_uint_t job_count = 0;
njs_function_t *func;
name.start = fname->data;
@@ -720,6 +719,8 @@ ngx_engine_njs_call(ngx_js_ctx_t *ctx, ngx_str_t *fname,
return NGX_ERROR;
}
+ job_count = 0;
+
for ( ;; ) {
ret = njs_vm_execute_pending_job(vm);
if (ret <= NJS_OK) {
@@ -735,10 +736,11 @@ ngx_engine_njs_call(ngx_js_ctx_t *ctx, ngx_str_t *fname,
}
job_count++;
+
if (job_count >= NGX_MAX_JOB_ITERATIONS) {
ngx_log_error(NGX_LOG_ERR, ctx->log, 0,
- "js job queue processing limit exceeded (%ui iterations), "
- "possible infinite loop in microtasks", NGX_MAX_JOB_ITERATIONS);
+ "js job queue processing exceeded %ui iterations",
+ NGX_MAX_JOB_ITERATIONS);
return NGX_ERROR;
}
}
@@ -756,7 +758,7 @@ ngx_engine_njs_call(ngx_js_ctx_t *ctx, ngx_str_t *fname,
} else if (state == NJS_PROMISE_PENDING &&
njs_rbtree_is_empty(&ctx->waiting_events))
{
- ngx_log_error(NGX_LOG_ERR, ctx->log, 0,
+ ngx_log_error(NGX_LOG_ERR, ctx->log, 0,
"js promise pending, no jobs, no waiting_events");
return NGX_ERROR;
}
@@ -1059,12 +1061,11 @@ static ngx_int_t
ngx_engine_qjs_call(ngx_js_ctx_t *ctx, ngx_str_t *fname,
njs_opaque_value_t *args, njs_uint_t nargs)
{
- int rc;
+ int rc, job_count;
JSValue fn, val;
ngx_str_t exception;
JSRuntime *rt;
JSContext *cx, *cx1;
- ngx_uint_t job_count = 0;
cx = ctx->engine->u.qjs.ctx;
@@ -1093,6 +1094,8 @@ ngx_engine_qjs_call(ngx_js_ctx_t *ctx, ngx_str_t *fname,
rt = JS_GetRuntime(cx);
+ job_count = 0;
+
for ( ;; ) {
rc = JS_ExecutePendingJob(rt, &cx1);
if (rc <= 0) {
@@ -1109,10 +1112,11 @@ ngx_engine_qjs_call(ngx_js_ctx_t *ctx, ngx_str_t *fname,
}
job_count++;
+
if (job_count >= NGX_MAX_JOB_ITERATIONS) {
ngx_log_error(NGX_LOG_ERR, ctx->log, 0,
- "js job queue processing limit exceeded (%ui iterations), "
- "possible infinite loop in microtasks", NGX_MAX_JOB_ITERATIONS);
+ "js job queue processing exceeded %ui iterations",
+ NGX_MAX_JOB_ITERATIONS);
return NGX_ERROR;
}
}
@@ -1134,7 +1138,7 @@ ngx_engine_qjs_call(ngx_js_ctx_t *ctx, ngx_str_t *fname,
} else if (state == JS_PROMISE_PENDING &&
njs_rbtree_is_empty(&ctx->waiting_events))
{
- ngx_log_error(NGX_LOG_ERR, ctx->log, 0,
+ ngx_log_error(NGX_LOG_ERR, ctx->log, 0,
"js promise pending, no jobs, no waiting_events");
return NGX_ERROR;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment