Hi,

Kind reminder. Diff re-attached at the end and on MARC:

https://marc.info/?l=openbsd-tech&m=166219807307308&w=2


On Sat, Sep 03, 2022 at 09:44:46AM +0000, Mikolaj Kucharski wrote:
> Hi,
> 
> I wanted to rm -rP some files on my disk and didn't notice that
> they lacked write permission for the user who executed rm(1)
> command.
> 
> $ echo foo > file-mode-444.txt
> $ chmod 0444 file-mode-444.txt
> $ ls -ln file-mode-444.txt
> -r--r--r--  1 5001  5001  4 Sep  3 09:36 file-mode-444.txt
> 
> $ rm -vfP file-mode-444.txt
> rm: file-mode-444.txt: Permission denied
> file-mode-444.txt
> $ echo $?
> 1
> 
> $ ls -l file-mode-444.txt
> ls: file-mode-444.txt: No such file or directory
> 
> I was not expecting this behaviour. My expectation was the file would
> NOT be removed. Hence the diff below:
> 
> 
> Index: rm.c
> ===================================================================
> RCS file: /cvs/src/bin/rm/rm.c,v
> retrieving revision 1.44
> diff -u -p -u -r1.44 rm.c
> --- rm.c      16 Aug 2022 13:52:41 -0000      1.44
> +++ rm.c      3 Sep 2022 09:37:44 -0000
> @@ -215,8 +215,11 @@ rm_tree(char **argv)
>               case FTS_F:
>               case FTS_NSOK:
>                       if (Pflag)
> -                             rm_overwrite(p->fts_accpath, p->fts_info ==
> -                                 FTS_NSOK ? NULL : p->fts_statp);
> +                             if (!rm_overwrite(p->fts_accpath, p->fts_info ==
> +                                 FTS_NSOK ? NULL : p->fts_statp)) {
> +                                     eval = 1;
> +                                     continue;
> +                             }
>                       /* FALLTHROUGH */
>               default:
>                       if (!unlink(p->fts_accpath)) {
> @@ -267,7 +270,10 @@ rm_file(char **argv)
>                       rval = rmdir(f);
>               else {
>                       if (Pflag)
> -                             rm_overwrite(f, &sb);
> +                             if (!rm_overwrite(f, &sb)) {
> +                                     eval = 1;
> +                                     continue;
> +                             }
>                       rval = unlink(f);
>               }
>               if (rval && (!fflag || errno != ENOENT)) {
> 
> 
> What do you guys think?
> 
> 
> $ ./obj/rm -vfP file-mode-444.txt
> rm: file-mode-444.txt: Permission denied
> $ echo $?
> 1
> 
> $ ls -ln file-mode-444.txt
> -r--r--r--  1 5001  5001  4 Sep  3 09:36 file-mode-444.txt
> 
> I did use `rm -fP` in the invocation, and reading the rm(1) manual page:
> 
>    -f      Attempt to remove the files without prompting for confirmation,
>            regardless of the file's permissions.  If the file does not
>            exist, do not display a diagnostic message or modify the exit
>            status to reflect an error.  The -f option overrides any previous
>            -i options.
> 
> but not sure then what exactly should happen when -P and -f and no write
> permission.
> 


Index: rm.c
===================================================================
RCS file: /cvs/src/bin/rm/rm.c,v
retrieving revision 1.44
diff -u -p -u -r1.44 rm.c
--- rm.c        16 Aug 2022 13:52:41 -0000      1.44
+++ rm.c        14 Oct 2022 21:41:22 -0000
@@ -215,8 +215,11 @@ rm_tree(char **argv)
                case FTS_F:
                case FTS_NSOK:
                        if (Pflag)
-                               rm_overwrite(p->fts_accpath, p->fts_info ==
-                                   FTS_NSOK ? NULL : p->fts_statp);
+                               if (!rm_overwrite(p->fts_accpath, p->fts_info ==
+                                   FTS_NSOK ? NULL : p->fts_statp)) {
+                                       eval = 1;
+                                       continue;
+                               }
                        /* FALLTHROUGH */
                default:
                        if (!unlink(p->fts_accpath)) {
@@ -267,7 +270,10 @@ rm_file(char **argv)
                        rval = rmdir(f);
                else {
                        if (Pflag)
-                               rm_overwrite(f, &sb);
+                               if (!rm_overwrite(f, &sb)) {
+                                       eval = 1;
+                                       continue;
+                               }
                        rval = unlink(f);
                }
                if (rval && (!fflag || errno != ENOENT)) {


-- 
Regards,
 Mikolaj

Reply via email to