From 6818485a9d2700417b0b07c4e54f6272496ac71e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20B=C3=A9rat?= Date: Wed, 8 Jan 2025 17:19:18 +0100 Subject: [PATCH] Backport test implementation to verify lstat behavior Resolves: RHEL-56539 --- glibc-RHEL-56539.patch | 146 +++++++++++++++++++++++++++++++++++++++++ glibc.spec | 2 + 2 files changed, 148 insertions(+) create mode 100644 glibc-RHEL-56539.patch diff --git a/glibc-RHEL-56539.patch b/glibc-RHEL-56539.patch new file mode 100644 index 0000000..64d5b3f --- /dev/null +++ b/glibc-RHEL-56539.patch @@ -0,0 +1,146 @@ +commit f4ae345810942db891bddf9b482c72b3a120c3b2 +Author: Florian Weimer +Date: Thu Aug 29 11:06:08 2024 +0200 + + io: Add tst-lstat-nofollow, tst-lstat-nofollow-time64 + + They verify that lstat, lstat64 do not follow symbolic links. + + Reviewed-by: DJ Delorie + +Conflicts: + io/Makefile (new test added) + +diff --git a/io/Makefile b/io/Makefile +index cc78a438a8898ae3..05e6b798d669d1b1 100644 +--- a/io/Makefile ++++ b/io/Makefile +@@ -81,7 +81,8 @@ tests := test-utime test-stat test-stat2 test-lfs tst-getcwd \ + tst-closefrom \ + tst-ftw-bz28126 \ + tst-fchmod-errors \ +- tst-fchmod-fuse ++ tst-fchmod-fuse \ ++ tst-lstat-nofollow \ + + tests-time64 := \ + tst-fcntl-time64 \ +@@ -90,6 +91,7 @@ tests-time64 := \ + tst-futimes-time64\ + tst-futimesat-time64 \ + tst-lchmod-time64 \ ++ tst-lstat-nofollow-time64 \ + tst-lutimes-time64 \ + tst-stat-time64 \ + tst-utime-time64 \ +diff --git a/io/tst-lstat-nofollow-time64.c b/io/tst-lstat-nofollow-time64.c +new file mode 100644 +index 0000000000000000..45feb3f13085ae44 +--- /dev/null ++++ b/io/tst-lstat-nofollow-time64.c +@@ -0,0 +1 @@ ++#include "tst-lstat-nofollow.c" +diff --git a/io/tst-lstat-nofollow.c b/io/tst-lstat-nofollow.c +new file mode 100644 +index 0000000000000000..5bbb557c72938a8a +--- /dev/null ++++ b/io/tst-lstat-nofollow.c +@@ -0,0 +1,98 @@ ++/* Test that lstat does not follow symbolic links. ++ Copyright (C) 2024 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#include ++#include ++#include ++#include ++#include ++#include ++ ++static void ++fuse_thread (struct support_fuse *f, void *closure) ++{ ++ struct fuse_in_header *inh; ++ while ((inh = support_fuse_next (f)) != NULL) ++ { ++ if (support_fuse_handle_mountpoint (f) ++ || (inh->nodeid == 1 && support_fuse_handle_directory (f))) ++ continue; ++ switch (inh->opcode) ++ { ++ case FUSE_LOOKUP: ++ { ++ TEST_COMPARE (inh->nodeid, 1); ++ TEST_COMPARE_STRING (support_fuse_cast (LOOKUP, inh), "symlink"); ++ struct fuse_entry_out *out = support_fuse_prepare_entry (f, 2); ++ out->attr.mode = S_IFLNK | 0777; ++ out->attr.size = strlen ("target"); ++ support_fuse_reply_prepared (f); ++ } ++ break; ++ case FUSE_GETATTR: ++ { ++ TEST_COMPARE (inh->nodeid, 2); ++ struct fuse_attr_out *out = support_fuse_prepare_attr (f); ++ out->attr.mode = S_IFLNK | 0777; ++ out->attr.size = strlen ("target"); ++ support_fuse_reply_prepared (f); ++ } ++ break; ++ case FUSE_READLINK: ++ /* The lstat operation must not attempt to look at the ++ symbolic link target. */ ++ FAIL ("attempt to obtain target of symblic link for node %llu", ++ (unsigned long long int) inh->nodeid); ++ break; ++ default: ++ FAIL ("unexpected event %s", support_fuse_opcode (inh->opcode)); ++ } ++ } ++} ++ ++static int ++do_test (void) ++{ ++ support_fuse_init (); ++ struct support_fuse *f = support_fuse_mount (fuse_thread, NULL); ++ char *symlink_path = xasprintf ("%s/symlink", support_fuse_mountpoint (f)); ++ ++ { ++ struct stat st = { 0, }; ++ TEST_COMPARE (lstat (symlink_path, &st), 0); ++ TEST_COMPARE (st.st_uid, getuid ()); ++ TEST_COMPARE (st.st_gid, getgid ()); ++ TEST_COMPARE (st.st_size, 6); ++ TEST_COMPARE (st.st_mode, S_IFLNK | 0777); ++ } ++ ++ { ++ struct stat64 st = { 0, }; ++ TEST_COMPARE (lstat64 (symlink_path, &st), 0); ++ TEST_COMPARE (st.st_uid, getuid ()); ++ TEST_COMPARE (st.st_gid, getgid ()); ++ TEST_COMPARE (st.st_size, 6); ++ TEST_COMPARE (st.st_mode, S_IFLNK | 0777); ++ } ++ ++ free (symlink_path); ++ support_fuse_unmount (f); ++ return 0; ++} ++ ++#include diff --git a/glibc.spec b/glibc.spec index acf6cfd..30b5c6a 100644 --- a/glibc.spec +++ b/glibc.spec @@ -1038,6 +1038,7 @@ Patch730: glibc-RHEL-38225-2.patch Patch731: glibc-RHEL-54250.patch Patch732: glibc-RHEL-56743.patch Patch733: glibc-RHEL-57586.patch +Patch734: glibc-RHEL-56539.patch ############################################################################## # Continued list of core "glibc" package information: @@ -3039,6 +3040,7 @@ update_gconv_modules_cache () - Backport mkdirat mode test (RHEL-56743) - Backport: cover the documentation coverage gap adding thread safety annotations for clock_gettime and clock_getres (RHEL-57586) +- Backport test implementation to verify lstat behavior (RHEL-56539) * Thu Dec 19 2024 DJ Delorie - 2.34-148 - Increase ungetc test coverage, guarantee single char pushback (RHEL-46738)