From a18809eb5b1c0c21e0db82d6c05ec239f66491a6 Mon Sep 17 00:00:00 2001 From: Luna Date: Sun, 20 Oct 2019 11:37:11 -0300 Subject: [PATCH 1/2] repl: handle when original file doesn't exist --- src/main.zig | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/src/main.zig b/src/main.zig index c8ff9cd..5778385 100644 --- a/src/main.zig +++ b/src/main.zig @@ -27,8 +27,11 @@ pub fn doRepl(allocator: *std.mem.Allocator, args_it: var) !void { const stdout = &stdout_file.outStream().stream; const scri_path = try (args_it.next(allocator) orelse @panic("expected scri path")); - var file_read = try std.fs.File.openRead(scri_path); - const total_bytes = try file_read.getEndPos(); + var file_read_opt: ?std.fs.File = std.fs.File.openRead(scri_path) catch |err| blk: { + if (err == error.FileNotFound) break :blk null; + return err; + }; + const total_bytes = if (file_read_opt) |file_read| try file_read.getEndPos() else 0; var cmds = langs.CommandList.init(allocator); defer cmds.deinit(); @@ -41,7 +44,7 @@ pub fn doRepl(allocator: *std.mem.Allocator, args_it: var) !void { // existing_cmds, and then passed along to cmds), // we can't defer them here var scri_existing = try allocator.alloc(u8, total_bytes); - _ = try file_read.read(scri_existing); + _ = try file_read_opt.?.read(scri_existing); // we can defer this because we copy the Command structs back to cmds var existing_cmds = try lang.parse(scri_existing); @@ -64,7 +67,9 @@ pub fn doRepl(allocator: *std.mem.Allocator, args_it: var) !void { }); } - file_read.close(); + if (file_read_opt) |file_read| { + file_read.close(); + } var file = try std.fs.File.openWrite(scri_path); defer file.close(); From cdca993048aea437b31d98f82a2d2c221cc659ef Mon Sep 17 00:00:00 2001 From: Luna Date: Sun, 20 Oct 2019 11:59:15 -0300 Subject: [PATCH 2/2] remove 'use-after-free' --- src/main.zig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main.zig b/src/main.zig index 5778385..af21328 100644 --- a/src/main.zig +++ b/src/main.zig @@ -111,7 +111,7 @@ pub fn doRepl(allocator: *std.mem.Allocator, args_it: var) !void { var rd_line = readline.readline(c"> "); if (rd_line == null) break; readline.add_history(rd_line); - defer std.heap.c_allocator.destroy(rd_line); + //defer std.heap.c_allocator.destroy(rd_line); var line = rd_line[0..std.mem.len(u8, rd_line)];