fix: duplicar strings al cargar config para evitar dangling pointers
Problema: Al recargar config, los strings asignados apuntaban al buffer de contenido del archivo que se liberaba con defer al final de load(). Esto causaba segfaults al acceder a los valores después. Solución: Usar dupeString() o allocator.dupe() para crear copias independientes de los strings antes de asignarlos a la config. Afecta tipos .string, .string_array y .color (cuando el campo es []const u8). 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
parent
91e5133e13
commit
4ec8667853
1 changed files with 21 additions and 5 deletions
|
|
@ -372,10 +372,18 @@ pub fn Engine(comptime variables: []const ConfigVariable, comptime ConfigType: t
|
||||||
@field(config.*, v.name) = float_val;
|
@field(config.*, v.name) = float_val;
|
||||||
},
|
},
|
||||||
.string, .string_array => {
|
.string, .string_array => {
|
||||||
// Para strings, necesitamos que Config tenga dupeString o similar
|
// IMPORTANTE: Duplicar el string porque 'value' apunta a 'content'
|
||||||
// Si el campo es []const u8 con default, simplemente asignamos
|
// que se libera con defer al final de load()
|
||||||
// (asumimos que el llamador maneja la memoria)
|
if (@hasDecl(ConfigType, "dupeString")) {
|
||||||
@field(config.*, v.name) = value;
|
// Config tiene método para trackear strings alocados
|
||||||
|
@field(config.*, v.name) = config.dupeString(value) catch value;
|
||||||
|
} else if (@hasField(ConfigType, "allocator")) {
|
||||||
|
// Usar allocator del config directamente
|
||||||
|
@field(config.*, v.name) = config.allocator.dupe(u8, value) catch value;
|
||||||
|
} else {
|
||||||
|
// Fallback: asignar directamente (puede causar dangling pointer!)
|
||||||
|
@field(config.*, v.name) = value;
|
||||||
|
}
|
||||||
},
|
},
|
||||||
.color => {
|
.color => {
|
||||||
const FieldType = @TypeOf(@field(config.*, v.name));
|
const FieldType = @TypeOf(@field(config.*, v.name));
|
||||||
|
|
@ -383,7 +391,15 @@ pub fn Engine(comptime variables: []const ConfigVariable, comptime ConfigType: t
|
||||||
const color = Color.parse(value) orelse return ConfigError.InvalidValue;
|
const color = Color.parse(value) orelse return ConfigError.InvalidValue;
|
||||||
@field(config.*, v.name) = color;
|
@field(config.*, v.name) = color;
|
||||||
} else {
|
} else {
|
||||||
@field(config.*, v.name) = value;
|
// String que representa un color (nombre de paleta)
|
||||||
|
// También necesita duplicarse
|
||||||
|
if (@hasDecl(ConfigType, "dupeString")) {
|
||||||
|
@field(config.*, v.name) = config.dupeString(value) catch value;
|
||||||
|
} else if (@hasField(ConfigType, "allocator")) {
|
||||||
|
@field(config.*, v.name) = config.allocator.dupe(u8, value) catch value;
|
||||||
|
} else {
|
||||||
|
@field(config.*, v.name) = value;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue