From patchwork Tue Jun 24 16:40:13 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Matteo Croce X-Patchwork-Id: 115014 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 8465938560AF for ; Tue, 24 Jun 2025 17:45:08 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 8465938560AF 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=TqivOPQY X-Original-To: libc-alpha@sourceware.org Delivered-To: libc-alpha@sourceware.org Received: from mail-ej1-x629.google.com (mail-ej1-x629.google.com [IPv6:2a00:1450:4864:20::629]) by sourceware.org (Postfix) with ESMTPS id 78409385B83B for ; Tue, 24 Jun 2025 17:44:29 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 78409385B83B 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 78409385B83B Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=2a00:1450:4864:20::629 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1750787069; cv=none; b=aGSl1NPYattIggWEAiiPaWUJ5ayHjSpgAtAcsl5FPm9fzOhFW4fkmzUR5qVPY0ChMrNsY6MayCDZNBIfrrWsLu/EML8nKUSFNT4r0xEos/KxjVrG6M2rWQhNqPAWg4Vy4Xil3VuOMUqZdCgcNnQjmqjaljfkw7qrYUAchkQa6yE= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1750787069; c=relaxed/simple; bh=KZYuuoTIxvWJd1bvGpPwHWedfECVUiIc3UlGOUAU0TQ=; h=DKIM-Signature:From:To:Subject:Date:Message-ID:MIME-Version; b=iAX1aTrW4WXniblbFxro5sdo0LpwZuxi3a3GbIJnOZpXGwGZR0eERzX9xIwvVnOIF1KqbBmcImNdtqOwExmTRQTy2YTkw58nRiO6/gJYP8WMd7zN70WbkZoBCWnqNWx68qyPJkyyo01YdHRltKrbuKQWLP7wvWSpScL7Wu4N18I= ARC-Authentication-Results: i=1; server2.sourceware.org DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 78409385B83B Received: by mail-ej1-x629.google.com with SMTP id a640c23a62f3a-ad883afdf0cso140286266b.0 for ; Tue, 24 Jun 2025 10:44:29 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1750787068; x=1751391868; 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=ovlE7vgwCCXGKxCYpMkHJid3c4gHXPFqpOQ8WRXfZYw=; b=TqivOPQYyW7G+gOJQRrJwoQJWb5oWM8LA2TgRTabw9hr8WF+eXpmRYsFWQM8R9j/ea fvS/7tRfVt9cLvuJdtx6xOM9GO53JR+LZ80b6GUwCu9265f1YE9KfEimurH9GDWgVymy JGXjmq/xk3/HMXREJIUd+7PV/o7pKoAjiYbLLo0V7ONGXP9ZEoYvcvtRH9drBbOmZ6X8 ZAuGSQghZ6o3Hl57L2GvvwaO5wfqya1pfR+zUGc0MhODV3kgN09V5eCE0Yc2wqKJnrD5 FLqSHqNtj5+K0D+6qxiBI24sofzgjLye8DcSWu20Nro5AphDq7EK+DC4X5DXubyEDf+J 5j5g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1750787068; x=1751391868; 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=ovlE7vgwCCXGKxCYpMkHJid3c4gHXPFqpOQ8WRXfZYw=; b=fJXUgtlAiysq1TlkDjyfMv+3yABAe2FHIQhfWBNAf0felaOJH9ZGUML+5oAlDR+5oq mR89qWAbYvnhvW5CUN5dwriKzgCGap90+0Ff0XqxtVvvpFG4hn2NjQBvQCpeBXIB2HJ0 IJ2CEV3MUwDuOE4yO7BCn2gPw01KkoSaLKdmGyf6EtGp8G3SLMnFdifhAEqUi6EzKMuk aB+ovKDLT8wqZOgbJ0UVhP022O14o66AoLXeI2oAZN+mdM0xazx7XweqcjjNkFj23q9H 0pH8Vh84lDXIZIEJ2u/vUGfEbpGIt6b1+uD5leCgJu2qKm4rFujYabMkLCcyDdptn0th r4jA== X-Gm-Message-State: AOJu0YzCoxtkeCKQsEjOgKVvzQMaUmer4TOSMWnZJM5brYDhA4ddKnTx 17WGtm813vz2SKappbFJ8NZHp0iv+Razbspi0Qml+AzMyFl0JGiY80aLrOVo88k0 X-Gm-Gg: ASbGncsz2kCRD6OdGWadBCbBXWezyThvTjO7EBNVdkjtNjLsLElLh65DOo0uOP9tJqE NoZfn/vZKJK2VjFYeeoCaJ42Zoi/b/YBd0b4BBd79++ulfBEo3iImhtwc301e4eZCgjcNg53Lpp nsrJxYH6oTAYJKnW9UKNZ6Qe91QP1LyJkpHJTgaReiamSBBq5XOVUzTzsMDZpABm2prPHIaw/my dBPj4P1P3ybnR8QoPw4CTXeijDK4SF2u8eeE/m7XriUJUDW4Wgre+9LW0onY3+2eIw4jMx+uWns MTPloSyonV19iG6DvgFbXPR2i8dyrmQ8TJr4Irnwz3zy8AN3ViNzJ0bayeqRwKxnNGo7G5DDXZW 0IMOFrLvn1lrJuTHR1/jsBuxMGCGSxRq5mT+W1pZjzc+HPw== X-Google-Smtp-Source: AGHT+IGc2LvKvTuZvBAK/WusE8CpIL2MPIqY0wWyhIKYl9klAmqDJQ8+f8GMMf3WOhpUfk6LGPIc9Q== X-Received: by 2002:a17:907:3cd6:b0:ae0:5fbf:7de0 with SMTP id a640c23a62f3a-ae0be9da16fmr19111366b.36.1750787067808; Tue, 24 Jun 2025 10:44:27 -0700 (PDT) Received: from fedorarm.. (net-37-182-2-165.cust.vodafonedsl.it. [37.182.2.165]) by smtp.gmail.com with ESMTPSA id a640c23a62f3a-ae054080a61sm921166266b.106.2025.06.24.10.44.26 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 24 Jun 2025 10:44:27 -0700 (PDT) From: Matteo Croce To: libc-alpha@sourceware.org Cc: Adhemerval Zanella Netto , Matteo Croce Subject: [PATCH v5] fstat: add test and documentation for an edge case. Date: Tue, 24 Jun 2025 18:40:13 +0200 Message-ID: <20250624164013.459729-1-technoboy85@gmail.com> X-Mailer: git-send-email 2.49.0 MIME-Version: 1.0 X-Spam-Status: No, score=-12.1 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 | 17 ++++++++++++++++- manual/filesys.texi | 5 +++-- 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/io/tst-stat.c b/io/tst-stat.c index 61bdbfb638..aeea435ca1 100644 --- a/io/tst-stat.c +++ b/io/tst-stat.c @@ -62,12 +62,23 @@ 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); + TEST_COMPARE (!S_ISLNK(st->st_mode), 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 +92,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 +122,10 @@ do_test (void) } } + TEST_COMPARE (symlink ("tst-fstat.target", linkame), 0); + 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