Subject: bug#8570: glibc getcwd does not handle long file names properly?

From: Jim Meyering <[email-masked]>
Date: Thu, 28 Apr 2011 14:21:50 +0200

Bruno Haible wrote:

> Hi,
>
> building coreutils 8.12 on a Linux 2.6.25.20, glibc 2.8 machine, "make check"
> shows these lines:
>
>   ./misc/pwd-unreadable-parent: skipping test: can't use buggy system getcwd
>   SKIP: misc/pwd-unreadable-parent
>
> REPLACE_GETCWD is indeed 1, because the test from m4/getcwd-path-max.m4 failed:
>
> configure:26992: checking whether getcwd handles long file names properly
> configure:27154: gcc -m32 -march=i586 -std=gnu99 -o conftest -g -O2
> -Wall -I/arch/x86-linux/gnu/include -m32 conftest.c >&5
> configure:27154: $? = 0
> configure:27154: ./conftest
> configure:27154: $? = 12
> configure: program exited with status 12
>
> But is that known and expected that glibc 2.8 getcwd() does not handle
> long file names??? And yes, I do have /proc mounted and readable by everyone.

Yes, the /proc based trick is limited by the length of symlink values.
Hence, glibc's getcwd does indeed fail, but only in the pathological case
in which the name is too long *and* a parent directory is unreadable.

However, we cannot use the above reasoning as justification
for skipping this test, since the directory name used here is
most probably not very long, so I am inclined to remove this
test, since it is testing for behavior that user-space tools
cannot work around.  Either the system-provided getcwd
works in spite of an unreadable parent (in which pwd does, too),
or it doesn't, and neither does pwd.

>From 9a377856d02e3f7c2f8ab17d6ceb98edc4468eb9 Mon Sep 17 00:00:00 2001
From: Jim Meyering <[email-masked]>
Date: Thu, 28 Apr 2011 14:18:50 +0200
Subject: [PATCH] tests: remove useless test: misc/pwd-unreadable-parent

* tests/Makefile.am (TESTS): Remove misc/pwd-unreadable-parent.
This test was misleading and useless (was always skipped).
Inspired by a report from Bruno Haible: http://debbugs.gnu.org/8570
* tests/misc/pwd-unreadable-parent: Remove file.
---
 tests/Makefile.am                |    1 -
 tests/misc/pwd-unreadable-parent |   41 --------------------------------------
 2 files changed, 0 insertions(+), 42 deletions(-)
 delete mode 100755 tests/misc/pwd-unreadable-parent

diff --git a/tests/Makefile.am b/tests/Makefile.am
index 2f4a561..1a80f84 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -160,7 +160,6 @@ TESTS =						\
   pr/pr-tests					\
   misc/df-P					\
   misc/pwd-option				\
-  misc/pwd-unreadable-parent			\
   misc/chcon-fail				\
   misc/cut					\
   misc/wc					\
diff --git a/tests/misc/pwd-unreadable-parent b/tests/misc/pwd-unreadable-parent
deleted file mode 100755
index 725d41c..0000000
--- a/tests/misc/pwd-unreadable-parent
+++ /dev/null
@@ -1,41 +0,0 @@
-#!/bin/sh
-# Ensure that pwd and "readlink -e ." work even when a parent directory
-# is unreadable.  Perform this test only on systems with a usable getcwd
-# function that has this capability.
-
-# Copyright (C) 2007-2011 Free Software Foundation, Inc.
-
-# This program is free software: you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU General Public License for more details.
-
-# You should have received a copy of the GNU General Public License
-# along with this program.  If not, see <http://www.gnu.org/licenses/>.
-
-. "${srcdir=.}/init.sh"; path_prepend_ ../src
-print_ver_ pwd readlink
-
-test $host_os != linux-gnu &&
-  skip_test_ 'vendor getcwd may be inadequate'
-
-# Linux ia64 has the gl_FUNC_GETCWD_ABORT_BUG, so we can't use
-# the system getcwd.
-test $REPLACE_GETCWD = 1 &&
-  skip_test_ "can't use buggy system getcwd"
-
-mkdir -p a/b || framework_failure
-cd a/b || framework_failure
-chmod a=x .. || framework_failure
-
-env -- pwd > exp || fail=1
-readlink -ev . > out || fail=1
-
-compare out exp || fail=1
-
-Exit $fail
--
1.7.5.421.g9d34e