From 06bfcbf1a10750cd8af71c2bc6df484512a84ea2 Mon Sep 17 00:00:00 2001 From: Dmitry Volyntsev Date: Tue, 19 Mar 2024 21:05:51 -0700 Subject: [PATCH] Modules: fixed clear() method of a shared dictionary without timeout. Previously, the code did not unlock the rwlock when a dict was empty. The issue was introduced in 4a15613f4e8b (0.8.3). This closes issue #699 on Github. --- nginx/ngx_js_shared_dict.c | 4 +++- nginx/t/js_shared_dict.t | 1 + 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/nginx/ngx_js_shared_dict.c b/nginx/ngx_js_shared_dict.c index 66227428..3c94bd58 100644 --- a/nginx/ngx_js_shared_dict.c +++ b/nginx/ngx_js_shared_dict.c @@ -479,7 +479,7 @@ njs_js_ext_shared_dict_clear(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs, rbtree = &dict->sh->rbtree; if (rbtree->root == rbtree->sentinel) { - return NJS_OK; + goto done; } for (rn = ngx_rbtree_min(rbtree->root, rbtree->sentinel); @@ -494,6 +494,8 @@ njs_js_ext_shared_dict_clear(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs, } } +done: + ngx_rwlock_unlock(&dict->sh->rwlock); njs_value_undefined_set(retval); diff --git a/nginx/t/js_shared_dict.t b/nginx/t/js_shared_dict.t index bfa45c60..20ab87a3 100644 --- a/nginx/t/js_shared_dict.t +++ b/nginx/t/js_shared_dict.t @@ -266,6 +266,7 @@ $t->write_file('test.js', <<'EOF'); function set_clear(r) { var dict = ngx.shared.no_timeout; + dict.clear(); dict.set("test", "test value"); dict.set("test1", "test1 value"); dict.clear(); -- 2.47.3