From 6732d8ba6b5360647ffa89bc4277abf3f5a3e5c7 Mon Sep 17 00:00:00 2001 From: dipesh Date: Thu, 19 Feb 2026 16:50:28 -0500 Subject: [PATCH] fix: prevent decode-as registration growth while preserving defaults Avoid duplicate decode-as default reapplication across module traversal and keep PREF_DECODE_AS_RANGE updates merged with protocol defaults to prevent runaway memory growth on Node 20. --- lib/wiregasm/wiregasm.cpp | 29 ++++++++--------------------- src/index.test.ts | 6 ++++++ 2 files changed, 14 insertions(+), 21 deletions(-) diff --git a/lib/wiregasm/wiregasm.cpp b/lib/wiregasm/wiregasm.cpp index 54b4a38..b77e842 100644 --- a/lib/wiregasm/wiregasm.cpp +++ b/lib/wiregasm/wiregasm.cpp @@ -43,22 +43,8 @@ static guint wg_apply_decode_as_pref_cb(pref_t *pref, gpointer user_data) { return 0; } -static guint wg_apply_decode_as_module_cb(module_t *module, gpointer user_data); - -static void wg_apply_decode_as_for_module(module_t *module) { - if (module == NULL) { - return; - } - - prefs_pref_foreach(module, wg_apply_decode_as_pref_cb, module); - - if (prefs_module_has_submodules(module)) { - prefs_modules_foreach_submodules(module, wg_apply_decode_as_module_cb, NULL); - } -} - static guint wg_apply_decode_as_module_cb(module_t *module, gpointer user_data _U_) { - wg_apply_decode_as_for_module(module); + prefs_pref_foreach(module, wg_apply_decode_as_pref_cb, module); return 0; } @@ -428,17 +414,18 @@ SetPrefResponse wg_set_pref(string module_name, string pref_name, string value) // handle decode as range ourselves if (type == PREF_DECODE_AS_RANGE) { - // get current range and merge with new value so defaults are preserved - range_t *current_range = prefs_get_range_value_real(p, pref_current); - char *current_range_str = range_convert_range(NULL, current_range); + // merge with default range so builtin ports are preserved, while + // avoiding unbounded growth from repeatedly appending current values. + range_t *default_range = prefs_get_range_value_real(p, pref_default); + char *default_range_str = range_convert_range(NULL, default_range); string merged_str; - if (current_range_str != NULL && strlen(current_range_str) > 0) { - merged_str = string(current_range_str) + "," + value; + if (default_range_str != NULL && strlen(default_range_str) > 0) { + merged_str = string(default_range_str) + "," + value; } else { merged_str = value; } - wmem_free(NULL, current_range_str); + wmem_free(NULL, default_range_str); range_t *merged_range = NULL; convert_ret_t ret = range_convert_str(NULL, &merged_range, merged_str.c_str(), prefs_get_max_value(p)); diff --git a/src/index.test.ts b/src/index.test.ts index 155e070..84a92e6 100644 --- a/src/index.test.ts +++ b/src/index.test.ts @@ -794,6 +794,12 @@ describe("Wiregasm Library - Set Preferences", () => { expect(pref2.range_value).toContain("8001"); // defaults should still be present expect(pref2.range_value).toContain("80"); + + // setting it again should still preserve defaults + wg.set_pref("http", "tcp.port", "8002"); + const pref3 = wg.get_pref("http", "tcp.port"); + expect(pref3.range_value).toContain("8002"); + expect(pref3.range_value).toContain("80"); }); test("set preferences works for diameter", async () => {