diff options
author | Mikhail Glushenkov <foldr@codedgers.com> | 2008-11-12 12:41:18 +0000 |
---|---|---|
committer | Mikhail Glushenkov <foldr@codedgers.com> | 2008-11-12 12:41:18 +0000 |
commit | 6766572dcbb00008c14f66bc81d494356ce85268 (patch) | |
tree | a8f094c0de6e3406c2c148a5d4efc8cb09248f7f /utils | |
parent | 9a365b6acb3e43dace074dc28264ed70511b103c (diff) | |
download | llvm-6766572dcbb00008c14f66bc81d494356ce85268.tar.gz llvm-6766572dcbb00008c14f66bc81d494356ce85268.tar.bz2 llvm-6766572dcbb00008c14f66bc81d494356ce85268.tar.xz |
Check the return value of std::getenv.
When constructing std::strings from C strings, we should check the input
value to be not NULL so that the std::string constructor does not
segfault.
Fixes #3047.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@59131 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'utils')
-rw-r--r-- | utils/TableGen/LLVMCConfigurationEmitter.cpp | 12 |
1 files changed, 8 insertions, 4 deletions
diff --git a/utils/TableGen/LLVMCConfigurationEmitter.cpp b/utils/TableGen/LLVMCConfigurationEmitter.cpp index 33b0e3d8cb..bacde538da 100644 --- a/utils/TableGen/LLVMCConfigurationEmitter.cpp +++ b/utils/TableGen/LLVMCConfigurationEmitter.cpp @@ -1121,9 +1121,9 @@ std::string SubstituteSpecialCommands(const std::string& cmd) { if (cmd.size() == 5) throw std::string("$ENV invocation: empty argument list!"); - ret += "std::getenv(\""; + ret += "checkCString(std::getenv(\""; ret += std::string(cmd.begin() + 5, cmd.begin() + cparen); - ret += "\")"; + ret += "\"))"; } else { throw "Unknown special command: " + cmd; @@ -1729,7 +1729,8 @@ void EmitRegisterPlugin(std::ostream& O) { << "static llvmc::RegisterPlugin<Plugin> RP;\n\n}\n\n"; } -/// EmitInclude - Emit necessary #include directives. +/// EmitIncludes - Emit necessary #include directives and some +/// additional declarations. void EmitIncludes(std::ostream& O) { O << "#include \"llvm/CompilerDriver/CompilationGraph.h\"\n" << "#include \"llvm/CompilerDriver/Plugin.h\"\n" @@ -1744,7 +1745,10 @@ void EmitIncludes(std::ostream& O) { << "using namespace llvm;\n" << "using namespace llvmc;\n\n" - << "extern cl::opt<std::string> OutputFilename;\n\n"; + << "extern cl::opt<std::string> OutputFilename;\n\n" + + << "inline const char* checkCString(const char* s)\n" + << "{ return s == NULL ? \"\" : s; }\n\n"; } // End of anonymous namespace |