diff options
author | Peter Maydell <peter.maydell@linaro.org> | 2012-05-03 19:32:15 +0100 |
---|---|---|
committer | Anthony Liguori <aliguori@us.ibm.com> | 2012-05-08 11:15:18 -0500 |
commit | c5954819b6ee601024c081635be0336ce0cb1115 (patch) | |
tree | 09eb4caba3e170ed336e43bbb479e57bc8c4a2e9 | |
parent | 90f2cefb17f3e25272143f43cd00f6347e65987b (diff) |
user-exec.c: Don't assert on segfaults for non-valid addresses
h2g() will assert if passed an address that's not a valid guest address,
so handle_cpu_signal() needs to check before passing "data address
which caused a segfault" to it, since for a misbehaving guest
that could be anything. If the address isn't a valid guest address
then we can simply skip the attempt to unprotect a guest page
which was made read-only to catch self-modifying code.
This assertion probably fires more readily now than it used to
do because of recent changes to default to reserving guest address
space.
Acked-by: Alexander Graf <agraf@suse.de>
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
-rw-r--r-- | user-exec.c | 3 |
1 files changed, 2 insertions, 1 deletions
diff --git a/user-exec.c b/user-exec.c index be6bc4f64c..d8c2ad9f2f 100644 --- a/user-exec.c +++ b/user-exec.c @@ -97,7 +97,8 @@ static inline int handle_cpu_signal(uintptr_t pc, unsigned long address, pc, address, is_write, *(unsigned long *)old_set); #endif /* XXX: locking issue */ - if (is_write && page_unprotect(h2g(address), pc, puc)) { + if (is_write && h2g_valid(address) + && page_unprotect(h2g(address), pc, puc)) { return 1; } |