Просмотр исходного кода

GenEx: Validate target and property names.

They must be non-empty, and match a restrictive regexp.
Stephen Kelly 13 лет назад
Родитель
Сommit
8b3b88abd8
26 измененных файлов с 171 добавлено и 1 удалено
  1. 46 1
      Source/cmGeneratorExpressionEvaluator.cxx
  2. 1 0
      Tests/RunCMake/TargetPropertyGeneratorExpressions/BadInvalidName1-result.txt
  3. 6 0
      Tests/RunCMake/TargetPropertyGeneratorExpressions/BadInvalidName1-stderr.txt
  4. 7 0
      Tests/RunCMake/TargetPropertyGeneratorExpressions/BadInvalidName1.cmake
  5. 1 0
      Tests/RunCMake/TargetPropertyGeneratorExpressions/BadInvalidName2-result.txt
  6. 6 0
      Tests/RunCMake/TargetPropertyGeneratorExpressions/BadInvalidName2-stderr.txt
  7. 7 0
      Tests/RunCMake/TargetPropertyGeneratorExpressions/BadInvalidName2.cmake
  8. 1 0
      Tests/RunCMake/TargetPropertyGeneratorExpressions/BadInvalidName3-result.txt
  9. 6 0
      Tests/RunCMake/TargetPropertyGeneratorExpressions/BadInvalidName3-stderr.txt
  10. 7 0
      Tests/RunCMake/TargetPropertyGeneratorExpressions/BadInvalidName3.cmake
  11. 1 0
      Tests/RunCMake/TargetPropertyGeneratorExpressions/BadInvalidName4-result.txt
  12. 6 0
      Tests/RunCMake/TargetPropertyGeneratorExpressions/BadInvalidName4-stderr.txt
  13. 9 0
      Tests/RunCMake/TargetPropertyGeneratorExpressions/BadInvalidName4.cmake
  14. 1 0
      Tests/RunCMake/TargetPropertyGeneratorExpressions/BadInvalidName5-result.txt
  15. 7 0
      Tests/RunCMake/TargetPropertyGeneratorExpressions/BadInvalidName5-stderr.txt
  16. 7 0
      Tests/RunCMake/TargetPropertyGeneratorExpressions/BadInvalidName5.cmake
  17. 1 0
      Tests/RunCMake/TargetPropertyGeneratorExpressions/BadInvalidName6-result.txt
  18. 6 0
      Tests/RunCMake/TargetPropertyGeneratorExpressions/BadInvalidName6-stderr.txt
  19. 7 0
      Tests/RunCMake/TargetPropertyGeneratorExpressions/BadInvalidName6.cmake
  20. 1 0
      Tests/RunCMake/TargetPropertyGeneratorExpressions/BadInvalidName7-result.txt
  21. 6 0
      Tests/RunCMake/TargetPropertyGeneratorExpressions/BadInvalidName7-stderr.txt
  22. 9 0
      Tests/RunCMake/TargetPropertyGeneratorExpressions/BadInvalidName7.cmake
  23. 1 0
      Tests/RunCMake/TargetPropertyGeneratorExpressions/BadInvalidName8-result.txt
  24. 6 0
      Tests/RunCMake/TargetPropertyGeneratorExpressions/BadInvalidName8-stderr.txt
  25. 7 0
      Tests/RunCMake/TargetPropertyGeneratorExpressions/BadInvalidName8.cmake
  26. 8 0
      Tests/RunCMake/TargetPropertyGeneratorExpressions/RunCMakeTest.cmake

+ 46 - 1
Source/cmGeneratorExpressionEvaluator.cxx

@@ -274,11 +274,42 @@ static const struct TargetPropertyNode : public cmGeneratorExpressionNode
           "$<TARGET_PROPERTY:...> expression requires one or two parameters");
       return std::string();
       }
+    cmsys::RegularExpression nameValidator;
+    nameValidator.compile("^[A-Za-z0-9_.-]+$");
+
     cmGeneratorTarget* target = context->Target;
     std::string propertyName = *parameters.begin();
     if (parameters.size() == 2)
       {
+      if (parameters.begin()->empty() && parameters.at(1).empty())
+        {
+        reportError(context, content->GetOriginalExpression(),
+            "$<TARGET_PROPERTY:tgt,prop> expression requires a non-empty "
+            "target name and property name.");
+        return std::string();
+        }
+      if (parameters.begin()->empty())
+        {
+        reportError(context, content->GetOriginalExpression(),
+            "$<TARGET_PROPERTY:tgt,prop> expression requires a non-empty "
+            "target name.");
+        return std::string();
+        }
+
       std::string targetName = parameters.front();
+      propertyName = parameters.at(1);
+      if (!nameValidator.find(targetName.c_str()))
+        {
+        if (!nameValidator.find(propertyName.c_str()))
+          {
+          ::reportError(context, content->GetOriginalExpression(),
+                        "Target name and property name not supported.");
+          return std::string();
+          }
+        ::reportError(context, content->GetOriginalExpression(),
+                      "Target name not supported.");
+        return std::string();
+        }
       target = context->Makefile->FindGeneratorTargetToUse(
                                                 targetName.c_str());
 
@@ -291,7 +322,21 @@ static const struct TargetPropertyNode : public cmGeneratorExpressionNode
         reportError(context, content->GetOriginalExpression(), e.str());
         return std::string();
         }
