qemu-arm
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-arm] recvfrom error with linux-user emulating armhf on aarch64


From: Philippe Mathieu-Daudé
Subject: Re: [Qemu-arm] recvfrom error with linux-user emulating armhf on aarch64
Date: Tue, 23 Jan 2018 11:42:48 -0300
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Thunderbird/52.5.2

Hi Guido, Laurent,

On 01/23/2018 09:05 AM, Guido Günther wrote:
> Hi,
> Running the attached program⁰ in a armhf chroot on a arm64 host¹ like:
> 
>     chroot . /usr/bin/qemu-arm-static tmp/nl-bad-addr
> 
> fails with "Bad address" when invoking audit_log_acct_message. strace looks 
> like:
> 
>   [..snip..]
>   31572 socket(AF_NETLINK, SOCK_RAW, NETLINK_AUDIT) = 3
>   ...
>   31572 sendto(3, {{len=124, type=0x454 /* NLMSG_??? */, 
> flags=NLM_F_REQUEST|NLM_F_ACK, seq=1, pid=0}, "op=test:message acct=\"?\" 
> exe=\"/tmp/nl-bad-addr\" hostname=localhost addr=? terminal=/dev/pts/2 
> res=success\0\0\0"}, 124, 0, 0xfffffa3897d0, 0) = 124

the do_sendto() seems to correctly handle the u64 target_addr

>   31572 ppoll([{fd=3, events=POLLIN}], 1, {tv_sec=0, tv_nsec=500000000}, 
> NULL, 0) = 1 ([{fd=3, revents=POLLIN}], left {tv_sec=0, tv_nsec=499993180})
>   31572 recvfrom(3, 0x112a50eb4, 8988, MSG_PEEK|MSG_DONTWAIT, 0xfffffa3897e0, 
> 0x42) = -1 EFAULT (Bad address)

but the recvfrom() code is:

static abi_long do_recvfrom(int fd, abi_ulong msg, size_t len,
                            int flags,
                            abi_ulong target_addr,
                            abi_ulong target_addrlen)
{
    [...]
    if (target_addr) {
        if (get_user_u32(addrlen, target_addrlen)) {
            ret = -TARGET_EFAULT;
            goto fail;
        }

so current code won't work on 64-bit host, and we are probably lucky it
works on x86_64.

>   [..snip..]
> 
> And it fails in
> 
>    ret = get_errno(safe_recvfrom(fd, host_msg, len, flags,
>                                       addr, &addrlen));
> 
> in linux-user/syscall.c:do_recvfrom but I have no idea yet what causes this.
> 
> However the same works without problems when the host is a x86_64 box.
> Any pointers in debugging this further would be appreciated.

Laurent, in do_syscall() should we swap the pid back?

@@ -10628,4 +10628,5 @@ abi_long do_syscall(...
         target_header->version = tswap32(header.version);
+        target_header->pid = tswap32(header.pid);
         unlock_user_struct(target_header, arg1, 1);

> 
> The issue is also present in qemu master. The overall goal is to get
> 
>    qemu-debootstrap --arch armhf buster chroot
> 
> to succeed on an aarch64 host as it does on x86_64.
> Cheers,
>  -- Guido
> 
> ⁹: which is a stripped down testcase for /usr/bin/chfn failing
> ¹: the scaleway server this runs on doesn't support armhf.
> 

Attachment: signature.asc
Description: OpenPGP digital signature


reply via email to

[Prev in Thread] Current Thread [Next in Thread]