From 2048f46731ea44d3077de4a02f477adc9c445743 Mon Sep 17 00:00:00 2001 From: "Jeffrey C. Ollie" Date: Thu, 12 Sep 2024 00:17:45 -0500 Subject: [PATCH] fix double free in kitty desktop notification parsing --- src/terminal/kitty/desktop.zig | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/src/terminal/kitty/desktop.zig b/src/terminal/kitty/desktop.zig index 74ffb6303d..5eb1449f75 100644 --- a/src/terminal/kitty/desktop.zig +++ b/src/terminal/kitty/desktop.zig @@ -19,7 +19,7 @@ payload: ?[]const u8 = null, terminator: Terminator = .st, /// we use an arena to make cleaning up allocations simpler -arena: std.heap.ArenaAllocator, +arena: ?std.heap.ArenaAllocator = null, /// these are used internally by the parser to keep track of /// locations in the buffer, they should be ignored outside of @@ -259,7 +259,8 @@ pub fn init(gpa_alloc: std.mem.Allocator, option_start: usize) KittyDesktopNotif } pub fn deinit(self: *KittyDesktopNotification) void { - self.arena.deinit(); + if (self.arena) |arena| arena.deinit(); + self.arena = null; } pub fn startOption(self: *KittyDesktopNotification, option_start: usize) void { @@ -324,7 +325,11 @@ pub fn endOption(self: *KittyDesktopNotification, parser: *Parser, option_end: u self._internal.key_end = null; self._internal.value_start = null; - const alloc = self.arena.allocator(); + const alloc = (self.arena orelse { + log.warn("no arena?", .{}); + parser.state = .invalid; + return; + }).allocator(); switch (key) { // action @@ -539,7 +544,11 @@ pub fn end(self: *KittyDesktopNotification, parser: *Parser, option_end: usize) return; } - const alloc = self.arena.allocator(); + const alloc = (self.arena orelse { + log.warn("no arena?", .{}); + parser.state = .invalid; + return; + }).allocator(); if (self.metadata.e) { const size = simd.base64.maxLen(value);