cmake: Fix read-after-free while checking command-line arguments

Since commit v2.8.12~300^2~1 (CLI: Suppress the unused warning if the
key value pair is cached, 2013-05-16), cmake::SetCacheArgs saves a
cachedValue pointer and may cause the memory to be freed (by setting the
cache entry) before reading it again.  Fix this by saving the old value
in a separate string.
This commit is contained in:
Brad King 2014-06-12 09:46:54 -04:00
parent f25a301f3a
commit fe44f057f2
1 changed files with 13 additions and 5 deletions

View File

@ -339,16 +339,24 @@ bool cmake::SetCacheArgs(const std::vector<std::string>& args)
// The value is transformed if it is a filepath for example, so // The value is transformed if it is a filepath for example, so
// we can't compare whether the value is already in the cache until // we can't compare whether the value is already in the cache until
// after we call AddCacheEntry. // after we call AddCacheEntry.
const char *cachedValue = bool haveValue = false;
this->CacheManager->GetCacheValue(var.c_str()); std::string cachedValue;
if(this->WarnUnusedCli)
{
if(const char *v = this->CacheManager->GetCacheValue(var.c_str()))
{
haveValue = true;
cachedValue = v;
}
}
this->CacheManager->AddCacheEntry(var.c_str(), value.c_str(), this->CacheManager->AddCacheEntry(var.c_str(), value.c_str(),
"No help, variable specified on the command line.", type); "No help, variable specified on the command line.", type);
if(this->WarnUnusedCli) if(this->WarnUnusedCli)
{ {
if (!cachedValue if (!haveValue ||
|| strcmp(this->CacheManager->GetCacheValue(var.c_str()), cachedValue != this->CacheManager->GetCacheValue(var.c_str()))
cachedValue) != 0)
{ {
this->WatchUnusedCli(var.c_str()); this->WatchUnusedCli(var.c_str());
} }