mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-01-27 19:34:50 +08:00
prefix.c (update_path): Don't strip single .' path components unless stripping a later
..' component.
* prefix.c (update_path): Don't strip single `.' path components unless stripping a later `..' component. Exit loop as soon as a valid path is found. From-SVN: r55814
This commit is contained in:
parent
3e75a2f99d
commit
d434817799
@ -1,3 +1,9 @@
|
||||
2002-07-28 Alan Modra <amodra@bigpond.net.au>
|
||||
|
||||
* prefix.c (update_path): Don't strip single `.' path components
|
||||
unless stripping a later `..' component. Exit loop as soon as
|
||||
a valid path is found.
|
||||
|
||||
2002-07-27 Roger Sayle <roger@eyesopen.com>
|
||||
|
||||
* builtins.def [DEF_GCC_BUILTIN]: Require an explicit ATTRS
|
||||
|
56
gcc/prefix.c
56
gcc/prefix.c
@ -284,49 +284,39 @@ update_path (path, key)
|
||||
p = strchr (p, '.');
|
||||
if (p == NULL)
|
||||
break;
|
||||
/* Get rid of a leading `./' and replace `/./' with `/', when
|
||||
such components are followed with another `.'. */
|
||||
if (IS_DIR_SEPARATOR (p[1])
|
||||
&& (p == result || IS_DIR_SEPARATOR (p[-1])))
|
||||
{
|
||||
src = p + 2;
|
||||
/* Be careful about .//foo */
|
||||
while (IS_DIR_SEPARATOR (*src))
|
||||
++src;
|
||||
if (*src == '.')
|
||||
{
|
||||
dest = p;
|
||||
while ((*dest++ = *src++) != 0)
|
||||
;
|
||||
}
|
||||
else
|
||||
++p;
|
||||
}
|
||||
/* Look for `/../' */
|
||||
else if (p[1] == '.'
|
||||
&& IS_DIR_SEPARATOR (p[2])
|
||||
&& (p != result && IS_DIR_SEPARATOR (p[-1])))
|
||||
if (p[1] == '.'
|
||||
&& IS_DIR_SEPARATOR (p[2])
|
||||
&& (p != result && IS_DIR_SEPARATOR (p[-1])))
|
||||
{
|
||||
*p = 0;
|
||||
if (!ALWAYS_STRIP_DOTDOT && access (result, X_OK) == 0)
|
||||
{
|
||||
*p = '.';
|
||||
p += 3;
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* We can't access the dir, so we won't be able to
|
||||
access dir/.. either. Strip out dir/.. We know dir
|
||||
isn't `.' because we've rid ourselves of `.' path
|
||||
components above. */
|
||||
dest = p - 1;
|
||||
while (dest != result && IS_DIR_SEPARATOR (*dest))
|
||||
--dest;
|
||||
while (dest != result && !IS_DIR_SEPARATOR (dest[-1]))
|
||||
--dest;
|
||||
/* Don't strip leading `/'. */
|
||||
while (IS_DIR_SEPARATOR (*dest))
|
||||
++dest;
|
||||
access dir/.. either. Strip out `dir/../'. If `dir'
|
||||
turns out to be `.', strip one more path component. */
|
||||
dest = p;
|
||||
do
|
||||
{
|
||||
--dest;
|
||||
while (dest != result && IS_DIR_SEPARATOR (*dest))
|
||||
--dest;
|
||||
while (dest != result && !IS_DIR_SEPARATOR (dest[-1]))
|
||||
--dest;
|
||||
}
|
||||
while (dest != result && *dest == '.');
|
||||
/* If we have something like `./..' or `/..', don't
|
||||
strip anything more. */
|
||||
if (*dest == '.' || IS_DIR_SEPARATOR (*dest))
|
||||
{
|
||||
*p = '.';
|
||||
break;
|
||||
}
|
||||
src = p + 3;
|
||||
while (IS_DIR_SEPARATOR (*src))
|
||||
++src;
|
||||
|
Loading…
Reference in New Issue
Block a user