From 15bcfcd36865fca75b93dc6ce52c904292b62a81 Mon Sep 17 00:00:00 2001 From: Andrew Kelley Date: Tue, 18 Aug 2020 15:11:43 -0700 Subject: [PATCH] stage2: fix use-after-free when printing ZIR --- src-self-hosted/zir.zig | 6 ++++-- test/stage2/zir.zig | 18 +++++++++--------- 2 files changed, 13 insertions(+), 11 deletions(-) diff --git a/src-self-hosted/zir.zig b/src-self-hosted/zir.zig index 276db6d522..793fdff031 100644 --- a/src-self-hosted/zir.zig +++ b/src-self-hosted/zir.zig @@ -872,6 +872,8 @@ pub const Module = struct { }; pub fn deinit(self: *Module, allocator: *Allocator) void { + self.metadata.deinit(); + self.body_metadata.deinit(); allocator.free(self.decls); self.arena.deinit(); self.* = undefined; @@ -1543,8 +1545,8 @@ pub fn emit(allocator: *Allocator, old_module: IrModule) !Module { .metadata = std.AutoHashMap(*Inst, Module.MetaData).init(allocator), .body_metadata = std.AutoHashMap(*Module.Body, Module.BodyMetaData).init(allocator), }; - defer ctx.metadata.deinit(); - defer ctx.body_metadata.deinit(); + errdefer ctx.metadata.deinit(); + errdefer ctx.body_metadata.deinit(); defer ctx.block_table.deinit(); defer ctx.loop_table.deinit(); defer ctx.decls.deinit(allocator); diff --git a/test/stage2/zir.zig b/test/stage2/zir.zig index f77c950052..225a7f58cd 100644 --- a/test/stage2/zir.zig +++ b/test/stage2/zir.zig @@ -28,7 +28,7 @@ pub fn addCases(ctx: *TestContext) !void { \\@unnamed$5 = export(@unnamed$4, "entry") \\@unnamed$6 = fntype([], @void, cc=C) \\@entry = fn(@unnamed$6, { - \\ %0 = returnvoid() + \\ %0 = returnvoid() ; deaths=0b1000000000000000 \\}) \\ ); @@ -75,7 +75,7 @@ pub fn addCases(ctx: *TestContext) !void { \\@3 = int(3) \\@unnamed$6 = fntype([], @void, cc=C) \\@entry = fn(@unnamed$6, { - \\ %0 = returnvoid() + \\ %0 = returnvoid() ; deaths=0b1000000000000000 \\}) \\@entry__anon_1 = str("2\x08\x01\n") \\@9 = declref("9__anon_0") @@ -117,18 +117,18 @@ pub fn addCases(ctx: *TestContext) !void { \\@unnamed$5 = export(@unnamed$4, "entry") \\@unnamed$6 = fntype([], @void, cc=C) \\@entry = fn(@unnamed$6, { - \\ %0 = call(@a, [], modifier=auto) - \\ %1 = returnvoid() + \\ %0 = call(@a, [], modifier=auto) ; deaths=0b1000000000000001 + \\ %1 = returnvoid() ; deaths=0b1000000000000000 \\}) \\@unnamed$8 = fntype([], @void, cc=C) \\@a = fn(@unnamed$8, { - \\ %0 = call(@b, [], modifier=auto) - \\ %1 = returnvoid() + \\ %0 = call(@b, [], modifier=auto) ; deaths=0b1000000000000001 + \\ %1 = returnvoid() ; deaths=0b1000000000000000 \\}) \\@unnamed$10 = fntype([], @void, cc=C) \\@b = fn(@unnamed$10, { - \\ %0 = call(@a, [], modifier=auto) - \\ %1 = returnvoid() + \\ %0 = call(@a, [], modifier=auto) ; deaths=0b1000000000000001 + \\ %1 = returnvoid() ; deaths=0b1000000000000000 \\}) \\ ); @@ -193,7 +193,7 @@ pub fn addCases(ctx: *TestContext) !void { \\@unnamed$5 = export(@unnamed$4, "entry") \\@unnamed$6 = fntype([], @void, cc=C) \\@entry = fn(@unnamed$6, { - \\ %0 = returnvoid() + \\ %0 = returnvoid() ; deaths=0b1000000000000000 \\}) \\ );