From c9417abb96d18e54689f7b8902807c8d796b50f5 Mon Sep 17 00:00:00 2001 From: Jim Meyering Date: Sat, 3 Feb 2007 00:23:57 +0000 Subject: [PATCH] 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 . --- ChangeLog | 8 ++++++++ lib/getcwd.c | 9 +++++++-- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/ChangeLog b/ChangeLog index 394e68e887..7b35b21030 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +2007-02-03 Jim Meyering + + 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 . + 2007-02-02 Bruno Haible * 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)) -- 2.30.2