netlink broken on big-endian mips
| Affects | Status | Importance | Assigned to | Milestone | |
|---|---|---|---|---|---|
| QEMU |
Fix Released
|
Undecided
|
Unassigned | ||
Bug Description
Debian QEMU version 2.7.0, but the bug also appears in current git master (commit c36ed06e9159)
As the summary says, netlink is completely broken on big-endian mips running qemu-user.
Running 'ip route' from within a Debian chroot with QEMU simply hangs. Running amd64 strace on qemu-mips-static shows that it's waiting for a netlink response from the kernel which never comes.
[...]
[pid 11249] socket(AF_NETLINK, SOCK_RAW|
[pid 11249] setsockopt(3, SOL_SOCKET, SO_SNDBUF, [32768], 4) = 0
[pid 11249] setsockopt(3, SOL_SOCKET, SO_RCVBUF, [1048576], 4) = 0
[pid 11249] bind(3, {sa_family=
[pid 11249] getsockname(3, {sa_family=
[pid 11249] time([1479745823]) = 1479745823
[pid 11249] sendto(3, {{len=671088640, type=0x1a00 /* NLMSG_??? */, flags=NLM_
[pid 11249] recvmsg(3,
Notice the len in the buffer passed to the kernel is 0x28000000 which looks byteswapped.
Removing the call to fd_trans_unregister in the NR_socket syscall in do_syscall fixes this for me, but I don't understand why the fd translation was immediately unregistered after being registered just before in do_socket - presumably it was added for a reason.
--- a/linux-
+++ b/linux-
@@ -9331,7 +9331,6 @@ abi_long do_syscall(void *cpu_env, int num, abi_long arg1,
#ifdef TARGET_NR_socket
case TARGET_NR_socket:
ret = do_socket(arg1, arg2, arg3);
- fd_trans_
break;
#endif
#ifdef TARGET_
| Changed in qemu: | |
| status: | Fix Committed → Fix Released |

I also notice fd_trans_unregister does not appear in the socketcall implementation which seems like an oversight.