authorgravatar for brandon.botsch@gmail.comBrandon Botsch <brandon.botsch@gmail.com> 2024-02-24 00:56:00-05:00
committergravatar for noreply@github.comGitHub <noreply@github.com> 2024-02-24 00:56:00-05:00
log5df6c70a32c474954b550f1c7deb61dc87f0810e
treefe5b10fad88ace540092b75b2e8016a758ee3945
parent774487038fa46a656d308d6686c5b3df757224cb
signaturebadge-check Signed by PGP key B5690EEEBB952194

std.hash_map: Fix integer overflow bugs (#19048)


1 files changed, 6 insertions(+), 5 deletions(-)

lib/std/hash_map.zig+6-5
...@@ -894,7 +894,7 @@ pub fn HashMapUnmanaged(...@@ -894,7 +894,7 @@ pub fn HashMapUnmanaged(
894 }894 }
895895
896 fn capacityForSize(size: Size) Size {896 fn capacityForSize(size: Size) Size {
897 var new_cap: u32 = @truncate((@as(u64, size) * 100) / max_load_percentage + 1);897 var new_cap: u32 = @intCast((@as(u64, size) * 100) / max_load_percentage + 1);
898 new_cap = math.ceilPowerOfTwo(u32, new_cap) catch unreachable;898 new_cap = math.ceilPowerOfTwo(u32, new_cap) catch unreachable;
899 return new_cap;899 return new_cap;
900 }900 }
...@@ -1537,14 +1537,15 @@ pub fn HashMapUnmanaged(...@@ -1537,14 +1537,15 @@ pub fn HashMapUnmanaged(
1537 const val_align = if (@sizeOf(V) == 0) 1 else @alignOf(V);1537 const val_align = if (@sizeOf(V) == 0) 1 else @alignOf(V);
1538 const max_align = comptime @max(header_align, key_align, val_align);1538 const max_align = comptime @max(header_align, key_align, val_align);
15391539
1540 const meta_size = @sizeOf(Header) + new_capacity * @sizeOf(Metadata);1540 const new_cap: usize = new_capacity;
1541 const meta_size = @sizeOf(Header) + new_cap * @sizeOf(Metadata);
1541 comptime assert(@alignOf(Metadata) == 1);1542 comptime assert(@alignOf(Metadata) == 1);
15421543
1543 const keys_start = std.mem.alignForward(usize, meta_size, key_align);1544 const keys_start = std.mem.alignForward(usize, meta_size, key_align);
1544 const keys_end = keys_start + new_capacity * @sizeOf(K);1545 const keys_end = keys_start + new_cap * @sizeOf(K);
15451546
1546 const vals_start = std.mem.alignForward(usize, keys_end, val_align);1547 const vals_start = std.mem.alignForward(usize, keys_end, val_align);
1547 const vals_end = vals_start + new_capacity * @sizeOf(V);1548 const vals_end = vals_start + new_cap * @sizeOf(V);
15481549
1549 const total_size = std.mem.alignForward(usize, vals_end, max_align);1550 const total_size = std.mem.alignForward(usize, vals_end, max_align);
15501551
...@@ -1572,7 +1573,7 @@ pub fn HashMapUnmanaged(...@@ -1572,7 +1573,7 @@ pub fn HashMapUnmanaged(
1572 const val_align = if (@sizeOf(V) == 0) 1 else @alignOf(V);1573 const val_align = if (@sizeOf(V) == 0) 1 else @alignOf(V);
1573 const max_align = comptime @max(header_align, key_align, val_align);1574 const max_align = comptime @max(header_align, key_align, val_align);
15741575
1575 const cap = self.capacity();1576 const cap: usize = self.capacity();
1576 const meta_size = @sizeOf(Header) + cap * @sizeOf(Metadata);1577 const meta_size = @sizeOf(Header) + cap * @sizeOf(Metadata);
1577 comptime assert(@alignOf(Metadata) == 1);1578 comptime assert(@alignOf(Metadata) == 1);
15781579