BUG: Always check whether a subdirectory is below the top of the source before computing the binary tree automatically. Even when the source is a relative path it may contain ../ which would allow it to be outside the source tree.

This commit is contained in:
Brad King 2006-06-05 14:38:16 -04:00
parent 7d5bc02c9d
commit df70e3de66
1 changed files with 15 additions and 23 deletions

View File

@ -74,6 +74,7 @@ bool cmAddSubDirectoryCommand::InitialPass
// at this point srcPath has the full path to the source directory
// now we need to compute the binPath if it was not provided
srcPath = cmSystemTools::CollapseFullPath(srcPath.c_str());
// if the argument was provided then use it
if (binArg.size())
@ -87,34 +88,25 @@ bool cmAddSubDirectoryCommand::InitialPass
// otherwise compute the binPath from the srcPath
else
{
// if the srcArg was relative then we just do the same for the binPath
if (relativeSource)
{
binPath = std::string(this->Makefile->GetCurrentOutputDirectory()) +
"/" + srcArg;
}
// otherwise we try to remove the CurrentDirectory from the srcPath and
// we try to remove the CurrentDirectory from the srcPath and
// replace it with the CurrentOutputDirectory. This may not really work
// because the source dir they provided may not be "in" the source
// tree. This is an error if this happens.
else
// try replacing the home dir with the home output dir
binPath = srcPath;
if(!cmSystemTools::FindLastString(binPath.c_str(),
this->Makefile->GetHomeDirectory()))
{
// try replacing the home dir with the home output dir
binPath = srcPath;
if (!cmSystemTools::FindLastString(binPath.c_str(),
this->Makefile->GetHomeDirectory()))
{
this->SetError("A full source directory was specified that is not "
"in the source tree but no binary directory was "
"specified. If you specify an out of tree source "
"directory then you must provide the binary "
"directory as well.");
return false;
}
cmSystemTools::ReplaceString(binPath,
this->Makefile->GetHomeDirectory(),
this->Makefile->GetHomeOutputDirectory());
this->SetError("A full source directory was specified that is not "
"in the source tree but no binary directory was "
"specified. If you specify an out of tree source "
"directory then you must provide the binary "
"directory as well.");
return false;
}
cmSystemTools::ReplaceString(binPath,
this->Makefile->GetHomeDirectory(),
this->Makefile->GetHomeOutputDirectory());
}
// now we have all the arguments