diff options
author | Jo-Philipp Wich <jo@mein.io> | 2021-03-11 11:10:36 +0100 |
---|---|---|
committer | Jo-Philipp Wich <jo@mein.io> | 2021-03-11 11:33:21 +0100 |
commit | 40fed16a0beb0eb4af251f6375bd9002cf05e8c5 (patch) | |
tree | 7713a42ea1e176be0687221a48a9d60ad97250a9 /vm.c | |
parent | ab8090d39f3c9c750b093621813292bd5bf7c372 (diff) |
vm: gracefully handle property setting on non-array, non-object values
Before this fix, the VM aborted due to an assert in libjson-c when an
attempt was made to set a property on a non-object value.
Signed-off-by: Jo-Philipp Wich <jo@mein.io>
Diffstat (limited to 'vm.c')
-rw-r--r-- | vm.c | 20 |
1 files changed, 19 insertions, 1 deletions
@@ -1096,7 +1096,25 @@ uc_vm_insn_store_val(uc_vm *vm, enum insn_type insn) json_object *k = uc_vm_stack_pop(vm); json_object *o = uc_vm_stack_pop(vm); - uc_vm_stack_push(vm, uc_setval(o, k, v)); + const char *typenames[] = { + [json_type_string] = "string", + [json_type_int] = "integer", + [json_type_double] = "double", + [json_type_boolean] = "boolean", + [json_type_null] = "null" + }; + + switch (json_object_get_type(o)) { + case json_type_object: + case json_type_array: + uc_vm_stack_push(vm, uc_setval(o, k, v)); + break; + + default: + uc_vm_raise_exception(vm, EXCEPTION_TYPE, + "attempt to set property on %s value", + typenames[json_object_get_type(o)]); + } uc_value_put(o); uc_value_put(k); |