From 6766572dcbb00008c14f66bc81d494356ce85268 Mon Sep 17 00:00:00 2001 From: Mikhail Glushenkov Date: Wed, 12 Nov 2008 12:41:18 +0000 Subject: [PATCH] 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 --- utils/TableGen/LLVMCConfigurationEmitter.cpp | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/utils/TableGen/LLVMCConfigurationEmitter.cpp b/utils/TableGen/LLVMCConfigurationEmitter.cpp index 33b0e3d8cb2..bacde538daa 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 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 OutputFilename;\n\n"; + << "extern cl::opt OutputFilename;\n\n" + + << "inline const char* checkCString(const char* s)\n" + << "{ return s == NULL ? \"\" : s; }\n\n"; } // End of anonymous namespace -- 2.34.1