From c7d84b21c636a559b1f1a87735ce12d21f4a9dcd Mon Sep 17 00:00:00 2001 From: Brad King Date: Tue, 29 Apr 2008 15:34:49 -0400 Subject: BUG: Do not escape shell operators when generating command lines. - See bug#6868. - Update CustomCommand test to check. --- Source/cmLocalGenerator.cxx | 23 ++++++++++++++++++++++ Tests/CustomCommand/CMakeLists.txt | 16 +++++++++++++-- .../GeneratorInExtraDir/CMakeLists.txt | 2 ++ Tests/CustomCommand/gen_redirect_in.c | 5 +++++ Tests/CustomCommand/generator.cxx | 6 +++++- Tests/CustomCommand/tcat.cxx | 11 +++++++++++ 6 files changed, 60 insertions(+), 3 deletions(-) create mode 100644 Tests/CustomCommand/gen_redirect_in.c create mode 100644 Tests/CustomCommand/tcat.cxx diff --git a/Source/cmLocalGenerator.cxx b/Source/cmLocalGenerator.cxx index 88f5e80..9c183fc 100644 --- a/Source/cmLocalGenerator.cxx +++ b/Source/cmLocalGenerator.cxx @@ -2545,9 +2545,32 @@ std::string cmLocalGenerator::EscapeForShellOldStyle(const char* str) } //---------------------------------------------------------------------------- +static bool cmLocalGeneratorIsShellOperator(const char* str) +{ + if(strcmp(str, "<") == 0 || + strcmp(str, ">") == 0 || + strcmp(str, "<<") == 0 || + strcmp(str, ">>") == 0 || + strcmp(str, "|") == 0 || + strcmp(str, "&>") == 0 || + strcmp(str, "2>&1") == 0 || + strcmp(str, "1>&2") == 0) + { + return true; + } + return false; +} + +//---------------------------------------------------------------------------- std::string cmLocalGenerator::EscapeForShell(const char* str, bool makeVars, bool forEcho) { + // Do not escape shell operators. + if(cmLocalGeneratorIsShellOperator(str)) + { + return str; + } + // Compute the flags for the target shell environment. int flags = 0; if(this->WindowsVSIDE) diff --git a/Tests/CustomCommand/CMakeLists.txt b/Tests/CustomCommand/CMakeLists.txt index 29c06cd..4660e5d 100644 --- a/Tests/CustomCommand/CMakeLists.txt +++ b/Tests/CustomCommand/CMakeLists.txt @@ -150,6 +150,7 @@ ADD_EXECUTABLE(CustomCommand ${PROJECT_BINARY_DIR}/wrapped_help.c ${PROJECT_BINARY_DIR}/generated.c ${PROJECT_BINARY_DIR}/not_included.h + gen_redirect.c # default location for custom commands is in build tree ) # Add the rule to create generated.c at build time. This is placed @@ -191,6 +192,17 @@ ADD_CUSTOM_COMMAND(TARGET CustomCommandUsingTargetTest POST_BUILD ADD_SUBDIRECTORY(GeneratorInExtraDir) +############################################################################## +# Test shell operators in custom commands. + +ADD_EXECUTABLE(tcat tcat.cxx) + +ADD_CUSTOM_COMMAND(OUTPUT gen_redirect.c + DEPENDS tcat gen_redirect_in.c + COMMAND tcat < ${CMAKE_CURRENT_SOURCE_DIR}/gen_redirect_in.c > gen_redirect.c + COMMAND ${CMAKE_COMMAND} -E echo "#endif" >> gen_redirect.c + VERBATIM + ) ############################################################################## # Test non-trivial command line arguments in custom commands. @@ -303,8 +315,8 @@ SET(CHECK_ARGS "one|pipe w s" "#two-pounds# w s" "one#pound w s" - ~ ` ! @ \# $ % ^ & _ - + = | : "\;" \" ' , . ? "(" ")" { } [] -# < > << >> &> 2>&1 1>&2 + ~ ` ! @ \# $ % ^ & _ - + = : "\;" \" ' , . ? "(" ")" { } [] +# | < > << >> &> 2>&1 1>&2 # \\ # Need to test last to avoid ; escape in list. # # Make tools need help when this is the last argument. ) diff --git a/Tests/CustomCommand/GeneratorInExtraDir/CMakeLists.txt b/Tests/CustomCommand/GeneratorInExtraDir/CMakeLists.txt index e838e7b..195a477 100644 --- a/Tests/CustomCommand/GeneratorInExtraDir/CMakeLists.txt +++ b/Tests/CustomCommand/GeneratorInExtraDir/CMakeLists.txt @@ -1,3 +1,5 @@ +ADD_DEFINITIONS(-DGENERATOR_EXTERN) + # add the executable which will be used for generating files ADD_EXECUTABLE(generator_extern ../generator.cxx) SET_TARGET_PROPERTIES(generator_extern PROPERTIES OUTPUT_NAME the_external_generator) diff --git a/Tests/CustomCommand/gen_redirect_in.c b/Tests/CustomCommand/gen_redirect_in.c new file mode 100644 index 0000000..8dd8f43 --- /dev/null +++ b/Tests/CustomCommand/gen_redirect_in.c @@ -0,0 +1,5 @@ +#if 1 + +int gen_redirect() { return 3; } + +/* endif should be concatenated to generated file */ diff --git a/Tests/CustomCommand/generator.cxx b/Tests/CustomCommand/generator.cxx index 99da90c..cceac07 100644 --- a/Tests/CustomCommand/generator.cxx +++ b/Tests/CustomCommand/generator.cxx @@ -8,8 +8,12 @@ int main(int argc, char *argv[]) return 1; } FILE *fp = fopen(argv[1],"w"); - +#ifdef GENERATOR_EXTERN fprintf(fp,"int generated() { return 3; }\n"); +#else + fprintf(fp,"extern int gen_redirect(void);\n"); + fprintf(fp,"int generated() { return gen_redirect(); }\n"); +#endif fclose(fp); return 0; } diff --git a/Tests/CustomCommand/tcat.cxx b/Tests/CustomCommand/tcat.cxx new file mode 100644 index 0000000..89e3cb0 --- /dev/null +++ b/Tests/CustomCommand/tcat.cxx @@ -0,0 +1,11 @@ +#include + +int main() +{ + int c; + while((c = getc(stdin), c != EOF)) + { + putc(c, stdout); + } + return 0; +} -- cgit v0.12