On 02/07/2012 12:33 AM, Eric Blake wrote: > https://lists.gnu.org/archive/html/bug-gnulib/2012-02/msg00038.html > detailed a couple of bugs in gnulib's canonicalize that were visible > through coreutils' readlink, but only on systems where // is distinct > from /. This particular test assumes that POSIX will be fixed to > require canonicalization of a symlink containing just slashes will > behave as if slashes separating the symlink from the rest of the > name are elided (see http://austingroupbugs.net/view.php?id=541), > as that is the only useful (and current) behavior on Cygwin. That is, > > ln -s / root > ls root/dev > > must list the contents of /dev, not //dev. > > * tests/misc/readlink-root: New test. > * tests/Makefile.am (TESTS): Run it. > --- > > Partway through my promise to test my recent patches to realpath, > by starting with missing readlink coverage. > > I have not yet had a chance to run coreutils under valgrind or > Coverity after configuring with gl_cv_double_slash_root=yes. > > tests/Makefile.am | 1 + > tests/misc/readlink-root | 92 > ++++++++++++++++++++++++++++++++++++++++++++++ > 2 files changed, 93 insertions(+), 0 deletions(-) > create mode 100644 tests/misc/readlink-root > > diff --git a/tests/Makefile.am b/tests/Makefile.am > index a94aaa2..39b17ab 100644 > --- a/tests/Makefile.am > +++ b/tests/Makefile.am > @@ -220,6 +220,7 @@ TESTS = \ > misc/printf-surprise \ > misc/pwd-long \ > misc/readlink-fp-loop \ > + misc/readlink-root \ > misc/realpath \ > misc/runcon-no-reorder \ > misc/sha1sum \ > diff --git a/tests/misc/readlink-root b/tests/misc/readlink-root > new file mode 100644 > index 0000000..3c30cec > --- /dev/null > +++ b/tests/misc/readlink-root > @@ -0,0 +1,92 @@ > +#!/bin/sh > +# tests for canonicalize-existing mode (readlink -e) on /. > + > +# Copyright (C) 2012 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_ readlink > + > +stat_single=$(stat -c %d:%i /) || framework_failure_ > +stat_double=$(stat -c %d:%i //) || framework_failure_ > +double_slash=/ > +if test x"$stat_single" = x"stat_double"; then > + double_slash=// > +fi > + > +test -d /dev || framework_failure_
Maybe just skip_ above? > + readlink -e / || fail=1 > + readlink -e // || fail=1 > + readlink -e /// || fail=1 > + readlink -e /.//.. || fail=1 > + readlink -e //.//.. || fail=1 > + readlink -e ///.//.. || fail=1 > + readlink -e one || fail=1 > + readlink -e two || fail=1 > + readlink -e three || fail=1 > + readlink -e one-dots || fail=1 > + readlink -e two-dots || fail=1 > + readlink -e three-dots || fail=1 > + readlink -e one-dev || fail=1 > + # We know /dev exists, but cannot assume //dev exists > + readlink -f two-dev || fail=1 > + readlink -e three-dev || fail=1 > + readlink -e one/dev || fail=1 > + readlink -f two/dev || fail=1 > + readlink -e three/dev || fail=1 > + readlink -e one-dots/dev || fail=1 > + readlink -f two-dots/dev || fail=1 > + readlink -e three-dots/dev || fail=1 cool. thanks, Pádraig.
