From: Keith Kanios Date: Tue, 12 Apr 2011 02:38:50 +0000 (-0500) Subject: BR3282788: Fix 64-bit Mach-O bug that crashes NASM due to NULL symbols X-Git-Tag: nasm-2.10rc5~1 X-Git-Url: https://repo.or.cz/w/nasm.git/commitdiff_plain/805266443346f4dcbc387508679a445f47e5f662 BR3282788: Fix 64-bit Mach-O bug that crashes NASM due to NULL symbols --- diff --git a/output/outmac64.c b/output/outmac64.c index f633db03..6dc0c44a 100644 --- a/output/outmac64.c +++ b/output/outmac64.c @@ -299,16 +299,34 @@ static uint8_t get_section_fileindex_by_index(const int32_t index) static struct symbol *get_closest_section_symbol_by_offset(uint8_t fileindex, int64_t offset) { - struct symbol *sym; + struct symbol *sym; + struct symbol *nearest = NULL; + int64_t sval, nval, sdiff, ndiff; - for (sym = syms; sym != NULL; sym = sym->next) { - if ((sym->sect != NO_SECT) && - (sym->sect == fileindex) && - ((int64_t)sym->value >= offset)) - return sym; - } + for (sym = syms; sym != NULL; sym = sym->next) { + if ((sym->sect != NO_SECT) && (sym->sect == fileindex)){ + if(nearest == NULL){ + nearest = sym; + }else{ + sval = (int64_t)sym->value; + nval = (int64_t)nearest->value; + + sdiff = ((sval >= offset) ? (sval - offset) : (offset - sval)); + ndiff = ((nval >= offset) ? (nval - offset) : (offset - nval)); + + if(sdiff <= ndiff){ + nearest = sym; + } + + /* Symbols should be in order, so this optimization should be OK */ + if((int64_t)nearest->value >= offset){ + break; + } + } + } + } - return NULL; + return nearest; }