[Top][All Lists]

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

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

From: Pádraig Brady
Subject: bug#39364: [PATCH] rmdir: fix clobbered errno
Date: Mon, 3 Feb 2020 13:26:27 +0000
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:73.0) Gecko/20100101 Thunderbird/73.0

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;
                 /* 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));
@@ -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))
/* 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:

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.

Attachment: rmdir-ignore-perm.patch
Description: Text Data

reply via email to

[Prev in Thread] Current Thread [Next in Thread]