aboutsummaryrefslogtreecommitdiff
path: root/core
diff options
context:
space:
mode:
authorLaytan <laytanlaats@hotmail.com>2024-10-20 21:40:05 +0200
committerGitHub <noreply@github.com>2024-10-20 21:40:05 +0200
commit7c1922b0a7ed210fe9ce2c1c70c320fde7858c83 (patch)
treed3cf59a91f41dd35d01f4f1895a261b153679ae9 /core
parent9f609dd740f3c44d44fd377351c82edbe936911a (diff)
parent90a0c834bb3dc43ab3bb219af8e30af9be070092 (diff)
Merge pull request #4401 from tgolsson/ts/cbor-unmarshal-dynarray
cbor: fix capacity and ptr calculation for dynarray unmarshal
Diffstat (limited to 'core')
-rw-r--r--core/encoding/cbor/unmarshal.odin9
1 files changed, 5 insertions, 4 deletions
diff --git a/core/encoding/cbor/unmarshal.odin b/core/encoding/cbor/unmarshal.odin
index bf27171f4..bccd4db18 100644
--- a/core/encoding/cbor/unmarshal.odin
+++ b/core/encoding/cbor/unmarshal.odin
@@ -442,9 +442,6 @@ _unmarshal_array :: proc(d: Decoder, v: any, ti: ^reflect.Type_Info, hdr: Header
loc := #caller_location,
) -> (out_of_space: bool, err: Unmarshal_Error) {
for idx: uintptr = 0; length == -1 || idx < uintptr(length); idx += 1 {
- elem_ptr := rawptr(uintptr(da.data) + idx*uintptr(elemt.size))
- elem := any{elem_ptr, elemt.id}
-
hdr := _decode_header(d.reader) or_return
// Double size if out of capacity.
@@ -459,6 +456,10 @@ _unmarshal_array :: proc(d: Decoder, v: any, ti: ^reflect.Type_Info, hdr: Header
if !ok { return false, .Out_Of_Memory }
}
+ // Set ptr after potential resizes to avoid invalidation.
+ elem_ptr := rawptr(uintptr(da.data) + idx*uintptr(elemt.size))
+ elem := any{elem_ptr, elemt.id}
+
err = _unmarshal_value(d, elem, hdr, allocator=allocator, loc=loc)
if length == -1 && err == .Break { break }
if err != nil { return }
@@ -509,7 +510,7 @@ _unmarshal_array :: proc(d: Decoder, v: any, ti: ^reflect.Type_Info, hdr: Header
raw := (^mem.Raw_Dynamic_Array)(v.data)
raw.data = raw_data(data)
raw.len = 0
- raw.cap = length
+ raw.cap = scap
raw.allocator = context.allocator
_ = assign_array(d, raw, t.elem, length) or_return