Subject: Re: bug#39364: [PATCH] rmdir: fix clobbered errno

From: Pádraig Brady <[email-masked]>
Date: Fri, 31 Jan 2020 17:51:22 +0000

On 31/01/2020 01:46, Matthew Pfeiffer wrote:
> 'rmdir --ignore-fail-on-non-empty' would not report errors on non-empty
> directories that fail for a different reason.
> ---
>   src/rmdir.c | 10 ++++++----
>   1 file changed, 6 insertions(+), 4 deletions(-)
> 
> diff --git a/src/rmdir.c b/src/rmdir.c
> index c9f417957..7b253ab0d 100644
> --- a/src/rmdir.c
> +++ b/src/rmdir.c
> @@ -133,18 +133,19 @@ remove_parents (char *dir)
>           prog_fprintf (stdout, _("removing directory, %s"), quoteaf (dir));
>   
>         ok = (rmdir (dir) == 0);
> +      int rmdir_errno = errno;
>   
>         if (!ok)
>           {
>             /* Stop quietly if --ignore-fail-on-non-empty. */
> -          if (ignorable_failure (errno, dir))
> +          if (ignorable_failure (rmdir_errno, dir))
>               {
>                 ok = true;
>               }
>             else
>               {
>                 /* Barring race conditions, DIR is expected to be a directory.  */
> -              error (0, errno, _("failed to remove directory %s"),
> +              error (0, rmdir_errno, _("failed to remove directory %s"),
>                        quoteaf (dir));
>               }
>             break;
> @@ -233,12 +234,13 @@ main (int argc, char **argv)
>   
>         if (rmdir (dir) != 0)
>           {
> -          if (ignorable_failure (errno, dir))
> +          int rmdir_errno = errno;
> +          if (ignorable_failure (rmdir_errno, dir))
>               continue;
>   
>             /* Here, the diagnostic is less precise, since we have no idea
>                whether DIR is a directory.  */
> -          error (0, errno, _("failed to remove %s"), quoteaf (dir));
> +          error (0, rmdir_errno, _("failed to remove %s"), quoteaf (dir));
>             ok = false;
>           }
>         else if (remove_empty_parents)
> 

This looks like a regression introduced in v6.10-21-ged5c4e7
I.E. is_empty_dir() is globbering errno, and thus
a non specific and non terminating warning is output,
rather than a specific error, and exit.

thanks,
Pádraig