Don't consider extra ".." an error in wxFileName::Normalize().

The path being normalized could have come from user and there doesn't seem to
be any point in complaining about too many ".."s in it when we can handle them
correctly instead.

So simply ignore the extra ".."s for the absolute paths and keep them
unchanged for the relative ones instead of returning an error.

See #10960.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@66218 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin 2010-11-20 23:53:28 +00:00
parent 780cccd730
commit f822acceee
2 changed files with 21 additions and 9 deletions

View File

@ -1455,15 +1455,24 @@ bool wxFileName::Normalize(int flags,
if ( dir == wxT("..") )
{
if ( m_dirs.IsEmpty() )
if ( m_dirs.empty() )
{
wxLogError(_("The path '%s' contains too many \"..\"!"),
GetFullPath().c_str());
return false;
}
// We have more ".." than directory components so far.
// Don't treat this as an error as the path could have been
// entered by user so try to handle it reasonably: if the
// path is absolute, just ignore the extra ".." because
// "/.." is the same as "/". Otherwise, i.e. for relative
// paths, keep ".." unchanged because removing it would
// modify the file a relative path refers to.
if ( !m_relative )
continue;
m_dirs.RemoveAt(m_dirs.GetCount() - 1);
continue;
}
else // Normal case, go one step up.
{
m_dirs.pop_back();
continue;
}
}
}

View File

@ -322,8 +322,11 @@ void FileNameTestCase::TestNormalize()
// test wxPATH_NORM_DOTS
{ "a/.././b/c/../../", wxPATH_NORM_DOTS, "", wxPATH_UNIX },
{ "./", wxPATH_NORM_DOTS, "", wxPATH_UNIX },
{ "b/../", wxPATH_NORM_DOTS, "", wxPATH_UNIX },
{ "", wxPATH_NORM_DOTS, "", wxPATH_UNIX },
{ "./foo", wxPATH_NORM_DOTS, "foo", wxPATH_UNIX },
{ "b/../bar", wxPATH_NORM_DOTS, "bar", wxPATH_UNIX },
{ "c/../../quux", wxPATH_NORM_DOTS, "../quux", wxPATH_UNIX },
{ "/c/../../quux", wxPATH_NORM_DOTS, "/quux", wxPATH_UNIX },
// test wxPATH_NORM_TILDE: notice that ~ is only interpreted specially
// when it is the first character in the file name