From: Jim Meyering <jim@meyering.net>
Date: Sat, 3 Feb 2007 00:23:57 +0000 (+0000)
Subject: Make pwd and readlink work also when run with an unreadable parent dir
X-Git-Tag: cvs-readonly~1143
X-Git-Url: https://gitweb.git.savannah.gnu.org/gitweb/?a=commitdiff_plain;h=c9417abb96d18e54689f7b8902807c8d796b50f5;p=gnulib.git

Make pwd and readlink work also when run with an unreadable parent dir
on systems with openat support.
* lib/getcwd.c (__getcwd) [HAVE_PARTLY_WORKING_GETCWD]: Use the system
provided getcwd function, even when we have openat support.
Reported by Dmitry V. Levin in <http://bugzilla.redhat.com/227168>.
---

diff --git a/ChangeLog b/ChangeLog
index 394e68e887..7b35b21030 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+2007-02-03  Jim Meyering  <jim@meyering.net>
+
+	Make pwd and readlink work also when run with an unreadable parent dir
+	on systems with openat support.
+	* lib/getcwd.c (__getcwd) [HAVE_PARTLY_WORKING_GETCWD]: Use the system
+	provided getcwd function, even when we have openat support.
+	Reported by Dmitry V. Levin in <http://bugzilla.redhat.com/227168>.
+
 2007-02-02  Bruno Haible  <bruno@clisp.org>
 
 	* lib/string_.h (memmem, mempcpy, memrchr, stpcpy, stpncpy, strchrnul,
diff --git a/lib/getcwd.c b/lib/getcwd.c
index 978c538373..0ac5cdce33 100644
--- a/lib/getcwd.c
+++ b/lib/getcwd.c
@@ -140,13 +140,18 @@ __getcwd (char *buf, size_t size)
   size_t allocated = size;
   size_t used;
 
-#if HAVE_PARTLY_WORKING_GETCWD && !defined AT_FDCWD
+#if HAVE_PARTLY_WORKING_GETCWD
   /* The system getcwd works, except it sometimes fails when it
      shouldn't, setting errno to ERANGE, ENAMETOOLONG, or ENOENT.  If
      AT_FDCWD is not defined, the algorithm below is O(N**2) and this
      is much slower than the system getcwd (at least on GNU/Linux).
      So trust the system getcwd's results unless they look
-     suspicious.  */
+     suspicious.
+
+     Use the system getcwd even if we have openat support, since the
+     system getcwd works even when a parent is unreadable, while the
+     openat-based approach does not.  */
+
 # undef getcwd
   dir = getcwd (buf, size);
   if (dir || (errno != ERANGE && !is_ENAMETOOLONG (errno) && errno != ENOENT))