From: Felix Fietkau Date: Thu, 10 Aug 2023 12:01:27 +0000 (+0200) Subject: hostapd: clone prototypes of ucode bss/interface objects X-Git-Url: http://git.cdn.openwrt.org/?a=commitdiff_plain;h=6cb8bb1675ec91bbd2c3b53b6a36d531330570d7;p=openwrt%2Fstaging%2Fblocktrron.git 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 --- diff --git a/package/network/services/hostapd/src/src/utils/ucode.c b/package/network/services/hostapd/src/src/utils/ucode.c index fabf58a5e8..a92913aedc 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; }