[patch] libstdc++/67173 Fix filesystem::canonical for Solaris 10.

Jonathan Wakely jwakely@redhat.com
Wed Sep 16 22:17:00 GMT 2015


On 16/09/15 16:04 -0600, Martin Sebor wrote:
>>Tested powerpc64le-linux, x86_64-dragonfly4.1 and x86_64-netbsd5.1,
>>do you see any reason not to commit this for now?
>
>I see only a couple of potential problems: a missing test for
>PATH_MAX in the unlikely event it's not defined (or is obscenely

In the current patch _GLIBCXX_USE_REALPATH won't be defined unless:

       #elif _XOPEN_VERSION >= 700 || defined(PATH_MAX)

so if it's defined and _XOPEN_VERSION < 700 then we know PATH_MAX must
be defined (otherwise _GLIBCXX_USE_REALPATH wouldn't be).

>large), and a missing check to avoid infinite loops due to symlinks.

I thought about keeping track of where I'd been while expanding
symlinks, but then realised this will do it:

  if (!exists(pa, ec))
    {
      fail(ENOENT);
      return result;
    }
  // else we can assume no unresolvable symlink loops

If there's a symlink loop then exists(pa) will fail with ELOOP, and we
won't try to resolve it by hand.

And then after each step in the while(!cmpts.empty()) loop I also have
a check for !exists(result, ec), which should even handle the case
where the filesystem changes after the initial exists() call so that a
loop is introduced while we're canonicalising the path.


>>Any improvements such as hardcoding checks for specific versions of
>>Solaris or the BSDs are QoI, and this is only an experimental TS, so I
>>don't want to spend the rest of stage 1 working on one function :-)
>
>Makes sense.
>
>>My main obstacle to writing good tests right now is having some way to
>>create and destroy files safely in the tests. It's hard to test
>>functions like is_symlink() without first creating a symlink in a
>>known location, and also removing it again cleanly so the next
>>testsuite run doesn't fail if the file is already present.
>>
>>One option would be to have libstdc++-v3/testsuite/Makefile create a
>>new sub-directory as a sandbox for filesystem tests, removing it if it
>>already exists. Then the tests can put anything they like in that new
>>dir without fear of trashing the user's files elsewhere on the FS!
>
>I don't know how you feel about Tcl but writing a filesystem.exp
>and adding a new "dg-fs" API would let each test can set up the
>directory structure it needs.

My Tcl is very weak, but if that's the right approach then I can try
that.

Thanks again!



More information about the Libstdc++ mailing list