From 1d75268b91d9ca60e013366edda2eae3b2de3e2f Mon Sep 17 00:00:00 2001 From: Frantisek Sumsal Date: Wed, 13 Mar 2024 10:51:02 +0100 Subject: [PATCH] test: skip the symlink part of test_touch_file() in containers Our (RHEL 8) touch_file() is not clever enough and does chmod() on a symlink, which fails with EOPNOTSUPP on newer kernels. This is not an issue on the RHEL 8 kernel, where doing chmod() on a symlink works (albeit only on tmpfs) but in GH Actions we run in a container, and with the underlying kernel doing chmod() on a symlink fails even on tmpfs: RHEL 8: ~# mount -t tmpfs tmpfs /tmp ~# (cd /tmp; ln -s symlink dangling; ln -s /etc/os-release symlink) ~# (cd /var/tmp; ln -s symlink dangling; ln -s /etc/os-release symlink) ~# gcc -o main main.c -D_GNU_SOURCE ~# ./main /tmp/dangling chmod(/proc/self/fd/3)=0 (0) ~# ./main /tmp/symlink chmod(/proc/self/fd/3)=0 (0) ~# ./main /var/tmp/dangling chmod(/proc/self/fd/3)=-1 (95) ~# ./main /var/tmp/symlink chmod(/proc/self/fd/3)=-1 (95) Newer kernel: ~# uname -r 6.7.4-200.fc39.x86_64 ~# ./main /tmp/dangling chmod(/proc/self/fd/3)=-1 (95) ~# ./main /tmp/symlink chmod(/proc/self/fd/3)=-1 (95) ~# ./main /var/tmp/dangling chmod(/proc/self/fd/3)=-1 (95) ~# ./main /var/tmp/symlink chmod(/proc/self/fd/3)=-1 (95) Backporting the necessary patches would be way too risky so late in the RHEL 8 cycle, so let's just skip the offending test when running in a container. This should work around this issue in GH Actions, but still run the test on C8S/RHEL8 machines. See: #434 RHEL-only --- src/test/test-fs-util.c | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/src/test/test-fs-util.c b/src/test/test-fs-util.c index aa32629f62..9f11141528 100644 --- a/src/test/test-fs-util.c +++ b/src/test/test-fs-util.c @@ -544,15 +544,17 @@ static void test_touch_file(void) { assert_se(timespec_load(&st.st_mtim) == test_mtime); } - a = strjoina(p, "/lnk"); - assert_se(symlink("target", a) >= 0); - assert_se(touch_file(a, false, test_mtime, test_uid, test_gid, 0640) >= 0); - assert_se(lstat(a, &st) >= 0); - assert_se(st.st_uid == test_uid); - assert_se(st.st_gid == test_gid); - assert_se(S_ISLNK(st.st_mode)); - assert_se((st.st_mode & 0777) == 0640); - assert_se(timespec_load(&st.st_mtim) == test_mtime); + if (detect_container() <= 0) { + a = strjoina(p, "/lnk"); + assert_se(symlink("target", a) >= 0); + assert_se(touch_file(a, false, test_mtime, test_uid, test_gid, 0640) >= 0); + assert_se(lstat(a, &st) >= 0); + assert_se(st.st_uid == test_uid); + assert_se(st.st_gid == test_gid); + assert_se(S_ISLNK(st.st_mode)); + assert_se((st.st_mode & 0777) == 0640); + assert_se(timespec_load(&st.st_mtim) == test_mtime); + } } static void test_unlinkat_deallocate(void) {