Skip to content

Commit

Permalink
linux-user: correct msgrcv()
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
vivier committed Jan 30, 2013
1 parent 4c37ef0 commit 79dd77d
Showing 1 changed file with 2 additions and 2 deletions.
4 changes: 2 additions & 2 deletions linux-user/syscall.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down Expand Up @@ -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;
Expand Down

0 comments on commit 79dd77d

Please sign in to comment.