-      propertyName = parameters.at(1);
+      }
+
+    if (propertyName.empty())
+      {
+      reportError(context, content->GetOriginalExpression(),
+          "$<TARGET_PROPERTY:...> expression requires a non-empty property "
+          "name.");
+      return std::string();
+      }
+
+    if (!nameValidator.find(propertyName.c_str()))
+      {
+      ::reportError(context, content->GetOriginalExpression(),
+                    "Property name not supported.");
+      return std::string();
       }
 
     cmGeneratorExpressionDAGChecker dagChecker(context->Backtrace,

+ 1 - 0
Tests/RunCMake/TargetPropertyGeneratorExpressions/BadInvalidName1-result.txt

@@ -0,0 +1 @@
+1

+ 6 - 0
Tests/RunCMake/TargetPropertyGeneratorExpressions/BadInvalidName1-stderr.txt

@@ -0,0 +1,6 @@
+CMake Error:
+  Error evaluating generator expression:
+
+    \$<TARGET_PROPERTY:Invali/dTarget,INCLUDE_DIRECTORIES>
+
+  Target name not supported.

+ 7 - 0
Tests/RunCMake/TargetPropertyGeneratorExpressions/BadInvalidName1.cmake

@@ -0,0 +1,7 @@
+
+file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/main.cpp"
+           "int main(int, char **) { return 0; }\n")
+
+add_executable(TargetPropertyGeneratorExpressions
+           "${CMAKE_CURRENT_BINARY_DIR}/main.cpp")
+include_directories("$<TARGET_PROPERTY:Invali/dTarget,INCLUDE_DIRECTORIES>")

+ 1 - 0
Tests/RunCMake/TargetPropertyGeneratorExpressions/BadInvalidName2-result.txt

@@ -0,0 +1 @@
+1

+ 6 - 0
Tests/RunCMake/TargetPropertyGeneratorExpressions/BadInvalidName2-stderr.txt

@@ -0,0 +1,6 @@
+CMake Error:
+  Error evaluating generator expression:
+
+    \$<TARGET_PROPERTY:Invali/dTarget,Invali/dProperty>
+
+  Target name and property name not supported.$

+ 7 - 0
Tests/RunCMake/TargetPropertyGeneratorExpressions/BadInvalidName2.cmake

@@ -0,0 +1,7 @@
+
+file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/main.cpp"
+           "int main(int, char **) { return 0; }\n")
+
+add_executable(TargetPropertyGeneratorExpressions
+           "${CMAKE_CURRENT_BINARY_DIR}/main.cpp")
+include_directories("$<TARGET_PROPERTY:Invali/dTarget,Invali/dProperty>")

+ 1 - 0
Tests/RunCMake/TargetPropertyGeneratorExpressions/BadInvalidName3-result.txt

@@ -0,0 +1 @@
+1

+ 6 - 0
Tests/RunCMake/TargetPropertyGeneratorExpressions/BadInvalidName3-stderr.txt

@@ -0,0 +1,6 @@
+CMake Error:
+  Error evaluating generator expression:
+
+    \$<TARGET_PROPERTY:Invali/dProperty>
+
+  Property name not supported.$

+ 7 - 0
Tests/RunCMake/TargetPropertyGeneratorExpressions/BadInvalidName3.cmake

@@ -0,0 +1,7 @@
+
+file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/main.cpp"
+           "int main(int, char **) { return 0; }\n")
+
+add_executable(TargetPropertyGeneratorExpressions
+           "${CMAKE_CURRENT_BINARY_DIR}/main.cpp")
+include_directories("$<TARGET_PROPERTY:Invali/dProperty>")

+ 1 - 0
Tests/RunCMake/TargetPropertyGeneratorExpressions/BadInvalidName4-result.txt

@@ -0,0 +1 @@
+1

+ 6 - 0
Tests/RunCMake/TargetPropertyGeneratorExpressions/BadInvalidName4-stderr.txt

@@ -0,0 +1,6 @@
+CMake Error:
+  Error evaluating generator expression:
+
+    \$<TARGET_PROPERTY:foo,Invali/dProperty>
+
+  Property name not supported.$

+ 9 - 0
Tests/RunCMake/TargetPropertyGeneratorExpressions/BadInvalidName4.cmake

@@ -0,0 +1,9 @@
+
+file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/main.cpp"
+           "int main(int, char **) { return 0; }\n")
+
+add_executable(foo "${CMAKE_CURRENT_BINARY_DIR}/main.cpp")
+
+add_executable(TargetPropertyGeneratorExpressions
+           "${CMAKE_CURRENT_BINARY_DIR}/main.cpp")
+include_directories("$<TARGET_PROPERTY:foo,Invali/dProperty>")

