From 6cb8bb1675ec91bbd2c3b53b6a36d531330570d7 Mon Sep 17 00:00:00 2001 From: Felix Fietkau Date: Thu, 10 Aug 2023 14:01:27 +0200 Subject: [PATCH] hostapd: clone prototypes of ucode bss/interface objects Fixes an issue where lookup would return different objects than the ones intended Signed-off-by: Felix Fietkau --- .../services/hostapd/src/src/utils/ucode.c | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/package/network/services/hostapd/src/src/utils/ucode.c b/package/network/services/hostapd/src/src/utils/ucode.c index fabf58a5e8bd..a92913aedc86 100644 --- a/package/network/services/hostapd/src/src/utils/ucode.c +++ b/package/network/services/hostapd/src/src/utils/ucode.c @@ -179,6 +179,20 @@ uc_value_t *wpa_ucode_global_init(const char *name, uc_resource_type_t *global_t return global; } +static uc_value_t *wpa_ucode_prototype_clone(uc_value_t *uval) +{ + uc_value_t *proto, *proto_new; + + proto = ucv_prototype_get(uval); + proto_new = ucv_object_new(&vm); + + ucv_object_foreach(proto, key, val) + ucv_object_add(proto_new, key, ucv_get(val)); + ucv_prototype_set(uval, ucv_get(proto)); + + return proto; +} + void wpa_ucode_registry_add(uc_value_t *reg, uc_value_t *val, int *idx) { uc_value_t *data; @@ -190,7 +204,7 @@ void wpa_ucode_registry_add(uc_value_t *reg, uc_value_t *val, int *idx) ucv_array_set(reg, i, ucv_get(val)); data = ucv_object_new(&vm); - ucv_object_add(ucv_prototype_get(val), "data", ucv_get(data)); + ucv_object_add(wpa_ucode_prototype_clone(val), "data", ucv_get(data)); *idx = i + 1; } -- 2.30.2