diff options
author | Arun Sharma <arun@sharma-home.net> | 2010-06-08 14:44:07 -0700 |
---|---|---|
committer | Arun Sharma <arun@sharma-home.net> | 2010-06-08 14:44:07 -0700 |
commit | 99e60be5a4c8bc9076d1b11e89a06f85d9da7b88 (patch) | |
tree | 17ab023f691547e1b142421473167e9c1bde0a48 | |
parent | b3757e7792fdd92b49e2c8936e384009add4fee3 (diff) | |
download | libunwind-99e60be5a4c8bc9076d1b11e89a06f85d9da7b88.tar.gz |
Fix the page boundary crossing bug.
Signed-off-by: Jason Evans <jasone@canonware.com>
-rw-r--r-- | src/x86/Ginit.c | 12 | ||||
-rw-r--r-- | src/x86_64/Ginit.c | 12 |
2 files changed, 18 insertions, 6 deletions
diff --git a/src/x86/Ginit.c b/src/x86/Ginit.c index 0af616a5..b8890a3c 100644 --- a/src/x86/Ginit.c +++ b/src/x86/Ginit.c @@ -88,8 +88,14 @@ validate_mem (unw_word_t addr) { int i, victim; #ifdef HAVE_MINCORE - char mvec[2]; /* Unaligned access may cross page boundary */ + unsigned char mvec[2]; /* Unaligned access may cross page boundary */ #endif + size_t len; + + if (PAGE_START(addr + sizeof (unw_word_t) - 1) == PAGE_START(addr)) + len = PAGE_SIZE; + else + len = PAGE_SIZE * 2; addr = PAGE_START(addr); @@ -103,9 +109,9 @@ validate_mem (unw_word_t addr) } #ifdef HAVE_MINCORE - if (mincore ((void *) addr, sizeof (unw_word_t), mvec) == -1) + if (mincore ((void *) addr, len, mvec) == -1) #else - if (msync ((void *) addr, sizeof (unw_word_t), MS_ASYNC) == -1) + if (msync ((void *) addr, len, MS_ASYNC) == -1) #endif return -1; diff --git a/src/x86_64/Ginit.c b/src/x86_64/Ginit.c index 14614f13..8c69b841 100644 --- a/src/x86_64/Ginit.c +++ b/src/x86_64/Ginit.c @@ -91,8 +91,14 @@ validate_mem (unw_word_t addr) { int i, victim; #ifdef HAVE_MINCORE - char mvec[2]; /* Unaligned access may cross page boundary */ + unsigned char mvec[2]; /* Unaligned access may cross page boundary */ #endif + size_t len; + + if (PAGE_START(addr + sizeof (unw_word_t) - 1) == PAGE_START(addr)) + len = PAGE_SIZE; + else + len = PAGE_SIZE * 2; addr = PAGE_START(addr); @@ -106,9 +112,9 @@ validate_mem (unw_word_t addr) } #ifdef HAVE_MINCORE - if (mincore ((void *) addr, sizeof (unw_word_t), mvec) == -1) + if (mincore ((void *) addr, len, mvec) == -1) #else - if (msync ((void *) addr, sizeof (unw_word_t), MS_ASYNC) == -1) + if (msync ((void *) addr, len, MS_ASYNC) == -1) #endif return -1; |