From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-0.7 required=3.0 tests=FREEMAIL_FORGED_FROMDOMAIN, FREEMAIL_FROM,HEADER_FROM_DIFFERENT_DOMAINS,MAILING_LIST_MULTI,SPF_HELO_NONE, SPF_PASS autolearn=no autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 15CE1C2D0EF for ; Fri, 27 Mar 2020 15:29:23 +0000 (UTC) Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id E0B0120848 for ; Fri, 27 Mar 2020 15:29:22 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org E0B0120848 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=gmx.de Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org Received: from localhost ([::1]:43066 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jHqvB-0007tE-T1 for qemu-devel@archiver.kernel.org; Fri, 27 Mar 2020 11:29:22 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:44077) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jHqrs-00079l-Tv for qemu-devel@nongnu.org; Fri, 27 Mar 2020 11:25:58 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1jHqrr-0000o1-GX for qemu-devel@nongnu.org; Fri, 27 Mar 2020 11:25:56 -0400 Received: from indium.canonical.com ([91.189.90.7]:38402) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1jHqrr-0000gi-70 for qemu-devel@nongnu.org; Fri, 27 Mar 2020 11:25:55 -0400 Received: from loganberry.canonical.com ([91.189.90.37]) by indium.canonical.com with esmtp (Exim 4.86_2 #2 (Debian)) id 1jHqro-0005lg-GQ for ; Fri, 27 Mar 2020 15:25:52 +0000 Received: from loganberry.canonical.com (localhost [127.0.0.1]) by loganberry.canonical.com (Postfix) with ESMTP id 79D932E80C7 for ; Fri, 27 Mar 2020 15:25:52 +0000 (UTC) MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Date: Fri, 27 Mar 2020 15:19:09 -0000 From: Manuel Reimer To: qemu-devel@nongnu.org X-Launchpad-Notification-Type: bug X-Launchpad-Bug: product=qemu; status=Confirmed; importance=Undecided; assignee=None; X-Launchpad-Bug-Tags: linux-user syscall-abi X-Launchpad-Bug-Information-Type: Public X-Launchpad-Bug-Private: no X-Launchpad-Bug-Security-Vulnerability: no X-Launchpad-Bug-Commenters: dflogeras2 liuke manuel-reimer marcin-konarski+u1 philippe-vaucher pmaydell schneiderit X-Launchpad-Bug-Reporter: Kan Li (liuke) X-Launchpad-Bug-Modifier: Manuel Reimer (manuel-reimer) References: <154353638253.10384.17899256838547579767.malonedeb@chaenomeles.canonical.com> Message-Id: <158532234938.20932.15434728289371680888.malone@gac.canonical.com> Subject: [Bug 1805913] Re: readdir() returns NULL (errno=EOVERFLOW) for 32-bit user-static qemu on 64-bit host X-Launchpad-Message-Rationale: Subscriber (QEMU) @qemu-devel-ml X-Launchpad-Message-For: qemu-devel-ml Precedence: bulk X-Generated-By: Launchpad (canonical.com); Revision="a296f04231dee355be5db73cc878b9e21689a253"; Instance="production-secrets-lazr.conf" X-Launchpad-Hash: 67bfd2606546bedf40ed4570f4ab4ac35cd9c2e3 X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 91.189.90.7 X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: Bug 1805913 <1805913@bugs.launchpad.net> Errors-To: qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org Sender: "Qemu-devel" I seem to have found another workaround. Knowing now what causes this my guess was: If I make the qemu-arm-static on the host a 32 bit binary and get "multilib" running to make my 64 bit Linux installation run this, then in theory this incompatibility should not happen. If it would, then 32 bit x86 applications whould run into the same problem. And at least according to my tries, I did so far, this seems to be the case. I was able to reproduce this with svn (no checkout possible from 32 bit armv7h). If the qemu-arm-static binary is a 32 bit x86 application, then SVN checkouts work well now. So until there is a better solution it seems to be a good idea to make the emulation layer run through multilib for 32 bit target architectures, so the host kernel can switch to its 32 bit backwards compatibility mode. -- = You received this bug notification because you are a member of qemu- devel-ml, which is subscribed to QEMU. https://bugs.launchpad.net/bugs/1805913 Title: readdir() returns NULL (errno=3DEOVERFLOW) for 32-bit user-static qemu on 64-bit host Status in QEMU: Confirmed Bug description: This can be simply reproduced by compiling and running the attached C code (readdir-bug.c) under 32-bit user-static qemu, such as qemu-arm- static: # Setup docker for user-static binfmt docker run --rm --privileged multiarch/qemu-user-static:register --reset # Compile the code and run (readdir for / is fine, so create a new direct= ory /test). docker run -v /path/to/qemu-arm-static:/usr/bin/qemu-arm-static -v /path/= to/readdir-bug.c:/tmp/readdir-bug.c -it --rm arm32v7/ubuntu:18.10 bash -c '= { apt update && apt install -y gcc; } >&/dev/null && mkdir -p /test && cd /= test && gcc /tmp/readdir-bug.c && ./a.out' dir=3D0xff5b4150 readdir(dir)=3D(nil) errno=3D75: Value too large for defined data type Do remember to replace the /path/to/qemu-arm-static and /path/to /readdir-bug.c to the actual paths of the files. The root cause is in glibc: https://sourceware.org/git/?p=3Dglibc.git;a=3Dblob;f=3Dsysdeps/unix/sysv/= linux/getdents.c;h=3D6d09a5be7057e2792be9150d3a2c7b293cf6fc34;hb=3Da5275ba5= 378c9256d18e582572b4315e8edfcbfb#l87 By C standard, the return type of readdir() is DIR*, in which the inode number and offset are 32-bit integers, therefore, glibc calls getdents64() and check if the inode number and offset fits the 32-bit range, and reports EOVERFLOW if not. The problem here is for 32-bit user-static qemu running on 64-bit host, getdents64 simply passing through the inode number and offset from underlying getdents64 syscall (from 64-bit kernel), which is very likely to not fit into 32-bit range. On real hardware, the 32-bit kernel creates 32-bit inode numbers, therefore works properly. The glibc code makes sense to do the check to be conformant with C standard, therefore ideally it should be a fix on qemu side. I admit this is difficult because qemu has to maintain a mapping between underlying 64-bit inode numbers and 32-bit inode numbers, which would severely hurt the performance. I don't expect this could be fix anytime soon (or even there would be a fix), but it would be worthwhile to surface this issue. To manage notifications about this bug go to: https://bugs.launchpad.net/qemu/+bug/1805913/+subscriptions