Re: [PATCH] openat2: fix trailing-slash dotlike final component

Paul Eggert <[email protected]>
Newsgroups gmane.comp.lib.gnulib.bugs
Organization UCLA Computer Science Department
Message-ID <[email protected]>
On 2026-06-16 14:47, kalfalakh wrote:
> GNU tar extracting a member "a/./b" fails with ENOENT.
> It is due to a bug in the emulation of openat2(), more
> specifically when processing dotlike components,
> resulting in openat() being called on "". Please see
> the proposed attached patch.

Thanks for reporting the problem. I think I see the cause, and installed 
the attached patch into Gnulib. Please give the patch a try. If it 
doesn't fix things for you, please let us know the platform you're 
running on. Also, it'd be nice to see a test case illustrating the 
unfixed bug, e.g., in the form of a patch to tests/test-openat2.c.
0001-openat2-fix-bug-with-trailing.patch (text/x-patch, 2.7 KB)
From 50d7bb88f547aff37e6279bdc84a7602e1dd3533 Mon Sep 17 00:00:00 2001
From: Paul Eggert <[email protected]>
Date: Wed, 17 Jun 2026 00:19:35 -0700
Subject: [PATCH] openat2: fix bug with trailing "/./"

Problem reported by Kinan Al-Falakh in:
https://lists.gnu.org/r/bug-gnulib/2026-06/msg00070.html
* lib/openat2.c (do_openat2): When opening a dotlike component at
file name end, also set the G and H indexes appropriately for ".".
This matters if the file name ends in something like "/./" so the
last component "." is not at file name end.
* tests/test-openat2.c (do_test_resolve): Test for the bug.
---
 ChangeLog            | 11 +++++++++++
 lib/openat2.c        |  3 ++-
 tests/test-openat2.c | 11 +++++++++++
 3 files changed, 24 insertions(+), 1 deletion(-)

diff --git a/ChangeLog b/ChangeLog
index ee4fcf6978..845f806fc6 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,14 @@
+2026-06-17  Paul Eggert  <[email protected]>
+
+	openat2: fix bug with trailing "/./"
+	Problem reported by Kinan Al-Falakh in:
+	https://lists.gnu.org/r/bug-gnulib/2026-06/msg00070.html
+	* lib/openat2.c (do_openat2): When opening a dotlike component at
+	file name end, also set the G and H indexes appropriately for ".".
+	This matters if the file name ends in something like "/./" so the
+	last component "." is not at file name end.
+	* tests/test-openat2.c (do_test_resolve): Test for the bug.
+
 2026-06-16  Paul Eggert  <[email protected]>
 
 	openat2: set HAVE_OPENAT2=0 if openat2 is missing
diff --git a/lib/openat2.c b/lib/openat2.c
index 2be62c921c..8c722427f7 100644
--- a/lib/openat2.c
+++ b/lib/openat2.c
@@ -320,8 +320,9 @@ do_openat2 (int *fd, char const *filename,
             {
               /* This is empty or the last component, and acts like ".".
                  Use "." regardless of whether it was "" or "." or "..".  */
-              f = sizeof ".";
+              f = g = sizeof ".";
               e[-f] = '.';
+              h = 1;
             }
 
           /* Open the current component, as either an internal directory or
diff --git a/tests/test-openat2.c b/tests/test-openat2.c
index 0085410ed9..cde9576fbd 100644
--- a/tests/test-openat2.c
+++ b/tests/test-openat2.c
@@ -514,6 +514,17 @@ do_test_resolve (void)
     ASSERT (errno == EXDEV);
     ASSERT (fd == -1);
 
+    /* Check that RESOLVE_BENEATH works with trailing "/./".  */
+    fd = openat2 (dfd,
+                  "subdir/./",
+                  (&(struct open_how)
+                   {
+                     .flags = O_RDONLY,
+                     .resolve = RESOLVE_BENEATH,
+                   }),
+                  sizeof (struct open_how));
+    ASSERT (close (fd) == 0);
+
     ASSERT (close (subdfd) == 0);
   }
 }
-- 
2.53.0
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.