fix crash when relocation points to an undefined section symbol

This commit is contained in:
Nikita Smith
2025-08-07 22:40:20 -07:00
parent 4f6f9d61ed
commit 137eb6403a
+7 -3
View File
@@ -1101,7 +1101,7 @@ lnk_find_refs(Arena *arena,
} }
// //
// walk relocations and unset the remove flag on visited sections // walk relocations and mark referenced sections as live
// //
for (; task_stack; ) { for (; task_stack; ) {
struct Task *t = task_stack; SLLStackPop(task_stack); struct Task *t = task_stack; SLLStackPop(task_stack);
@@ -1160,7 +1160,6 @@ lnk_find_refs(Arena *arena,
default: { NotImplemented; } break; default: { NotImplemented; } break;
} }
member_symbol = lnk_symbol_table_search(symtab, LNK_SymbolScope_Lib, ref_parsed.name);
if (member_symbol) { if (member_symbol) {
lnk_queue_lib_member_input(arena, config, member_symbol, imports_out, objs_out); lnk_queue_lib_member_input(arena, config, member_symbol, imports_out, objs_out);
MemoryZeroStruct(&ref_symbol); MemoryZeroStruct(&ref_symbol);
@@ -1173,6 +1172,9 @@ lnk_find_refs(Arena *arena,
} }
} }
else if (ref_interp == COFF_SymbolValueInterp_Undefined) { else if (ref_interp == COFF_SymbolValueInterp_Undefined) {
MemoryZeroStruct(&ref_symbol);
if (ref_parsed.storage_class == COFF_SymStorageClass_External) {
LNK_Symbol *defn = lnk_symbol_table_search(symtab, LNK_SymbolScope_Defined, ref_parsed.name); LNK_Symbol *defn = lnk_symbol_table_search(symtab, LNK_SymbolScope_Defined, ref_parsed.name);
COFF_ParsedSymbol defn_parsed = lnk_parsed_symbol_from_defined(defn); COFF_ParsedSymbol defn_parsed = lnk_parsed_symbol_from_defined(defn);
COFF_SymbolValueInterpType defn_interp = coff_interp_from_parsed_symbol(defn_parsed); COFF_SymbolValueInterpType defn_interp = coff_interp_from_parsed_symbol(defn_parsed);
@@ -1181,11 +1183,13 @@ lnk_find_refs(Arena *arena,
if (member_symbol) { if (member_symbol) {
lnk_queue_lib_member_input(arena, config, member_symbol, imports_out, objs_out); lnk_queue_lib_member_input(arena, config, member_symbol, imports_out, objs_out);
} }
MemoryZeroStruct(&ref_symbol);
break; break;
} else { } else {
ref_symbol = defn->u.defined; ref_symbol = defn->u.defined;
} }
} else {
break;
}
} else if (ref_interp == COFF_SymbolValueInterp_Regular) { } else if (ref_interp == COFF_SymbolValueInterp_Regular) {
LNK_Symbol *symlink = lnk_obj_get_comdat_symlink(ref_symbol.obj, ref_parsed.section_number); LNK_Symbol *symlink = lnk_obj_get_comdat_symlink(ref_symbol.obj, ref_parsed.section_number);
if (symlink) { if (symlink) {