+ 1 - 0
Tests/RunCMake/TargetPropertyGeneratorExpressions/BadInvalidName5-result.txt

@@ -0,0 +1 @@
+1

+ 7 - 0
Tests/RunCMake/TargetPropertyGeneratorExpressions/BadInvalidName5-stderr.txt

@@ -0,0 +1,7 @@
+CMake Error:
+  Error evaluating generator expression:
+
+    \$<TARGET_PROPERTY:,>
+
+  \$<TARGET_PROPERTY:tgt,prop> expression requires a non-empty target name and
+  property name.

+ 7 - 0
Tests/RunCMake/TargetPropertyGeneratorExpressions/BadInvalidName5.cmake

@@ -0,0 +1,7 @@
+
+file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/main.cpp"
+           "int main(int, char **) { return 0; }\n")
+
+add_executable(TargetPropertyGeneratorExpressions
+           "${CMAKE_CURRENT_BINARY_DIR}/main.cpp")
+include_directories("$<TARGET_PROPERTY:,>")

+ 1 - 0
Tests/RunCMake/TargetPropertyGeneratorExpressions/BadInvalidName6-result.txt

@@ -0,0 +1 @@
+1

+ 6 - 0
Tests/RunCMake/TargetPropertyGeneratorExpressions/BadInvalidName6-stderr.txt

@@ -0,0 +1,6 @@
+CMake Error:
+  Error evaluating generator expression:
+
+    \$<TARGET_PROPERTY:,ValidProperty>
+
+  \$<TARGET_PROPERTY:tgt,prop> expression requires a non-empty target name.

+ 7 - 0
Tests/RunCMake/TargetPropertyGeneratorExpressions/BadInvalidName6.cmake

@@ -0,0 +1,7 @@
+
+file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/main.cpp"
+           "int main(int, char **) { return 0; }\n")
+
+add_executable(TargetPropertyGeneratorExpressions
+           "${CMAKE_CURRENT_BINARY_DIR}/main.cpp")
+include_directories("$<TARGET_PROPERTY:,ValidProperty>")

+ 1 - 0
Tests/RunCMake/TargetPropertyGeneratorExpressions/BadInvalidName7-result.txt

@@ -0,0 +1 @@
+1

+ 6 - 0
Tests/RunCMake/TargetPropertyGeneratorExpressions/BadInvalidName7-stderr.txt

@@ -0,0 +1,6 @@
+CMake Error:
+  Error evaluating generator expression:
+
+    \$<TARGET_PROPERTY:foo,>
+
+  \$<TARGET_PROPERTY:...> expression requires a non-empty property name.

+ 9 - 0
Tests/RunCMake/TargetPropertyGeneratorExpressions/BadInvalidName7.cmake

@@ -0,0 +1,9 @@
+
+file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/main.cpp"
+           "int main(int, char **) { return 0; }\n")
+
+add_executable(foo "${CMAKE_CURRENT_BINARY_DIR}/main.cpp")
+
+add_executable(TargetPropertyGeneratorExpressions
+           "${CMAKE_CURRENT_BINARY_DIR}/main.cpp")
+include_directories("$<TARGET_PROPERTY:foo,>")

+ 1 - 0
Tests/RunCMake/TargetPropertyGeneratorExpressions/BadInvalidName8-result.txt

@@ -0,0 +1 @@
+1

+ 6 - 0
Tests/RunCMake/TargetPropertyGeneratorExpressions/BadInvalidName8-stderr.txt

@@ -0,0 +1,6 @@
+CMake Error:
+  Error evaluating generator expression:
+
+    \$<TARGET_PROPERTY:>
+
+  \$<TARGET_PROPERTY:...> expression requires a non-empty property name.

+ 7 - 0
Tests/RunCMake/TargetPropertyGeneratorExpressions/BadInvalidName8.cmake

@@ -0,0 +1,7 @@
+
+file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/main.cpp"
+           "int main(int, char **) { return 0; }\n")
+
+add_executable(TargetPropertyGeneratorExpressions
+           "${CMAKE_CURRENT_BINARY_DIR}/main.cpp")
+include_directories("$<TARGET_PROPERTY:>")

+ 8 - 0
Tests/RunCMake/TargetPropertyGeneratorExpressions/RunCMakeTest.cmake

@@ -7,3 +7,11 @@ run_cmake(BadSelfReference4)
 run_cmake(BadSelfReference5)
 run_cmake(BadSelfReference6)
 run_cmake(BadNonTarget)
+run_cmake(BadInvalidName1)
+run_cmake(BadInvalidName2)
+run_cmake(BadInvalidName3)
+run_cmake(BadInvalidName4)
+run_cmake(BadInvalidName5)
+run_cmake(BadInvalidName6)
+run_cmake(BadInvalidName7)
+run_cmake(BadInvalidName8)