From: Lennart Poettering Date: Tue, 12 Mar 2024 09:45:24 +0000 (+0100) Subject: stat-util: make sure inode_type_to_string() handles anonymous inodes in a reasonable way X-Git-Tag: v256-rc1~558^2 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=refs%2Fpull%2F31731%2Fhead;p=thirdparty%2Fsystemd.git stat-util: make sure inode_type_to_string() handles anonymous inodes in a reasonable way --- diff --git a/src/basic/stat-util.c b/src/basic/stat-util.c index 6d09f867667..ab45eda0edc 100644 --- a/src/basic/stat-util.c +++ b/src/basic/stat-util.c @@ -535,6 +535,8 @@ const char* inode_type_to_string(mode_t m) { return "sock"; } + /* Note anonmyous inodes in the kernel will have a zero type. Hence fstat() of an eventfd() will + * return an .st_mode where we'll return NULL here! */ return NULL; } diff --git a/src/test/test-stat-util.c b/src/test/test-stat-util.c index 272cd4c0d34..df37dcb528d 100644 --- a/src/test/test-stat-util.c +++ b/src/test/test-stat-util.c @@ -3,6 +3,7 @@ #include #include #include +#include #include #include "alloc-util.h" @@ -195,6 +196,21 @@ TEST(inode_type_from_string) { assert_se(inode_type_from_string(inode_type_to_string(*m)) == *m); } +TEST(anonymous_inode) { + _cleanup_close_ int fd = -EBADF; + + fd = eventfd(0, EFD_CLOEXEC); + assert_se(fd >= 0); + + /* Verify that we handle anonymous inodes correctly, i.e. those which have no file type */ + + struct stat st; + assert_se(fstat(fd, &st) >= 0); + assert_se((st.st_mode & S_IFMT) == 0); + + assert_se(!inode_type_to_string(st.st_mode)); +} + TEST(fd_verify_linked) { _cleanup_(rm_rf_physical_and_freep) char *t = NULL; _cleanup_close_ int tfd = -EBADF, fd = -EBADF;