Subject: bug#10305: coreutils-8.14, "rm -r" fails with EBADF

From: "Joachim Schmitz" <[email-masked]>
Date: Fri, 20 Jul 2012 15:39:45 +0200

> From: Jim Meyering [mailto:[email-masked]]
> Sent: Friday, July 20, 2012 2:35 PM
> To: Joachim Schmitz
> Cc: 'Paul Eggert'; [email-masked]; [email-masked]; 'Eric
Blake';
> 'Schmitz, Joachim'; [email-masked]
> Subject: Re: bug#10305: coreutils-8.14, "rm -r" fails with EBADF
> 
> Joachim Schmitz wrote:
> ...
> > I've disable a bit of apparently dead code in src/remove.c
> ...
> > /usr/local/bin/diff -EBbu ./src/remove.c.orig ./src/remove.c
> > --- ./src/remove.c.orig	2012-05-01 15:55:08 -0500
> > +++ ./src/remove.c	2012-06-18 10:06:04 -0500
> > @@ -88,6 +88,7 @@
> >    return st;
> >  }
> >
> > +#ifndef __TANDEM /* not used anywhere */
> >  /* Return true if *ST has been statted.  */
> >  static inline bool
> >  cache_statted (struct stat *st)
> > @@ -101,6 +102,7 @@
> >  {
> >    return (0 <= st->st_size);
> >  }
> > +#endif /* !__TANDEM */
> >
> >  /* Return 1 if FILE is an unwritable non-symlink,
> >     0 if it is writable or some other type of file,
> > @@ -311,6 +313,7 @@
> >    return RM_OK;
> >  }
> >
> > +#ifndef __TANDEM
> >  /* Return true if FILENAME is a directory (and not a symlink to a
directory).
> >     Otherwise, including the case in which lstat fails, return false.
> >     *ST is FILENAME's tstatus.
> > @@ -340,6 +343,7 @@
> >    errno = saved_errno;
> >    return is_non_dir;
> >  }
> > +#endif /* !__TANDEM */
> >
> >  /* When a function like unlink, rmdir, or fstatat fails with an errno
> >     value of ERRNUM, return true if the specified file system object
> 
> Thanks.  I've simply removed those unused functions
> and wrote a commit log entry for you.
> 
> I'll wait for an ACK from you before pushing this,
> since you're listed as the author:
> 
> 
> From 033b669f50e3ef4de7ba5598c0b036069bd56778 Mon Sep 17 00:00:00
> 2001
> From: Joachim Schmitz <[email-masked]>
> Date: Fri, 20 Jul 2012 14:32:53 +0200
> Subject: [PATCH] maint: rm: remove unused static-inlined functions
> 
> * src/remove.c (cache_statted, is_dir_lstat): Remove unused
> static-inlined functions.
> Copyright-paperwork-exempt: Yes
> ---
>  src/remove.c | 22 ----------------------
>  1 file changed, 22 deletions(-)
> 
> diff --git a/src/remove.c b/src/remove.c
> index f44a982..42f2063 100644
> --- a/src/remove.c
> +++ b/src/remove.c
> @@ -88,13 +88,6 @@ cache_stat_init (struct stat *st)
>    return st;
>  }
> 
> -/* Return true if *ST has been statted.  */
> -static inline bool
> -cache_statted (struct stat *st)
> -{
> -  return (st->st_size != -1);
> -}
> -
>  /* Return true if *ST has been statted successfully.  */
>  static inline bool
>  cache_stat_ok (struct stat *st)
> @@ -311,21 +304,6 @@ prompt (FTS const *fts, FTSENT const *ent, bool
is_dir,
>    return RM_OK;
>  }
> 
> -/* Return true if FILENAME is a directory (and not a symlink to a
directory).
> -   Otherwise, including the case in which lstat fails, return false.
> -   *ST is FILENAME's tstatus.
> -   Do not modify errno.  */
> -static inline bool
> -is_dir_lstat (int fd_cwd, char const *filename, struct stat *st)
> -{
> -  int saved_errno = errno;
> -  bool is_dir =
> -    (cache_fstatat (fd_cwd, filename, st, AT_SYMLINK_NOFOLLOW) == 0
> -     && S_ISDIR (st->st_mode));
> -  errno = saved_errno;
> -  return is_dir;
> -}
> -
>  /* Return true if FILENAME is a non-directory.
>     Otherwise, including the case in which lstat fails, return false.
>     *ST is FILENAME's tstatus.
> --
> 1.7.11.2.249.g31c7954

I just saw that my patch removed 2 functions more than your's, mine also
removes cache_stat_ok() and is_nondir_lstat().
Intention? Used where?

Bye, Jojo