aboutsummaryrefslogtreecommitdiff
path: root/core/encoding/json
diff options
context:
space:
mode:
authorLaytan Laats <laytanlaats@hotmail.com>2024-10-19 17:08:24 +0200
committerLaytan Laats <laytanlaats@hotmail.com>2024-10-19 17:08:24 +0200
commite79f94ca5e63971e2566422cd8905e1e7beca2c1 (patch)
tree0418bc56853b58e4dbd105f886ede09fbbf48ff0 /core/encoding/json
parentb82f8df5f5168fb7bd210d7bb99bd0a6bf176a80 (diff)
encoding/json: fix leak when string is unmarshalled into non-string field
Fixes #4391
Diffstat (limited to 'core/encoding/json')
-rw-r--r--core/encoding/json/unmarshal.odin15
1 files changed, 10 insertions, 5 deletions
diff --git a/core/encoding/json/unmarshal.odin b/core/encoding/json/unmarshal.odin
index 738e20c68..8a50989f4 100644
--- a/core/encoding/json/unmarshal.odin
+++ b/core/encoding/json/unmarshal.odin
@@ -312,13 +312,18 @@ unmarshal_value :: proc(p: ^Parser, v: any) -> (err: Unmarshal_Error) {
case .String:
advance_token(p)
- str := unquote_string(token, p.spec, p.allocator) or_return
- if unmarshal_string_token(p, any{v.data, ti.id}, str, ti) {
- return nil
+ str := unquote_string(token, p.spec, p.allocator) or_return
+ dest := any{v.data, ti.id}
+ if !unmarshal_string_token(p, dest, str, ti) {
+ delete(str, p.allocator)
+ return UNSUPPORTED_TYPE
}
- delete(str, p.allocator)
- return UNSUPPORTED_TYPE
+ switch destv in dest {
+ case string, cstring:
+ case: delete(str, p.allocator)
+ }
+ return nil
case .Open_Brace:
return unmarshal_object(p, v, .Close_Brace)