Mikolaj Kucharski <[email protected]> wrote:
> Hi,
>
> Kind reminder. Diff re-attached at the end and on MARC:
>
> https://marc.info/?l=openbsd-tech&m=166219807307308&w=2
I don't understand what your complaint is, because:
-P Attempt to overwrite regular writable files before deleting them.
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Well, the attempt fails.
Then rm continues to do what rm does, which specifically is to not leave
files not removed.
> 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
>