From patchwork Sat Jun 14 11:25:04 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Matteo Croce X-Patchwork-Id: 114492 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 388823915FC3 for ; Sat, 14 Jun 2025 14:05:51 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 388823915FC3 Authentication-Results: sourceware.org; dkim=pass (2048-bit key, unprotected) header.d=gmail.com header.i=@gmail.com header.a=rsa-sha256 header.s=20230601 header.b=Nho17wS+ X-Original-To: libc-alpha@sourceware.org Delivered-To: libc-alpha@sourceware.org Received: from mail-wr1-x436.google.com (mail-wr1-x436.google.com [IPv6:2a00:1450:4864:20::436]) by sourceware.org (Postfix) with ESMTPS id 247FC383981E for ; Sat, 14 Jun 2025 14:05:11 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 247FC383981E Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=gmail.com ARC-Filter: OpenARC Filter v1.0.0 sourceware.org 247FC383981E Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=2a00:1450:4864:20::436 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1749909911; cv=none; b=OC0skZ8mlveKS9L2frg6sTr0Za2iVSIgqUmrnrVrzz1Auxgb6okDvp5CEVz+IKeNpUloid6Le0dg7F4zEAi4HK+WyoVSnBP8H3kgpXYG9l/NriOYqfPxLxXsQ0JydwPzzAyImdfIwb07Vh3XR/3cOcV6ouILH+UchPQ7iqRnCp4= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1749909911; c=relaxed/simple; bh=SQUMhDarq8vCAT0IR0yOScHItIEe/SqO3at6PVAzgVw=; h=DKIM-Signature:From:To:Subject:Date:Message-ID:MIME-Version; b=Tf1I0GwzJ/NEaYstJsgXcBHkCsOA8Zlv7ds/aCrY8s3v3PgbnoS6Pn4lBU8peFy+9qhHwmA+XzhpjtowS1xcXjjrSnJExIFENEXs4UO17bQAWvuUfqR5eKGlsfNV1h2LWijSEWXdo5M+VtgSIK5Zj1Pvr+ISHAAWQBa8/thMUrg= ARC-Authentication-Results: i=1; server2.sourceware.org DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 247FC383981E Received: by mail-wr1-x436.google.com with SMTP id ffacd0b85a97d-3a52874d593so3006575f8f.0 for ; Sat, 14 Jun 2025 07:05:11 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1749909910; x=1750514710; darn=sourceware.org; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:from:to:cc:subject:date:message-id:reply-to; bh=LGnmkslgEVpFmKpg7arjY6bzEFNB1S5pSIPQqnZ7kjs=; b=Nho17wS+G0g6HD2ZzGGqCh4NY3+QSNLdSLhouQsJRANGvnic4Zc3QcCz5YwFIvhh+4 szVdFb5NNsxb7BBjr17oIRBuHz9JFP/9+5ZvRPYTFbJw/YPeRMIp8+1SR25QLG2fUZa3 bdLQu2TgOvjgkj6YU89ROlJPmrpMbYNkgyBsgSIv3VJptSEsQJj1e/e3l7B5FGkD/SQs rnilT2sufOVHyPdwvIKdmWZoem+ZvGztzaSLhPW8xMTlzM2Lg9GhRzoO5aU9tQpbeYRL jQMsZbJydlEcq5zqqCChHtkZyjLthJd7QySh0SVEP3dYm+zioQfOyBcK79z+rXQJRzMI MDaQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1749909910; x=1750514710; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=LGnmkslgEVpFmKpg7arjY6bzEFNB1S5pSIPQqnZ7kjs=; b=rx1dKgooSPb4KxY33nt1yADl78s6tCsILc8VLBkXy/Ech7ObDp/HmlIIKD2VRvCpG8 uyCNW2MPQ5SH1EsPFguk0Hu5DUng2JOz7cT14VIlZV7AoOx7hcCJde2IfT+UV/HalKWh RXbLVbpPH0IbWyr24FSsfl2lhJY8s2X+6i8n0nLErTXgNkWtuUYqWvynNhmRzP3xckdI iB+H/lwCJE3wM4p5NJfwMAyI7ekId0QmGFIcmCm4SvjwATGmF0Qn0U8YkxM5xv7Nq6s3 ncd7O6H2nksM0I2cAGi3UQTeOtAsxoUg2k2nQ5FwHQOHiH6PsWdTLUmXSdkxxMP+z9RK R5hA== X-Gm-Message-State: AOJu0Yw+VkiY02Q2eFvz5XJph9S5mWiZMl8dSvO4odcfUiuaoZv57Q39 1XXMXXKAEBecP5+1t8FMXQG/AO1KMirWbP+s8WZkzgUVqDqELmefC+sOBPXXrhhbIgk= X-Gm-Gg: ASbGnctNVj0fM2JgCRvT8fJZOkIn86rLSOfon0UZJNWbCb7q3T8ShNqSOg7s9I/9uLc MAqce7mCEQAMaILIsqa3mklY8Xo7aiyAmD14KXA3LhAMRP3PGKTs4IhupgcxJFQKut14lV+nK3b Jzdp/1eCbIYI//E+lLjducXBFyMpgxk241NllMBzaiQd4cOxq3iVzALIrqaJaW97zIGDG4ixYOW ge9rLtNdXhbwGZGnjB5pI78QThsZea0tAZUKiD3CjbgOOzQffeR2I0N+2GRjmmvS0J2djSNBhK2 ENFKgQ4ya5XjR8AsreTtMVvAdK4f6QaJ9w3jhMBNWVmpIIeQeyDOvh6o0+SyhUgL8RgN0S1wzMa ceIXDpeN5YsLIpdKBFbnBN8ykF57EHAkutfoOmA== X-Google-Smtp-Source: AGHT+IGN6UNPVIIoYhUphsXwde25/CMAV1s4NN78v5VPA7JNTDJtSUOkvAyo/mLj6oUCYBT8tb+fLA== X-Received: by 2002:a05:6000:288a:b0:3a5:27ba:47d0 with SMTP id ffacd0b85a97d-3a572e5737bmr2971118f8f.56.1749909909456; Sat, 14 Jun 2025 07:05:09 -0700 (PDT) Received: from fedorarm.. (mob-176-245-49-78.net.vodafone.it. [176.245.49.78]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-3a568a54d7fsm5363068f8f.18.2025.06.14.07.05.07 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 14 Jun 2025 07:05:08 -0700 (PDT) From: Matteo Croce To: libc-alpha@sourceware.org Cc: Matteo Croce Subject: [PATCH v3] fstat: add test and documentation for an edge case. Date: Sat, 14 Jun 2025 13:25:04 +0200 Message-ID: <20250614112504.203698-1-technoboy85@gmail.com> X-Mailer: git-send-email 2.49.0 MIME-Version: 1.0 X-Spam-Status: No, score=-11.9 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, FREEMAIL_ENVFROM_END_DIGIT, FREEMAIL_FROM, GIT_PATCH_0, RCVD_IN_DNSWL_NONE, SPF_HELO_NONE, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org X-BeenThere: libc-alpha@sourceware.org X-Mailman-Version: 2.1.30 Precedence: list List-Id: Libc-alpha mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: libc-alpha-bounces~patchwork=sourceware.org@sourceware.org From: Matteo Croce The fstatat behaviour when the target is a dangling symlink is different if flags contains AT_SYMLINK_NOFOLLOW or not. Add a test for this and document it. --- io/tst-stat.c | 16 +++++++++++++++- manual/filesys.texi | 5 +++-- 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/io/tst-stat.c b/io/tst-stat.c index 61bdbfb638..56c7bbb186 100644 --- a/io/tst-stat.c +++ b/io/tst-stat.c @@ -62,12 +62,22 @@ fstatat_check (int fd, const char *path, struct stat *st) TEST_COMPARE (fstatat (fd, path, st, 0), 0); } +static void +fstatat_link (const char *path, struct stat *st) +{ + TEST_COMPARE (fstatat (AT_FDCWD, path, st, 0), -1); + TEST_COMPARE (errno, ENOENT); + + TEST_COMPARE (fstatat (AT_FDCWD, path, st, AT_SYMLINK_NOFOLLOW), 0); +} + typedef void (*test_t)(int, const char *path, struct stat *); static int do_test (void) { char *path; + const char *linkame = "tst-fstat.linkname"; int fd = create_temp_file ("tst-fstat.", &path); TEST_VERIFY_EXIT (fd >= 0); support_write_file_string (path, "abc"); @@ -81,13 +91,13 @@ do_test (void) printf ("warning: timestamp with nanoseconds not supported\n"); struct statx stx; + struct stat st; TEST_COMPARE (statx (fd, path, 0, STATX_BASIC_STATS, &stx), 0); test_t tests[] = { stat_check, lstat_check, fstat_check, fstatat_check }; for (int i = 0; i < array_length (tests); i++) { - struct stat st; tests[i](fd, path, &st); TEST_COMPARE (stx.stx_dev_major, major (st.st_dev)); @@ -111,6 +121,10 @@ do_test (void) } } + symlink ("tst-fstat.target", linkame); + add_temp_file (linkame); + fstatat_link (linkame, &st); + return 0; } diff --git a/manual/filesys.texi b/manual/filesys.texi index d0ced84bf6..4406201dab 100644 --- a/manual/filesys.texi +++ b/manual/filesys.texi @@ -2397,8 +2397,9 @@ The descriptor @var{filedes} is not associated with a directory, and @var{filename} is a relative file name. @item ENOENT -The file named by @var{filename} does not exist, or @var{filename} is an -empty string and @var{flags} does not contain @code{AT_EMPTY_PATH}. +The file named by @var{filename} does not exist, it's a dangling symbolic link +and @var{flags} does not contain @code{AT_SYMLINK_NOFOLLOW}, or @var{filename} +is an empty string and @var{flags} does not contain @code{AT_EMPTY_PATH}. @end table When the sources are compiled with @code{_FILE_OFFSET_BITS == 64} this