Package: coreutils
Version: 8.32-4.1
Severity: normal
Dear Maintainer,
Fun one for ya: the baseline:
-- >8 --
$ mkdir -p /tmp/psko
$ rm -vid /tmp/psko
rm: remove directory '/tmp/psko'? y
removed directory '/tmp/psko'
-- >8 --
Bug a:
-- >8 --
$ mkdir -p /tmp/psko
$ chmod -r /tmp/psko
$ rm -vid /tmp/psko; echo $?
rm: cannot remove '/tmp/psko': Directory not empty
1
-- >8 --
Absolutely 0 prompt, despite -i!
That's very fun (and a POSIX violation)!
Bug b:
-- >8 --
$ strace rm -vid /tmp/psko 2>&1 | grep -v locale
execve("/bin/rm", ["rm", "-vid", "/tmp/psko"], 0xff8fbc48 /* 24 vars */) = 0
/* ... */
arch_prctl(ARCH_SET_FS, 0xf7f9e240) = 0
mprotect(0xf7f8b000, 8192, PROT_READ) = 0
mprotect(0x40f000, 4096, PROT_READ) = 0
mprotect(0xf7fcd000, 8192, PROT_READ) = 0
munmap(0xf7f96000, 26859) = 0
brk(NULL) = 0xaa6000
brk(0xac7000) = 0xac7000
brk(0xac8000) = 0xac8000
newfstatat(3, "", {st_mode=S_IFREG|0644, st_size=3041504, ...}, AT_EMPTY_PATH)
= 0
mmap(NULL, 2097152, PROT_READ, MAP_PRIVATE, 3, 0) = 0xf7a00000
mmap(NULL, 2596864, PROT_READ, MAP_PRIVATE, 3, 0x6d000) = 0xf7786000
close(3) = 0
ioctl(0, TCGETS, {B38400 opost isig icanon echo ...}) = 0
newfstatat(AT_FDCWD, "/tmp/psko", {st_mode=S_IFDIR|0311, st_size=40, ...},
AT_SYMLINK_NOFOLLOW) = 0
openat(AT_FDCWD, "/tmp/psko",
O_RDONLY|O_NOCTTY|O_NONBLOCK|O_NOFOLLOW|O_DIRECTORY) = -1 EACCES (Permission denied)
newfstatat(3, "", {st_mode=S_IFREG|0644, st_size=2996, ...}, AT_EMPTY_PATH) = 0
read(3, "# Locale name alias data base.\n#"..., 4096) = 2996
read(3, "", 4096) = 0
close(3) = 0
write(2, "rm: ", 4rm: ) = 4
write(2, "cannot remove '/tmp/psko'", 25cannot remove '/tmp/psko') = 25
newfstatat(3, "", {st_mode=S_IFREG|0644, st_size=1433, ...}, AT_EMPTY_PATH) = 0
mmap(NULL, 1433, PROT_READ, MAP_PRIVATE, 3, 0) = 0xf7f9c000
close(3) = 0
write(2, ": Directory not empty", 21: Directory not empty) = 21
write(2, "\n", 1
) = 1
lseek(0, 0, SEEK_CUR) = -1 ESPIPE (Illegal seek)
close(0) = 0
close(1) = 0
close(2) = 0
exit_group(1) = ?
+++ exited with 1 +++
-- >8 --
Can you spot a rmdir(2) equivalent? I can't! So why does it lie and say
that it tried to remove it?
Also, the directory /isn't nonempty/! Bug c:
-- >8 --
$ rmdir -v /tmp/psko/; echo $?
rmdir: removing directory, '/tmp/psko/'
0
-- >8 --
And it's not there! Because, shockingly, there's nothing stopping you
from removing it! So why on /earth/ is rm failing to prompt, failing to
try to remove it, then lying that it had and failed with an obviously
false errno?
The same applies to just plain rm -d /tmp/psko (no -i)
(except for bug a).