Browse Source

encoding/json: fix leak when string is unmarshalled into non-string field

Fixes #4391
Laytan Laats 9 months ago
parent
commit
e79f94ca5e
1 changed files with 10 additions and 5 deletions
  1. 10 5
      core/encoding/json/unmarshal.odin

+ 10 - 5
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)