From 806dfcabe7c6a5211e355d309360292ab18c4d69 Mon Sep 17 00:00:00 2001
From: hongzhidao <hongzhidao@gmail.com>
Date: Tue, 18 Mar 2025 21:34:59 +0800
Subject: [PATCH] QuickJS: calling njs_chb_destroy() in qjs_string_create_chb()
 internally.

No functional changes.
---
 external/qjs_query_string_module.c | 17 +++--------------
 nginx/ngx_http_js_module.c         | 30 ++++++++++++------------------
 src/qjs.c                          |  2 ++
 3 files changed, 17 insertions(+), 32 deletions(-)

diff --git a/external/qjs_query_string_module.c b/external/qjs_query_string_module.c
index 423222342..63553a534 100644
--- a/external/qjs_query_string_module.c
+++ b/external/qjs_query_string_module.c
@@ -171,7 +171,6 @@ static JSValue
 qjs_query_string_decode(JSContext *cx, const u_char *start, size_t size)
 {
     u_char                *dst;
-    JSValue               ret;
     uint32_t              cp;
     njs_chb_t             chain;
     const u_char          *p, *end;
@@ -250,11 +249,7 @@ qjs_query_string_decode(JSContext *cx, const u_char *start, size_t size)
     }
 
 
-    ret = qjs_string_create_chb(cx, &chain);
-
-    njs_chb_destroy(&chain);
-
-    return ret;
+    return qjs_string_create_chb(cx, &chain);
 }
 
 
@@ -281,8 +276,6 @@ qjs_query_string_escape(JSContext *cx, JSValueConst this_val, int argc,
 
     ret = qjs_string_create_chb(cx, &chain);
 
-    njs_chb_destroy(&chain);
-
     JS_FreeCString(cx, (char *) str.start);
 
     return ret;
@@ -733,7 +726,7 @@ qjs_query_string_stringify_internal(JSContext *cx, JSValue obj, njs_str_t *sep,
 {
     int             rc;
     uint32_t        n, length;
-    JSValue         key, val, ret;
+    JSValue         key, val;
     njs_str_t       sep_val, eq_val;
     njs_chb_t       chain;
     JSPropertyEnum  *ptab;
@@ -809,11 +802,7 @@ qjs_query_string_stringify_internal(JSContext *cx, JSValue obj, njs_str_t *sep,
         qjs_free_prop_enum(cx, ptab, length);
     }
 
-    ret = qjs_string_create_chb(cx, &chain);
-
-    njs_chb_destroy(&chain);
-
-    return ret;
+    return qjs_string_create_chb(cx, &chain);
 
 fail:
 
diff --git a/nginx/ngx_http_js_module.c b/nginx/ngx_http_js_module.c
index ae970eb1b..369ae50be 100644
--- a/nginx/ngx_http_js_module.c
+++ b/nginx/ngx_http_js_module.c
@@ -6400,10 +6400,9 @@ ngx_http_qjs_header_generic(JSContext *cx, ngx_http_request_t *r,
     ngx_list_t *headers, ngx_table_elt_t **ph, ngx_str_t *name,
     JSPropertyDescriptor *pdesc, unsigned flags)
 {
-    int               ret;
     u_char            sep;
-    njs_chb_t         chain;
     JSValue           val;
+    njs_chb_t         chain;
     ngx_uint_t        i;
     ngx_list_part_t  *part;
     ngx_table_elt_t  *header, *h;
@@ -6493,6 +6492,10 @@ ngx_http_qjs_header_generic(JSContext *cx, ngx_http_request_t *r,
         return 1;
     }
 
+    if (pdesc == NULL) {
+        return 1;
+    }
+
     NJS_CHB_CTX_INIT(&chain, cx);
 
     sep = flags & NJS_HEADER_SEMICOLON ? ';' : ',';
@@ -6503,24 +6506,15 @@ ngx_http_qjs_header_generic(JSContext *cx, ngx_http_request_t *r,
         njs_chb_append_literal(&chain, " ");
     }
 
-    ret = 1;
-
-    if (pdesc != NULL) {
-        pdesc->flags = JS_PROP_ENUMERABLE;
-        pdesc->getter = JS_UNDEFINED;
-        pdesc->setter = JS_UNDEFINED;
-        pdesc->value = qjs_string_create_chb(cx, &chain);
-        if (JS_IsException(pdesc->value)) {
-            ret = -1;
-            goto done;
-        }
+    pdesc->flags = JS_PROP_ENUMERABLE;
+    pdesc->getter = JS_UNDEFINED;
+    pdesc->setter = JS_UNDEFINED;
+    pdesc->value = qjs_string_create_chb(cx, &chain);
+    if (JS_IsException(pdesc->value)) {
+        return -1;
     }
 
-done:
-
-    njs_chb_destroy(&chain);
-
-    return ret;
+    return 1;
 }
 
 
diff --git a/src/qjs.c b/src/qjs.c
index 52401983a..38015bb93 100644
--- a/src/qjs.c
+++ b/src/qjs.c
@@ -1015,6 +1015,8 @@ qjs_string_create_chb(JSContext *cx, njs_chb_t *chain)
     njs_str_t  str;
 
     ret = njs_chb_join(chain, &str);
+    njs_chb_destroy(chain);
+
     if (ret != NJS_OK) {
         return JS_ThrowInternalError(cx, "failed to create string");
     }