summaryrefslogtreecommitdiffhomepage
path: root/vm.c
diff options
context:
space:
mode:
authorJo-Philipp Wich <jo@mein.io>2022-03-14 13:14:12 +0100
committerJo-Philipp Wich <jo@mein.io>2022-03-14 13:16:11 +0100
commitc402551277239098e2da98e223ddd67d061ae2a7 (patch)
treed85e903695619bbee91e341b04da16880128fd4f /vm.c
parent3d202b973bfc50dd5b91f111a13219fa69ca45e6 (diff)
vm: fix crash on object literals with non-string computed properties
When executing an object literal declaration using non-string computed property name values, the VM crashed caused by an attempt to use a NULL pointer (result of ucv_string_get() on a non-string value) as hash table key. Fix this issue by using the `ucv_key_set()` infrastructure which deals with the implicit stringification of non-string key values. Signed-off-by: Jo-Philipp Wich <jo@mein.io>
Diffstat (limited to 'vm.c')
-rw-r--r--vm.c11
1 files changed, 4 insertions, 7 deletions
diff --git a/vm.c b/vm.c
index b6a0a26..0c756d7 100644
--- a/vm.c
+++ b/vm.c
@@ -1804,15 +1804,12 @@ static void
uc_vm_insn_sobj(uc_vm_t *vm, uc_vm_insn_t insn)
{
uc_value_t *obj = uc_vm_stack_peek(vm, vm->arg.u32);
- uc_value_t *val;
size_t idx;
- for (idx = 0; idx < vm->arg.u32; idx += 2) {
- val = uc_vm_stack_peek(vm, vm->arg.u32 - idx - 1);
- ucv_object_add(obj,
- ucv_string_get(val),
- ucv_get(uc_vm_stack_peek(vm, vm->arg.u32 - idx - 2)));
- }
+ for (idx = 0; idx < vm->arg.u32; idx += 2)
+ ucv_key_set(vm, obj,
+ uc_vm_stack_peek(vm, vm->arg.u32 - idx - 1),
+ uc_vm_stack_peek(vm, vm->arg.u32 - idx - 2));
for (idx = 0; idx < vm->arg.u32; idx++)
ucv_put(uc_vm_stack_pop(vm));