[prev in list] [next in list] [prev in thread] [next in thread] 

List:       busybox
Subject:    Re: [PATCH] Fix failure to remove an empty directory without read permission
From:       Ziyao <ziyao () disroot ! org>
Date:       2023-02-03 3:21:16
Message-ID: d2cd988e4948a9f5d51d58015eb28067 () disroot ! org
[Download RAW message or body]

On 2023-02-02 15:14, tito wrote:
> On Thu, 02 Feb 2023 12:55:23 +0800
> 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

Sorry, my last mail was sent to Tito only.

The patch only removes the directory with -r specified. However, it does
not give an additional prompt when -i is specified.

Maybe the following patch is better.

---
diff --git a/libbb/remove_file.c b/libbb/remove_file.c
index 1505e62..7b60ab3 100644
--- a/libbb/remove_file.c
+++ b/libbb/remove_file.c
@@ -46,8 +46,8 @@ int FAST_FUNC remove_file(const char *path, int flags)
                 }

                 dp = opendir(path);
-               if (dp == NULL) {
-                       return -1;
+               if (!dp) {
+                       goto tryRemoveDir;
                 }

                 while ((d = readdir(dp)) != NULL) {
@@ -62,7 +62,8 @@ int FAST_FUNC remove_file(const char *path, int flags)
                 }
                 closedir(dp);

-               if (flags & FILEUTILS_INTERACTIVE) {
+tryRemoveDir:
+               if ((flags & FILEUTILS_INTERACTIVE)) {
                         fprintf(stderr, "%s: remove directory '%s'? ",
                                         applet_name, path);
                         if (!bb_ask_y_confirmation())

-- 
Ziyao
_______________________________________________
busybox mailing list
busybox@busybox.net
http://lists.busybox.net/mailman/listinfo/busybox
[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic