hostapd: clone prototypes of ucode bss/interface objects
authorFelix Fietkau <nbd@nbd.name>
Thu, 10 Aug 2023 12:01:27 +0000 (14:01 +0200)
committerFelix Fietkau <nbd@nbd.name>
Thu, 10 Aug 2023 17:09:42 +0000 (19:09 +0200)
Fixes an issue where lookup would return different objects than the ones intended

Signed-off-by: Felix Fietkau <nbd@nbd.name>
package/network/services/hostapd/src/src/utils/ucode.c

index fabf58a5e8bd436a2f5ce1de6acd6bbbd95d0896..a92913aedc8674804438c1c1a16f8a24ce153534 100644 (file)
@@ -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;
 }