From 01b9fa2c2574bd02937ce40525e94026c3acd551 Mon Sep 17 00:00:00 2001 From: GethDW Date: Tue, 11 Oct 2022 18:12:03 +0100 Subject: [PATCH] std: fix memory leak on OutOfMemory error in math.big.int and math.big.rationa --- lib/std/math/big/int.zig | 1 + lib/std/math/big/rational.zig | 4 +++- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/lib/std/math/big/int.zig b/lib/std/math/big/int.zig index ee6ccaacac..e7c8ed72a2 100644 --- a/lib/std/math/big/int.zig +++ b/lib/std/math/big/int.zig @@ -2378,6 +2378,7 @@ pub const Managed = struct { /// This is identical to an `init`, followed by a `set`. pub fn initSet(allocator: Allocator, value: anytype) !Managed { var s = try Managed.init(allocator); + errdefer s.deinit(); try s.set(value); return s; } diff --git a/lib/std/math/big/rational.zig b/lib/std/math/big/rational.zig index 61e2194eea..98433b26ff 100644 --- a/lib/std/math/big/rational.zig +++ b/lib/std/math/big/rational.zig @@ -30,8 +30,10 @@ pub const Rational = struct { /// Create a new Rational. A small amount of memory will be allocated on initialization. /// This will be 2 * Int.default_capacity. pub fn init(a: Allocator) !Rational { + var p = try Int.init(a); + errdefer p.deinit(); return Rational{ - .p = try Int.init(a), + .p = p, .q = try Int.initSet(a, 1), }; }