aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAndrew Kelley <andrew@ziglang.org>2023-12-24 21:50:37 -0700
committerAndrew Kelley <andrew@ziglang.org>2024-01-01 17:51:21 -0700
commit4f8a44cd0f636f3ffe008b2cedafa1e51a4a3796 (patch)
treee395558fb0348b842e20de3a059da10673bf3bbd /src
parent44e2dbe117fe79b99a970990878a061bdd26ff55 (diff)
downloadzig-4f8a44cd0f636f3ffe008b2cedafa1e51a4a3796.tar.gz
zig-4f8a44cd0f636f3ffe008b2cedafa1e51a4a3796.zip
compiler: fix UAF when writing builtin.zig
Diffstat (limited to 'src')
-rw-r--r--src/Builtin.zig3
-rw-r--r--src/Package.zig4
2 files changed, 4 insertions, 3 deletions
diff --git a/src/Builtin.zig b/src/Builtin.zig
index 8a3a1ecf4b..dc9ccc22c4 100644
--- a/src/Builtin.zig
+++ b/src/Builtin.zig
@@ -279,7 +279,8 @@ pub fn populateFile(comp: *Compilation, mod: *Module, file: *File) !void {
}
fn writeFile(file: *File, mod: *Module) !void {
- var af = try mod.root.atomicFile(mod.root_src_path, .{ .make_path = true });
+ var buf: [std.fs.MAX_PATH_BYTES]u8 = undefined;
+ var af = try mod.root.atomicFile(mod.root_src_path, .{ .make_path = true }, &buf);
defer af.deinit();
try af.file.writeAll(file.source);
try af.finish();
diff --git a/src/Package.zig b/src/Package.zig
index 373b46e495..da2e214154 100644
--- a/src/Package.zig
+++ b/src/Package.zig
@@ -88,10 +88,10 @@ pub const Path = struct {
p: Path,
sub_path: []const u8,
options: fs.Dir.AtomicFileOptions,
+ buf: *[fs.MAX_PATH_BYTES]u8,
) !fs.AtomicFile {
- var buf: [fs.MAX_PATH_BYTES]u8 = undefined;
const joined_path = if (p.sub_path.len == 0) sub_path else p: {
- break :p std.fmt.bufPrint(&buf, "{s}" ++ fs.path.sep_str ++ "{s}", .{
+ break :p std.fmt.bufPrint(buf, "{s}" ++ fs.path.sep_str ++ "{s}", .{
p.sub_path, sub_path,
}) catch return error.NameTooLong;
};