From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) by sourceware.org (Postfix) with ESMTP id 4C9EE385803F for ; Thu, 17 Jun 2021 07:07:39 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 4C9EE385803F Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-18-JuirTF71NJGd3iS5zHcp2g-1; Thu, 17 Jun 2021 03:07:36 -0400 X-MC-Unique: JuirTF71NJGd3iS5zHcp2g-1 Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.phx2.redhat.com [10.5.11.13]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 36E9D1937FC0; Thu, 17 Jun 2021 07:07:35 +0000 (UTC) Received: from oldenburg.str.redhat.com (ovpn-115-60.ams2.redhat.com [10.36.115.60]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 5CBAE60613; Thu, 17 Jun 2021 07:07:34 +0000 (UTC) From: Florian Weimer To: Mark Olesen via Libc-alpha Cc: Mark Olesen Subject: Re: readdir and ENOENT error or EOF? References: Date: Thu, 17 Jun 2021 09:07:32 +0200 In-Reply-To: (Mark Olesen via Libc-alpha's message of "Wed, 16 Jun 2021 14:49:41 -0600") Message-ID: <87h7hx6kaz.fsf@oldenburg.str.redhat.com> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/27.2 (gnu/linux) MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.13 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Type: text/plain X-Spam-Status: No, score=-6.6 required=5.0 tests=BAYES_00, DKIMWL_WL_HIGH, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, RCVD_IN_DNSWL_LOW, RCVD_IN_MSPIKE_H4, RCVD_IN_MSPIKE_WL, SPF_HELO_NONE, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.2 X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on server2.sourceware.org X-BeenThere: libc-alpha@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Libc-alpha mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 17 Jun 2021 07:07:41 -0000 * Mark Olesen via Libc-alpha: > There appears to be ambiguity in user documentation for readdir when > it returns NULL and errno is set to ENOENT. > > Is this an EOF condition or an actual error that should be handled? > > ... > /* On some systems getdents fails with ENOENT when the > open directory has been rmdir'd already. POSIX.1 > requires that we treat this condition like normal EOF. */ > if (bytes < 0 && errno == ENOENT) > bytes = 0; > ... > https://code.woboq.org/userspace/glibc/sysdeps/posix/readdir.c.htmlin Note that the Linux implementation is in sysdeps/unix/sysv/linux/readdir.c, but it has this quirk as well. I believe this has been copied over from historic times. In general, Linux handles this corner case differently. However, the Linux VFS layer will pass through ENOENT from file system implementations, so if a file system implementation generates ENOENT in its readdir implementation, we might still see ENOENT in userspace. That's why it's difficult to remove the check from glibc's readdir implementation. Thanks, Florian