GNU bug report logs - #39364
[PATCH] rmdir: fix clobbered errno

Previous Next

Package: coreutils;

Reported by: Matthew Pfeiffer <spferical <at> gmail.com>

Date: Fri, 31 Jan 2020 02:21:02 UTC

Severity: normal

Tags: patch

Done: Pádraig Brady <P <at> draigBrady.com>

Bug is archived. No further changes may be made.

Full log


View this message in rfc822 format

From: Pádraig Brady <P <at> draigBrady.com>
To: Matthew Pfeiffer <spferical <at> gmail.com>, 39364 <at> debbugs.gnu.org
Subject: bug#39364: [PATCH] rmdir: fix clobbered errno
Date: Mon, 3 Feb 2020 13:26:27 +0000
[Message part 1 (text/plain, inline)]
On 31/01/2020 17:51, Pádraig Brady wrote:
> 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

For reference, this was originally discussed at:
https://lists.gnu.org/archive/html/bug-coreutils/2008-01/msg00283.html

> 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.

Actually I think the key issue is not errno handling,
but a logic error fixed with:

@@ -102,7 +102,7 @@ ignorable_failure (int error_number, char const *dir)
   return (ignore_fail_on_non_empty
           && (errno_rmdir_non_empty (error_number)
               || (errno_may_be_empty (error_number)
-                  && is_empty_dir (AT_FDCWD, dir))));
+                  && ! is_empty_dir (AT_FDCWD, dir))));


Attached is a full patch to address these issues.
cheers,
Pádraig
[rmdir-ignore-perm.patch (text/x-patch, attachment)]

This bug report was last modified 5 years and 99 days ago.

Previous Next


GNU bug tracking system
Copyright (C) 1999 Darren O. Benham, 1997,2003 nCipher Corporation Ltd, 1994-97 Ian Jackson.