diff options
| author | Laytan Laats <laytanlaats@hotmail.com> | 2024-10-19 17:08:24 +0200 |
|---|---|---|
| committer | Laytan Laats <laytanlaats@hotmail.com> | 2024-10-19 17:08:24 +0200 |
| commit | e79f94ca5e63971e2566422cd8905e1e7beca2c1 (patch) | |
| tree | 0418bc56853b58e4dbd105f886ede09fbbf48ff0 /core/encoding | |
| parent | b82f8df5f5168fb7bd210d7bb99bd0a6bf176a80 (diff) | |
encoding/json: fix leak when string is unmarshalled into non-string field
Fixes #4391
Diffstat (limited to 'core/encoding')
| -rw-r--r-- | core/encoding/json/unmarshal.odin | 15 |
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) |