stat-util: fix dir_is_empty() with hidden/backup files
This is a follow-up forf470cb6d13which in turn is a follow-up fora068aceafb. The latter started to honour hidden files when deciding whether a directory is empty. The former reverted to the old behaviour to fix issue #23220. It introduced a bug though: when a directory contains a larger number of hidden entries the getdents64() buffer will not suffice to read them, since we just allocate three entries for it (which is definitely enough if we just ignore the . + .. entries, but not ig we ignore more). I think it's a bit confusing that dir_is_empty() can return true even if rmdir() on the dir would return ENOTEMPTY. Hence, let's rework the function to make it optional whether hidden files are ignored or not. After all, I looking at the users of this function I am pretty sure in more cases we want to honour hidden files.
This commit is contained in:
@@ -922,7 +922,7 @@ static int condition_test_directory_not_empty(Condition *c, char **env) {
|
||||
assert(c->parameter);
|
||||
assert(c->type == CONDITION_DIRECTORY_NOT_EMPTY);
|
||||
|
||||
r = dir_is_empty(c->parameter);
|
||||
r = dir_is_empty(c->parameter, /* ignore_hidden_or_backup= */ true);
|
||||
return r <= 0 && !IN_SET(r, -ENOENT, -ENOTDIR);
|
||||
}
|
||||
|
||||
|
||||
+1
-1
@@ -905,7 +905,7 @@ static int fd_copy_directory(
|
||||
|
||||
exists = false;
|
||||
if (copy_flags & COPY_MERGE_EMPTY) {
|
||||
r = dir_is_empty_at(dt, to);
|
||||
r = dir_is_empty_at(dt, to, /* ignore_hidden_or_backup= */ false);
|
||||
if (r < 0 && r != -ENOENT)
|
||||
return r;
|
||||
else if (r == 1)
|
||||
|
||||
@@ -1552,7 +1552,7 @@ int dissected_image_mount(
|
||||
if (r < 0) {
|
||||
if (r != -ENOENT)
|
||||
return r;
|
||||
} else if (dir_is_empty(p) > 0) {
|
||||
} else if (dir_is_empty(p, /* ignore_hidden_or_backup= */ false) > 0) {
|
||||
/* It exists and is an empty directory. Let's mount the ESP there. */
|
||||
r = mount_partition(m->partitions + PARTITION_ESP, where, "/boot", uid_shift, uid_range, flags);
|
||||
if (r < 0)
|
||||
|
||||
@@ -1466,7 +1466,7 @@ Tpm2Support tpm2_support(void) {
|
||||
* got the host sysfs mounted. Since devices are generally not virtualized for containers,
|
||||
* let's assume containers never have a TPM, at least for now. */
|
||||
|
||||
r = dir_is_empty("/sys/class/tpmrm");
|
||||
r = dir_is_empty("/sys/class/tpmrm", /* ignore_hidden_or_backup= */ false);
|
||||
if (r < 0) {
|
||||
if (r != -ENOENT)
|
||||
log_debug_errno(r, "Unable to test whether /sys/class/tpmrm/ exists and is populated, assuming it is not: %m");
|
||||
|
||||
Reference in New Issue
Block a user