浏览代码

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.

Brad King 19 年之前
父节点
当前提交
df70e3de66
共有 1 个文件被更改,包括 15 次插入23 次删除
  1. 15 23
      Source/cmAddSubDirectoryCommand.cxx

+ 15 - 23
Source/cmAddSubDirectoryCommand.cxx

@@ -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