summary refs log tree commit diff stats
path: root/linux-user/syscall.c
diff options
context:
space:
mode:
authorAlexander Graf <agraf@suse.de>2011-11-21 12:04:07 +0100
committerRiku Voipio <riku.voipio@linaro.org>2012-02-02 17:51:20 +0200
commit962b289ef35087fcd8764e4e29808d8ac90157f7 (patch)
tree01641e19658a15ae9861350a18273b580c0faccc /linux-user/syscall.c
parent583359a68922fb91b793a5ad3a2dd4536bf9b99e (diff)
downloadfocaccia-qemu-962b289ef35087fcd8764e4e29808d8ac90157f7.tar.gz
focaccia-qemu-962b289ef35087fcd8764e4e29808d8ac90157f7.zip
linux-user: fix QEMU_STRACE=1 segfault
While debugging some issues with QEMU_STRACE I stumbled over segmentation
faults that were pretty reproducible. Turns out we tried to treat a
normal return value as errno, resulting in an access over array boundaries
for the resolution.

Fix this by allowing failure to resolve invalid errnos into strings.

Signed-off-by: Alexander Graf <agraf@suse.de>
Signed-off-by: Riku Voipio <riku.voipio@linaro.org>
Diffstat (limited to 'linux-user/syscall.c')
-rw-r--r--linux-user/syscall.c3
1 files changed, 3 insertions, 0 deletions
diff --git a/linux-user/syscall.c b/linux-user/syscall.c
index 15b8b22936..29d92c4afb 100644
--- a/linux-user/syscall.c
+++ b/linux-user/syscall.c
@@ -731,6 +731,9 @@ static inline int is_error(abi_long ret)
 
 char *target_strerror(int err)
 {
+    if ((err >= ERRNO_TABLE_SIZE) || (err < 0)) {
+        return NULL;
+    }
     return strerror(target_to_host_errno(err));
 }