diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2022-06-05 12:21:40 +0200 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2022-06-05 12:21:40 +0200 |
| commit | fbb89dcf1084dd0fb7ecea8e6ff6fb2e7f3b15b4 (patch) | |
| tree | b0f14ba47c94db565f4f5180ddfb822bc5fb33d6 | |
| parent | 736552a5599bff6dcb1b7b020ba2679814b83219 (diff) | |
| download | box64-fbb89dcf1084dd0fb7ecea8e6ff6fb2e7f3b15b4.tar.gz box64-fbb89dcf1084dd0fb7ecea8e6ff6fb2e7f3b15b4.zip | |
Added some failsafe on unwind
| -rw-r--r-- | src/elfs/elfdwarf_private.c | 4 | ||||
| -rwxr-xr-x | src/elfs/elfloader.c | 2 | ||||
| -rwxr-xr-x | src/include/elfloader.h | 2 |
3 files changed, 6 insertions, 2 deletions
diff --git a/src/elfs/elfdwarf_private.c b/src/elfs/elfdwarf_private.c index bae2b4ea..84ee71dd 100644 --- a/src/elfs/elfdwarf_private.c +++ b/src/elfs/elfdwarf_private.c @@ -108,6 +108,10 @@ uintptr_t get_parent_registers(dwarf_unwind_t *unwind, const elfheader_t *ehdr, *success = 0; return 0; } + if(!IsAddressInElfSpace(ehdr, ehdr->ehframehdr)) { + *success = 0; + return 0; + } unsigned char ehfh_version = *(unsigned char*)ehdr->ehframehdr; if (ehfh_version != 1) { *success = 0; diff --git a/src/elfs/elfloader.c b/src/elfs/elfloader.c index 338a57ca..3bbd2206 100755 --- a/src/elfs/elfloader.c +++ b/src/elfs/elfloader.c @@ -1258,7 +1258,7 @@ uint32_t GetBaseSize(elfheader_t* h) return h->memsz; } -int IsAddressInElfSpace(elfheader_t* h, uintptr_t addr) +int IsAddressInElfSpace(const elfheader_t* h, uintptr_t addr) { if(!h) return 0; diff --git a/src/include/elfloader.h b/src/include/elfloader.h index 86efe061..2cb90df4 100755 --- a/src/include/elfloader.h +++ b/src/include/elfloader.h @@ -40,7 +40,7 @@ void RunDeferedElfInit(x64emu_t *emu); void* GetBaseAddress(elfheader_t* h); void* GetElfDelta(elfheader_t* h); uint32_t GetBaseSize(elfheader_t* h); -int IsAddressInElfSpace(elfheader_t* h, uintptr_t addr); +int IsAddressInElfSpace(const elfheader_t* h, uintptr_t addr); elfheader_t* FindElfAddress(box64context_t *context, uintptr_t addr); const char* FindNearestSymbolName(elfheader_t* h, void* p, uintptr_t* start, uint64_t* sz); int32_t GetTLSBase(elfheader_t* h); |