From c5e6b51c404f022feb54cd34b5f2d5708a4878ac Mon Sep 17 00:00:00 2001 From: Dmitry Volyntsev Date: Tue, 15 Sep 2026 15:24:06 -0700 Subject: [PATCH] Modules: fix js_periodic worker affinity parsing Previously, worker_affinity parsing reused the directive option index. This skipped options after worker_affinity in HTTP and stream configurations. The fix is to use a separate index while parsing the affinity mask. --- nginx/ngx_http_js_module.c | 14 +++++++------- nginx/ngx_stream_js_module.c | 14 +++++++------- nginx/t/js_periodic.t | 2 +- nginx/t/stream_js_periodic.t | 2 +- 4 files changed, 16 insertions(+), 16 deletions(-) diff --git a/nginx/ngx_http_js_module.c b/nginx/ngx_http_js_module.c index 1766d1a0..0c00ed65 100644 --- a/nginx/ngx_http_js_module.c +++ b/nginx/ngx_http_js_module.c @@ -9718,7 +9718,7 @@ ngx_http_js_periodic(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) uint8_t *mask; ngx_str_t *value, s; ngx_msec_t interval, jitter; - ngx_uint_t i; + ngx_uint_t i, j; ngx_core_conf_t *ccf; ngx_js_periodic_t *periodic; ngx_js_main_conf_t *jmcf; @@ -9810,20 +9810,20 @@ ngx_http_js_periodic(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) return NGX_CONF_ERROR; } - for (i = 0; i < s.len; i++) { - if (s.data[i] == '0') { - mask[i] = 0; + for (j = 0; j < s.len; j++) { + if (s.data[j] == '0') { + mask[j] = 0; continue; } - if (s.data[i] == '1') { - mask[i] = 1; + if (s.data[j] == '1') { + mask[j] = 1; continue; } ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, "invalid character \"%c\" in \"worker_affinity=\"", - s.data[i]); + s.data[j]); return NGX_CONF_ERROR; } diff --git a/nginx/ngx_stream_js_module.c b/nginx/ngx_stream_js_module.c index e5338500..5f4f6021 100644 --- a/nginx/ngx_stream_js_module.c +++ b/nginx/ngx_stream_js_module.c @@ -3536,7 +3536,7 @@ ngx_stream_js_periodic(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) uint8_t *mask; ngx_str_t *value, s; ngx_msec_t interval, jitter; - ngx_uint_t i; + ngx_uint_t i, j; ngx_core_conf_t *ccf; ngx_js_periodic_t *periodic; ngx_js_main_conf_t *jmcf; @@ -3628,20 +3628,20 @@ ngx_stream_js_periodic(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) return NGX_CONF_ERROR; } - for (i = 0; i < s.len; i++) { - if (s.data[i] == '0') { - mask[i] = 0; + for (j = 0; j < s.len; j++) { + if (s.data[j] == '0') { + mask[j] = 0; continue; } - if (s.data[i] == '1') { - mask[i] = 1; + if (s.data[j] == '1') { + mask[j] = 1; continue; } ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, "invalid character \"%c\" in \"worker_affinity=\"", - s.data[i]); + s.data[j]); return NGX_CONF_ERROR; } diff --git a/nginx/t/js_periodic.t b/nginx/t/js_periodic.t index 7e134588..163c6f4a 100644 --- a/nginx/t/js_periodic.t +++ b/nginx/t/js_periodic.t @@ -56,7 +56,7 @@ http { server_name localhost; location @periodic { - js_periodic test.tick interval=20ms jitter=1ms; + js_periodic test.tick worker_affinity=1000 interval=20ms; js_periodic test.timer interval=1s worker_affinity=all; js_periodic test.overrun interval=30ms; js_periodic test.affinity interval=50ms worker_affinity=0101; diff --git a/nginx/t/stream_js_periodic.t b/nginx/t/stream_js_periodic.t index ac64045e..87c9aa4c 100644 --- a/nginx/t/stream_js_periodic.t +++ b/nginx/t/stream_js_periodic.t @@ -55,7 +55,7 @@ stream { server { listen 127.0.0.1:8081; - js_periodic test.tick interval=30ms jitter=1ms; + js_periodic test.tick worker_affinity=1000 interval=30ms; js_periodic test.timer interval=1s worker_affinity=all; js_periodic test.overrun interval=30ms; js_periodic test.affinity interval=50ms worker_affinity=0101; -- 2.47.3