diff options
author | Keith Kanios <keith@kanios.net> | 2011-04-11 21:38:50 -0500 |
---|---|---|
committer | Cyrill Gorcunov <gorcunov@gmail.com> | 2011-07-04 00:38:33 +0400 |
commit | 52afa0c5d4eb78169dffd1cd8fe5f743a6b80031 (patch) | |
tree | d1d675a81d2d1973a0c300b652fea7ce12efae62 | |
parent | 56dd9fd83d2191b92d7606df3dbbb1ee948a869f (diff) | |
download | nasm-52afa0c5d4eb78169dffd1cd8fe5f743a6b80031.tar.gz |
BR3282788: Fix 64-bit Mach-O bug that crashes NASM due to NULL symbols
-rw-r--r-- | output/outmac64.c | 34 |
1 files changed, 26 insertions, 8 deletions
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; } |