Don't follow symlinks in wxFileName::Rmdir(wxPATH_RMDIR_RECURSIVE).

Following symlinks, possibly leading outside of the directory being removed,
is at best surprising and at worst dangerous, so don't do it and just mimic
the behaviour of "rm -rf", i.e. remove everything inside this directory,
including the symlinks themselves, but don't follow them.

Closes #14649.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@72742 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin
2012-10-23 23:58:17 +00:00
parent 0f57172b93
commit 25db2c25bc
2 changed files with 40 additions and 6 deletions

View File

@@ -1415,6 +1415,21 @@ bool wxFileName::Rmdir(const wxString& dir, int flags)
if ( flags != 0 ) // wxPATH_RMDIR_FULL or wxPATH_RMDIR_RECURSIVE
#endif // !__WINDOWS__
{
#ifndef __WINDOWS__
if ( flags & wxPATH_RMDIR_RECURSIVE )
{
// When deleting the tree recursively, we are supposed to delete
// this directory itself even when it is a symlink -- but without
// following it. Do it here as wxRmdir() would simply follow if
// called for a symlink.
if ( wxFileName::Exists(dir, wxFILE_EXISTS_SYMLINK |
wxFILE_EXISTS_NO_FOLLOW) )
{
return wxRemoveFile(dir);
}
}
#endif // !__WINDOWS__
wxString path(dir);
if ( path.Last() != wxFILE_SEP_PATH )
path += wxFILE_SEP_PATH;
@@ -1426,8 +1441,11 @@ bool wxFileName::Rmdir(const wxString& dir, int flags)
wxString filename;
// first delete all subdirectories
bool cont = d.GetFirst(&filename, "", wxDIR_DIRS | wxDIR_HIDDEN);
// First delete all subdirectories: notice that we don't follow
// symbolic links, potentially leading outside this directory, to avoid
// unpleasant surprises.
bool cont = d.GetFirst(&filename, wxString(),
wxDIR_DIRS | wxDIR_HIDDEN | wxDIR_NO_FOLLOW);
while ( cont )
{
wxFileName::Rmdir(path + filename, flags);
@@ -1437,8 +1455,11 @@ bool wxFileName::Rmdir(const wxString& dir, int flags)
#ifndef __WINDOWS__
if ( flags & wxPATH_RMDIR_RECURSIVE )
{
// delete all files too
cont = d.GetFirst(&filename, "", wxDIR_FILES | wxDIR_HIDDEN);
// Delete all files too and, for the same reasons as above, don't
// follow symlinks which could refer to the files outside of this
// directory and just delete the symlinks themselves.
cont = d.GetFirst(&filename, wxString(),
wxDIR_FILES | wxDIR_HIDDEN | wxDIR_NO_FOLLOW);
while ( cont )
{
::wxRemoveFile(path + filename);