summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorArun Sharma <arun@sharma-home.net>2010-06-08 14:44:07 -0700
committerArun Sharma <arun@sharma-home.net>2010-06-08 14:44:07 -0700
commit99e60be5a4c8bc9076d1b11e89a06f85d9da7b88 (patch)
tree17ab023f691547e1b142421473167e9c1bde0a48
parentb3757e7792fdd92b49e2c8936e384009add4fee3 (diff)
downloadlibunwind-99e60be5a4c8bc9076d1b11e89a06f85d9da7b88.tar.gz
Fix the page boundary crossing bug.
Signed-off-by: Jason Evans <jasone@canonware.com>
-rw-r--r--src/x86/Ginit.c12
-rw-r--r--src/x86_64/Ginit.c12
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;