fix: prevent crash from keybind namespace and mode names going out of scope

This commit is contained in:
CJ van den Berg 2024-11-13 23:13:18 +01:00
parent 4200b3c1f6
commit 2f201c7886
Signed by: neurocyte
GPG key ID: 8EB1E1BB660E3FB9

View file

@ -722,27 +722,26 @@ const Bindings = struct {
fn addMode(self: *@This(), namespace_name: []const u8, mode_name: []const u8, mode_bindings: *BindingSet) !void { fn addMode(self: *@This(), namespace_name: []const u8, mode_name: []const u8, mode_bindings: *BindingSet) !void {
const namespace = self.namespaces.getPtr(namespace_name) orelse blk: { const namespace = self.namespaces.getPtr(namespace_name) orelse blk: {
try self.namespaces.putNoClobber(namespace_name, Namespace.init(self.allocator)); try self.namespaces.putNoClobber(try self.allocator.dupe(u8, namespace_name), Namespace.init(self.allocator));
break :blk self.namespaces.getPtr(namespace_name).?; break :blk self.namespaces.getPtr(namespace_name).?;
}; };
try namespace.putNoClobber(mode_name, mode_bindings); try namespace.putNoClobber(try self.allocator.dupe(u8, mode_name), mode_bindings);
} }
fn deinit(self: *Bindings) void { fn deinit(self: *Bindings) void {
for (self.namespaces.values()) |*namespace| { for (self.namespaces.values()) |*namespace| {
for (namespace.values()) |mode_bindings| { for (namespace.values()) |mode_bindings|
mode_bindings.deinit(); mode_bindings.deinit();
} for (namespace.keys()) |mode_name|
self.allocator.free(mode_name);
namespace.deinit(); namespace.deinit();
} }
for (self.namespaces.keys()) |namespace|
self.allocator.free(namespace);
self.namespaces.deinit(); self.namespaces.deinit();
self.allocator.destroy(self); self.allocator.destroy(self);
} }
fn addNamespace(self: *Bindings, name: []const u8, modes: []const BindingSet) !void {
try self.namespaces.put(name, .{ .name = name, .modes = modes });
}
fn loadJson(self: *@This(), json_string: []const u8) !void { fn loadJson(self: *@This(), json_string: []const u8) !void {
const parsed = try std.json.parseFromSlice(std.json.Value, self.allocator, json_string, .{}); const parsed = try std.json.parseFromSlice(std.json.Value, self.allocator, json_string, .{});
defer parsed.deinit(); defer parsed.deinit();