From nobody Fri Jul 11 20:43:51 2025 X-Original-To: dev-commits-src-main@mlmmj.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mlmmj.nyi.freebsd.org (Postfix) with ESMTP id 4bf3bC6dgJz60p0T; Fri, 11 Jul 2025 20:43:51 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "R10" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4bf3bC5rmRz3J95; Fri, 11 Jul 2025 20:43:51 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1752266631; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=tXVVKRi4nyclW9Tn3jlQHVr8R8iTOL4s2s7IhzC7Jx0=; b=RMTMFKUdBqzTeuzkFqHWMEgAHyhE2pJpNOEQz4ciMqOXOHDq72UkCwOvcqvzRWU3VYl7fG d8s1YjUOQsIo+96F2SuO7KV79wgRoOdba/e5YYz/2lQaIhU68KArSLTwmbRMi4nlt6Z9K2 HCC5bGdGESBCh/SilK+fjjzr8qqtbMl2GsOMMCDLzO3nr+0rbP17NMAQ9SIruZI8qzMj+n W4Si9BQvOa6rcuvX4LiNZRclQxSi5iGOER2G353osf2Pm8XsVwsTTxWossEsfn5LW6tYuL mku4JAM3Ni6zlYHpNhuJpaa/ov8Dehg1Mn6PVMXtFxShzNmGNLGUZyRwnO1fdA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1752266631; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=tXVVKRi4nyclW9Tn3jlQHVr8R8iTOL4s2s7IhzC7Jx0=; b=i5jaw1VYH/kytKK40EE+ZLA+ZrSsVTIpxPnnOl9NuxzLoULf+iOlTN0Hx9cjcppt39GMR3 5vEvgQFg5M4ikBJUlfL6hIQ3MqH7WWZfX2blTK3nfXYHxYKQy9mkSCmYcX52r/+cODV6MB nE7yOku3bTtdTN2yM6Ky6/c8l97wwhpgBKulOPLAnRv4hblMBe1hvv8FRLKg9eNOlZHUCB pyxosmANE3+/znHPcHuqeustHzU7aP08UvLdM9HqoOy+AmCe7HBjR/9juVT/WDRc79dmWd BotHzdIhoAVSJ/n7uVJNarE2CSXGQsmVTfbExMJWfvRCFNuK/vtkaqM8atIsCQ== ARC-Authentication-Results: i=1; mx1.freebsd.org; none ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1752266631; a=rsa-sha256; cv=none; b=XmD3NXFO5X0UV6OPVlF5cQR8G5gt8BAdeoO3Gc30rn9U1v6gjeYxl1zD5C7Ls6bC9/YPQw QaDwd0Ve9E39H0hqhXwK0MyCyGCdcIsaOCpAofaNnbCYv1Qpmzk4uvOd/oXyDUq9kU+3Y/ xedX7lhhU1XAiceqMx784yNiTVGfIejtRQHzPj4R0wl0RBZttrnQyxesftVGSpdvnNkbXk QZTf4gMjlJDNcaUAWL3alV9noosEZG6frYLuG8Khf5uMNoI3q9eMYNbujYHLoR/tqphB9D aNQBOOjUWvqOiTU0ntdUJmsAaz0YmXSFzrMNCdbhC77tLaFKo+WwaKEqWBlvUQ== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (Client did not present a certificate) by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id 4bf3bC5HNLztJ8; Fri, 11 Jul 2025 20:43:51 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org ([127.0.1.44]) by gitrepo.freebsd.org (8.18.1/8.18.1) with ESMTP id 56BKhpW2086933; Fri, 11 Jul 2025 20:43:51 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.18.1/8.18.1/Submit) id 56BKhpGc086930; Fri, 11 Jul 2025 20:43:51 GMT (envelope-from git) Date: Fri, 11 Jul 2025 20:43:51 GMT Message-Id: <202507112043.56BKhpGc086930@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: Dag-Erling =?utf-8?Q?Sm=C3=B8rgrav?= Subject: git: 920b2183919e - main - readdir: Fix error check. List-Id: Commit messages for the main branch of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-main List-Help: List-Post: List-Subscribe: List-Unsubscribe: X-BeenThere: dev-commits-src-main@freebsd.org Sender: owner-dev-commits-src-main@FreeBSD.org MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: des X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: 920b2183919e430cf85c4aa1fa337bfded12aee5 Auto-Submitted: auto-generated The branch main has been updated by des: URL: https://cgit.FreeBSD.org/src/commit/?id=920b2183919e430cf85c4aa1fa337bfded12aee5 commit 920b2183919e430cf85c4aa1fa337bfded12aee5 Author: Dag-Erling Smørgrav AuthorDate: 2025-07-11 20:43:20 +0000 Commit: Dag-Erling Smørgrav CommitDate: 2025-07-11 20:43:32 +0000 readdir: Fix error check. Now that dd_size is unsigned, we need to check if the return value from getdirentries() was negative before assigning it to dd_size. While here, simplify the scandir_error test case slightly, and verify that calling readdir() again after EOF still returns NULL. Fixes: 42e613018da5 Sponsored by: Klara, Inc. Reviewed by: kevans Differential Revision: https://reviews.freebsd.org/D51266 --- lib/libc/gen/readdir.c | 7 +++++-- lib/libc/tests/gen/opendir_test.c | 1 + lib/libc/tests/gen/scandir_test.c | 12 +++++------- 3 files changed, 11 insertions(+), 9 deletions(-) diff --git a/lib/libc/gen/readdir.c b/lib/libc/gen/readdir.c index 32603c0b4677..b70102954df1 100644 --- a/lib/libc/gen/readdir.c +++ b/lib/libc/gen/readdir.c @@ -50,6 +50,7 @@ _readdir_unlocked(DIR *dirp, int flags) struct dirent *dp; off_t initial_seek; size_t initial_loc = 0; + ssize_t ret; for (;;) { if (dirp->dd_loc >= dirp->dd_size) { @@ -61,11 +62,13 @@ _readdir_unlocked(DIR *dirp, int flags) } if (dirp->dd_loc == 0 && !(dirp->dd_flags & (__DTF_READALL | __DTF_SKIPREAD))) { + dirp->dd_size = 0; initial_seek = dirp->dd_seek; - dirp->dd_size = _getdirentries(dirp->dd_fd, + ret = _getdirentries(dirp->dd_fd, dirp->dd_buf, dirp->dd_len, &dirp->dd_seek); - if (dirp->dd_size <= 0) + if (ret <= 0) return (NULL); + dirp->dd_size = (size_t)ret; _fixtelldir(dirp, initial_seek, initial_loc); } dirp->dd_flags &= ~__DTF_SKIPREAD; diff --git a/lib/libc/tests/gen/opendir_test.c b/lib/libc/tests/gen/opendir_test.c index 89be2becc607..b7481255654f 100644 --- a/lib/libc/tests/gen/opendir_test.c +++ b/lib/libc/tests/gen/opendir_test.c @@ -46,6 +46,7 @@ opendir_check(const struct atf_tc *tc, DIR *dirp) ATF_CHECK_STREQ("subdir", ent->d_name); ATF_CHECK_EQ(DT_DIR, ent->d_type); ATF_CHECK(readdir(dirp) == NULL); + ATF_CHECK(readdir(dirp) == NULL); } ATF_TC(opendir_ok); diff --git a/lib/libc/tests/gen/scandir_test.c b/lib/libc/tests/gen/scandir_test.c index f7b52b5e3616..afd25bf7c0b2 100644 --- a/lib/libc/tests/gen/scandir_test.c +++ b/lib/libc/tests/gen/scandir_test.c @@ -157,7 +157,7 @@ ATF_TC_BODY(scandir_error, tc) { char path[16]; struct dirent **namelist = NULL; - int fd, i, ret; + int fd, i; ATF_REQUIRE_EQ(0, mkdir("dir", 0755)); for (i = 0; i < 1024; i++) { @@ -170,9 +170,8 @@ ATF_TC_BODY(scandir_error, tc) scandir_error_count = 0; scandir_error_fd = fd; scandir_error_select_return = 0; - ret = fdscandir(fd, &namelist, scandir_error_select, NULL); - ATF_CHECK_EQ(-1, ret); - ATF_CHECK_ERRNO(EBADF, ret < 0); + ATF_CHECK_ERRNO(EBADF, + fdscandir(fd, &namelist, scandir_error_select, NULL) < 0); ATF_CHECK_EQ(NULL, namelist); /* second pass, select everything */ @@ -180,9 +179,8 @@ ATF_TC_BODY(scandir_error, tc) scandir_error_count = 0; scandir_error_fd = fd; scandir_error_select_return = 1; - ret = fdscandir(fd, &namelist, scandir_error_select, NULL); - ATF_CHECK_EQ(-1, ret); - ATF_CHECK_ERRNO(EBADF, ret < 0); + ATF_CHECK_ERRNO(EBADF, + fdscandir(fd, &namelist, scandir_error_select, NULL) < 0); ATF_CHECK_EQ(NULL, namelist); }