diff options
author | dave lerner <dlerner@windriver.com> | 2013-03-07 12:25:19 -0600 |
---|---|---|
committer | Arun Sharma <asharma@fb.com> | 2013-03-10 14:59:44 -0700 |
commit | 8028a537dd936d02204605065eaabf52be148294 (patch) | |
tree | 570117d018aa3e048d44ffc2de4026b9fd7b1881 | |
parent | 679b65cd221efa7df42b6a369c7b1ebe9d8b5c3e (diff) | |
download | libunwind-8028a537dd936d02204605065eaabf52be148294.tar.gz |
unw_is_signal_frame should return false/0 for bad addresses
access_mem() could fail and return a non-zero value, which callers
interpret as boolean true.
Signed-off-by: Dave Lerner <dave.lerner@windriver.com>
-rw-r--r-- | src/x86/Gos-linux.c | 9 |
1 files changed, 5 insertions, 4 deletions
diff --git a/src/x86/Gos-linux.c b/src/x86/Gos-linux.c index 31f83bae..8bc24a8c 100644 --- a/src/x86/Gos-linux.c +++ b/src/x86/Gos-linux.c @@ -57,10 +57,11 @@ unw_is_signal_frame (unw_cursor_t *cursor) if SA_SIGINFO is specified. */ ip = c->dwarf.ip; - if ((ret = (*a->access_mem) (as, ip, &w0, 0, arg)) < 0 - || (ret = (*a->access_mem) (as, ip + 4, &w1, 0, arg)) < 0) - return ret; - ret = ((w0 == 0x0077b858 && w1 == 0x80cd0000) + if ((*a->access_mem) (as, ip, &w0, 0, arg) < 0 + || (*a->access_mem) (as, ip + 4, &w1, 0, arg) < 0) + ret = 0; + else + ret = ((w0 == 0x0077b858 && w1 == 0x80cd0000) || (w0 == 0x0000adb8 && (w1 & 0xffffff) == 0x80cd00)); Debug (16, "returning %d\n", ret); return ret; |