diff options
| author | Laurent Vivier <laurent@vivier.eu> | 2012-12-20 11:00:11 +0000 |
|---|---|---|
| committer | Laurent Vivier <laurent@vivier.eu> | 2013-01-30 12:13:21 +0100 |
| commit | 79dd77de124c47263f54e5f686273487e0016a8f (patch) | |
| tree | cc0c412e0ddd0f5382e158a7e31e547179747c39 /linux-user/syscall.c | |
| parent | 4c37ef022381e777251d7084591978a4dc622efe (diff) | |
| download | focaccia-qemu-79dd77de124c47263f54e5f686273487e0016a8f.tar.gz focaccia-qemu-79dd77de124c47263f54e5f686273487e0016a8f.zip | |
linux-user: correct msgrcv()
All parameters must be swapped before the call of do_msgrcv(). Allow faked (debian fakeroot daemon) to work properly. WITHOUT this patch: $ faked-sysv --foreground --debug using 1723744788 as msg key msg_key=1723744788 1723744788:431 FAKEROOT: msg=131072, key=1723744788 FAKEROOT: r=-1, received message type=-150996052, message=-160219330 FAKEROOT, get_msg: Bad address r=14, EINTR=4 fakeroot: clearing up message queues and semaphores, signal=-1 fakeroot: database save FAILED WITH this patch: $ faked-sysv --foreground --debug using 1569385744 as msg key msg_key=1569385744 1569385744:424 FAKEROOT: msg=0, key=1569385744 ^C fakeroot: clearing up message queues and semaphores, signal=2 fakeroot: database save FAILED Signed-off-by: Laurent Vivier <laurent@vivier.eu> Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
Diffstat (limited to 'linux-user/syscall.c')
| -rw-r--r-- | linux-user/syscall.c | 4 |
1 files changed, 2 insertions, 2 deletions
diff --git a/linux-user/syscall.c b/linux-user/syscall.c index 693e66fc4f..a6f42718c8 100644 --- a/linux-user/syscall.c +++ b/linux-user/syscall.c @@ -2897,7 +2897,7 @@ static inline abi_long do_msgrcv(int msqid, abi_long msgp, return -TARGET_EFAULT; host_mb = g_malloc(msgsz+sizeof(long)); - ret = get_errno(msgrcv(msqid, host_mb, msgsz, tswapal(msgtyp), msgflg)); + ret = get_errno(msgrcv(msqid, host_mb, msgsz, msgtyp, msgflg)); if (ret > 0) { abi_ulong target_mtext_addr = msgp + sizeof(abi_ulong); @@ -3189,7 +3189,7 @@ static abi_long do_ipc(unsigned int call, int first, break; } - ret = do_msgrcv(first, tmp->msgp, second, tmp->msgtyp, third); + ret = do_msgrcv(first, tswapal(tmp->msgp), second, tswapal(tmp->msgtyp), third); unlock_user_struct(tmp, ptr, 0); break; |