On Thu, 02 Feb 2023 12:55:23 +0800
Ziyao <[email protected]> wrote:
> Hi list,
>
> The applet rm fails to remove an empty directoy without read permission
> and
> just exits silently.
>
> For example,
> $ mkdir t && chmod 100 t
> $ rm -rf t # Print nothing and the directory is still
> there
> $ echo $?
> 1
>
> This problem does not exist in GNU coreutils.
Hi,
But Posix says:
If file is of type directory, the following steps shall be taken:
If neither the -R option nor the -r option is specified, rm shall write a
diagnostic
message to standard error, do nothing more with file, and go on to any
remaining files.
If the -f option is not specified, and either the permissions of file do
not permit writing
and the standard input is a terminal or the -i option is specified, rm shall
write
a prompt to standard error and read a line from the standard input.
If the response is not affirmative, rm shall do nothing more with the
current file and go on to any remaining files.
so my question is: does your patch remove the dir only with -rf options
or with all option combinations?
Ciao,
Tito
>
> rm invokes remove_file() to do the actual remove, which tries to open it
> first when removing a directory (libbb/remove_file.c:49). I guess it is
> for
> removing its contents because we cannot remove a nonempty directory.
> But if reading the directory is not permitted, opendir() will fail and
> cause
> rm exiting without an error message.
>
> This small patch tries to remove the directory first instead of opening
> it,
> and prints a friendly message when the opening fails instead of exiting
> silently.
>
> ----
> diff --git a/libbb/remove_file.c b/libbb/remove_file.c
> index 1505e62..7bee9f0 100644
> --- a/libbb/remove_file.c
> +++ b/libbb/remove_file.c
> @@ -45,8 +45,15 @@ int FAST_FUNC remove_file(const char *path, int
> flags)
> return 0;
> }
>
> + /*
> + * Handle empty directoires even if without read
> permission
> + */
> + if (!rmdir(path))
> + return 0;
> +
> dp = opendir(path);
> - if (dp == NULL) {
> + if (!dp) {
> + bb_perror_msg("can't remove '%s'",path);
> return -1;
> }
>
>
_______________________________________________
busybox mailing list
[email protected]
http://lists.busybox.net/mailman/listinfo/busybox