Commit 79b36b64 by Nicolas Capens Committed by Nicolas Capens

Fix use after free

We need to keep a copy of the CPU features for 'mattrs' so they don't get deleted before we pass them into rr::resolveExternalSymbol() by raw pointer. Bug: b/139412871 Change-Id: Iedc2d05fe3ec0d903ffa283994ad95a9cd993e22 Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/40732 Presubmit-Ready: Nicolas Capens <nicolascapens@google.com> Tested-by: 's avatarNicolas Capens <nicolascapens@google.com> Kokoro-Presubmit: kokoro <noreply+kokoro@google.com> Reviewed-by: 's avatarAntonio Maiorano <amaiorano@google.com>
parent 17d980a9
...@@ -178,7 +178,7 @@ public: ...@@ -178,7 +178,7 @@ public:
static JITGlobals *get(); static JITGlobals *get();
const std::string mcpu; const std::string mcpu;
const std::vector<llvm::StringRef> mattrs; const std::vector<std::string> mattrs;
const char *const march; const char *const march;
const llvm::TargetOptions targetOptions; const llvm::TargetOptions targetOptions;
const llvm::DataLayout dataLayout; const llvm::DataLayout dataLayout;
...@@ -189,7 +189,7 @@ private: ...@@ -189,7 +189,7 @@ private:
static JITGlobals create(); static JITGlobals create();
static llvm::CodeGenOpt::Level toLLVM(rr::Optimization::Level level); static llvm::CodeGenOpt::Level toLLVM(rr::Optimization::Level level);
JITGlobals(const char *mcpu, JITGlobals(const char *mcpu,
const std::vector<llvm::StringRef> &mattrs, const std::vector<std::string> &mattrs,
const char *march, const char *march,
const llvm::TargetOptions &targetOptions, const llvm::TargetOptions &targetOptions,
const llvm::DataLayout &dataLayout); const llvm::DataLayout &dataLayout);
...@@ -248,11 +248,11 @@ JITGlobals JITGlobals::create() ...@@ -248,11 +248,11 @@ JITGlobals JITGlobals::create()
(void)ok; // getHostCPUFeatures always returns false on other platforms (void)ok; // getHostCPUFeatures always returns false on other platforms
#endif #endif
std::vector<llvm::StringRef> mattrs; std::vector<std::string> mattrs;
for(auto &feature : features) for(auto &feature : features)
{ {
if(feature.second) { mattrs.push_back(feature.first()); } if(feature.second) { mattrs.push_back(feature.first().str()); }
} }
const char *march = nullptr; const char *march = nullptr;
...@@ -307,7 +307,7 @@ llvm::CodeGenOpt::Level JITGlobals::toLLVM(rr::Optimization::Level level) ...@@ -307,7 +307,7 @@ llvm::CodeGenOpt::Level JITGlobals::toLLVM(rr::Optimization::Level level)
} }
JITGlobals::JITGlobals(const char *mcpu, JITGlobals::JITGlobals(const char *mcpu,
const std::vector<llvm::StringRef> &mattrs, const std::vector<std::string> &mattrs,
const char *march, const char *march,
const llvm::TargetOptions &targetOptions, const llvm::TargetOptions &targetOptions,
const llvm::DataLayout &dataLayout) const llvm::DataLayout &dataLayout)
...@@ -4077,7 +4077,7 @@ RValue<Pointer<Byte>> ConstantPointer(void const *ptr) ...@@ -4077,7 +4077,7 @@ RValue<Pointer<Byte>> ConstantPointer(void const *ptr)
RValue<Pointer<Byte>> ConstantData(void const *data, size_t size) RValue<Pointer<Byte>> ConstantData(void const *data, size_t size)
{ {
auto str = ::llvm::StringRef(reinterpret_cast<const char *>(data), size); auto str = ::std::string(reinterpret_cast<const char *>(data), size);
auto ptr = jit->builder->CreateGlobalStringPtr(str); auto ptr = jit->builder->CreateGlobalStringPtr(str);
return RValue<Pointer<Byte>>(V(ptr)); return RValue<Pointer<Byte>>(V(ptr));
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment