]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
stat-util: ignore hidden_or_backup_file when checking if dir is empty
authorLuca Boccassi <bluca@debian.org>
Sat, 30 Apr 2022 16:47:56 +0000 (17:47 +0100)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Sun, 1 May 2022 02:41:43 +0000 (11:41 +0900)
Commit https://github.com/systemd/systemd/commit/a068aceafbf
changed dir_is_emtpy_at to use FOREACH_DIRENT_IN_BUFFER instead of
FOREACH_DIRENT, but used dot_or_dotdot which just checks if the name
is literally '.' or '..' which is not enough, previous behaviour was
to ignore all hidden files, so restore that and add a test case.

Fixes https://github.com/systemd/systemd/issues/23220

src/basic/stat-util.c
src/test/test-stat-util.c

index c7293db6989b04de9d41ebd5675ea6daf8c1396d..a7812714aa90c3bdb8a29d15e00e8aedc2917dc9 100644 (file)
@@ -106,7 +106,7 @@ int dir_is_empty_at(int dir_fd, const char *path) {
         msan_unpoison(&buffer, n);
 
         FOREACH_DIRENT_IN_BUFFER(de, &buffer.de, n)
-                if (!dot_or_dot_dot(de->d_name))
+                if (!hidden_or_backup_file(de->d_name))
                         return 0;
 
         return 1;
index c5afde02d0c642df504699fb75ee03eb4d5a205a..a8fdbb7c18300d69f1055a82baff99937696d19a 100644 (file)
@@ -151,7 +151,7 @@ TEST(fd_is_ns) {
 
 TEST(dir_is_empty) {
         _cleanup_(rm_rf_physical_and_freep) char *empty_dir = NULL;
-        _cleanup_free_ char *j = NULL, *jj = NULL;
+        _cleanup_free_ char *j = NULL, *jj = NULL, *jjj = NULL;
 
         assert_se(dir_is_empty_at(AT_FDCWD, "/proc") == 0);
         assert_se(dir_is_empty_at(AT_FDCWD, "/icertainlydontexistdoi") == -ENOENT);
@@ -169,11 +169,17 @@ TEST(dir_is_empty) {
         assert_se(jj);
         assert_se(touch(jj) >= 0);
 
+        jjj = path_join(empty_dir, ".qqq");
+        assert_se(jjj);
+        assert_se(touch(jjj) >= 0);
+
         assert_se(dir_is_empty_at(AT_FDCWD, empty_dir) == 0);
         assert_se(unlink(j) >= 0);
         assert_se(dir_is_empty_at(AT_FDCWD, empty_dir) == 0);
         assert_se(unlink(jj) >= 0);
         assert_se(dir_is_empty_at(AT_FDCWD, empty_dir) > 0);
+        assert_se(unlink(jjj) >= 0);
+        assert_se(dir_is_empty_at(AT_FDCWD, empty_dir) > 0);
 }
 
 static int intro(void) {