summaryrefslogtreecommitdiff
path: root/utils
diff options
context:
space:
mode:
authorMikhail Glushenkov <foldr@codedgers.com>2008-11-12 12:41:18 +0000
committerMikhail Glushenkov <foldr@codedgers.com>2008-11-12 12:41:18 +0000
commit6766572dcbb00008c14f66bc81d494356ce85268 (patch)
treea8f094c0de6e3406c2c148a5d4efc8cb09248f7f /utils
parent9a365b6acb3e43dace074dc28264ed70511b103c (diff)
downloadllvm-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.cpp12
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