From patchwork Wed Sep 30 08:45:07 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Danny Milosavljevic X-Patchwork-Id: 24382 Return-Path: X-Original-To: patchwork@mira.cbaines.net Delivered-To: patchwork@mira.cbaines.net Received: by mira.cbaines.net (Postfix, from userid 113) id 2F70F27BBE8; Wed, 30 Sep 2020 09:46:50 +0100 (BST) X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on mira.cbaines.net X-Spam-Level: X-Spam-Status: No, score=-2.9 required=5.0 tests=BAYES_00,MAILING_LIST_MULTI, RCVD_IN_MSPIKE_H4,RCVD_IN_MSPIKE_WL autolearn=unavailable autolearn_force=no version=3.4.2 Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mira.cbaines.net (Postfix) with ESMTPS id 9CCED27BBE9 for ; Wed, 30 Sep 2020 09:46:49 +0100 (BST) Received: from localhost ([::1]:34892 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1kNXlA-0005DM-OR for patchwork@mira.cbaines.net; Wed, 30 Sep 2020 04:46:48 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:53180) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1kNXkQ-0005AN-Ud for guix-patches@gnu.org; Wed, 30 Sep 2020 04:46:02 -0400 Received: from debbugs.gnu.org ([209.51.188.43]:46542) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1kNXkQ-0008EN-Kc for guix-patches@gnu.org; Wed, 30 Sep 2020 04:46:02 -0400 Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.84_2) (envelope-from ) id 1kNXkQ-0005GQ-Ic for guix-patches@gnu.org; Wed, 30 Sep 2020 04:46:02 -0400 X-Loop: help-debbugs@gnu.org Subject: [bug#43591] [PATCH core-updates v2 0/5] gnu: glibc-final: Catch all cases of a glibc user not requesting 64-bit offsets and then using readdir. Resent-From: Danny Milosavljevic Original-Sender: "Debbugs-submit" Resent-CC: guix-patches@gnu.org Resent-Date: Wed, 30 Sep 2020 08:46:02 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 43591 X-GNU-PR-Package: guix-patches X-GNU-PR-Keywords: patch To: 43591@debbugs.gnu.org Cc: Danny Milosavljevic Received: via spool by 43591-submit@debbugs.gnu.org id=B43591.160145556020190 (code B ref 43591); Wed, 30 Sep 2020 08:46:02 +0000 Received: (at 43591) by debbugs.gnu.org; 30 Sep 2020 08:46:00 +0000 Received: from localhost ([127.0.0.1]:58079 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1kNXkN-0005FT-Rk for submit@debbugs.gnu.org; Wed, 30 Sep 2020 04:46:00 -0400 Received: from dd26836.kasserver.com ([85.13.145.193]:33114) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1kNXkL-0005Ek-Ak for 43591@debbugs.gnu.org; Wed, 30 Sep 2020 04:45:58 -0400 Received: from dayas.lan (80-110-126-103.cgn.dynamic.surfer.at [80.110.126.103]) by dd26836.kasserver.com (Postfix) with ESMTPSA id ADC283362C2B; Wed, 30 Sep 2020 10:45:55 +0200 (CEST) From: Danny Milosavljevic Date: Wed, 30 Sep 2020 10:45:07 +0200 Message-Id: <20200930084512.31738-1-dannym@scratchpost.org> X-Mailer: git-send-email 2.27.0 In-Reply-To: <20200924141211.21649-1-dannym@scratchpost.org> References: <20200924141211.21649-1-dannym@scratchpost.org> MIME-Version: 1.0 Tags: patch X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list X-BeenThere: guix-patches@gnu.org List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: guix-patches-bounces+patchwork=mira.cbaines.net@gnu.org Sender: "Guix-patches" X-getmail-retrieved-from-mailbox: Patches Linux kernel file offsets are always 64 bits. But userspace can be built to use 32 bit offsets. "struct dirent", returned by readdir, uses d_off to store such an "offset" that it got from the Linux kernel. In the case of ext4 that "offset" is actually a 64 bit hash value. Therefore, there are cases where such an offset that it got from the Linux kernel does not fit in the "struct dirent" field "d_off". If the guest system's glibc is 32 bit AND uses 32 bit file offsets it is going to be very confused. It does check whether d_off fits into the structure it gives back to the user--and it doesn't fit. Hence readdir fails, with errno == EOVERFLOW (which is undocumented and thus an API error). This manifests itself in simple directory reads not working anymore in parts of cmake, for example. This happened in Guix when building stuff for ARMHF on a x86_64 build host using QEMU transparent emulation. There is a very simple and complete way to avoid this problem: Just always use 64 bit offsets in user space programs (also on 32 bit machines). Danny Milosavljevic (5): gnu: glibc-final: Catch all cases of a glibc user not requesting 64-bit offsets and then using readdir regardless. build-system/gnu: Explicity declare the _FILE_OFFSET_BITS we want. gnu: glibc: Do not explicitly set _FILE_OFFSET_BITS. gnu: glibc-mesboot0: Do not explicitly set _FILE_OFFSET_BITS. gnu: rhash: Explicity declare the _FILE_OFFSET_BITS we want. gnu/packages/base.scm | 2 + gnu/packages/commencement.scm | 70 ++++++++++++++++++++++++++++++++- gnu/packages/crypto.scm | 9 ++++- guix/build/gnu-build-system.scm | 13 +++++- 4 files changed, 90 insertions(+), 4 deletions(-)