aboutsummaryrefslogtreecommitdiff
path: root/lib/std/process.zig
diff options
context:
space:
mode:
authorJean Dao <jean@pfudke.fr>2022-01-28 10:40:03 +0100
committerVeikka Tuominen <git@vexu.eu>2022-01-29 20:46:06 +0200
commitfedff060790733b85582b733cfea9fefb168deb6 (patch)
tree2b5487f551ce91c05741fddf12a90d3ef4e46859 /lib/std/process.zig
parentaa902c7042402d4602797f91ef8ec8b96cb179a7 (diff)
downloadzig-fedff060790733b85582b733cfea9fefb168deb6.tar.gz
zig-fedff060790733b85582b733cfea9fefb168deb6.zip
fix argsAlloc buffer size
The buffer `buf` contains N (= `slice_sizes.len`) slices followed by the N null-terminated arguments. The N null-terminated arguments are stored in the `contents` array list. Thus, `buf` size should be: @sizeOf([]u8) * slice_sizes.len + contents_slice.len Instead of: @sizeOf([]u8) * slice_sizes.len + contents_slice.len + slice_sizes.len This bug was found thanks to the gpa allocator which checks if freed size matches allocated sizes for large allocations.
Diffstat (limited to 'lib/std/process.zig')
-rw-r--r--lib/std/process.zig3
1 files changed, 1 insertions, 2 deletions
diff --git a/lib/std/process.zig b/lib/std/process.zig
index 70695f9cbc..9e1abb4479 100644
--- a/lib/std/process.zig
+++ b/lib/std/process.zig
@@ -557,9 +557,8 @@ pub fn argsAlloc(allocator: mem.Allocator) ![][:0]u8 {
const contents_slice = contents.items;
const slice_sizes = slice_list.items;
- const contents_size_bytes = try math.add(usize, contents_slice.len, slice_sizes.len);
const slice_list_bytes = try math.mul(usize, @sizeOf([]u8), slice_sizes.len);
- const total_bytes = try math.add(usize, slice_list_bytes, contents_size_bytes);
+ const total_bytes = try math.add(usize, slice_list_bytes, contents_slice.len);
const buf = try allocator.alignedAlloc(u8, @alignOf([]u8), total_bytes);
errdefer allocator.free(buf);