mirror of
https://github.com/owasp-modsecurity/ModSecurity.git
synced 2025-08-13 13:26:01 +03:00
Remove memory leak in lmdb.cc while passing data from MDB_val to VariableValue
- add new VariableValue constructors for rvalue strings - decrease number of memory copies between lmdb and VariableValue
This commit is contained in:
parent
3bfe4b81af
commit
a4798f7f56
@ -47,6 +47,13 @@ class VariableValue {
|
||||
m_value(value != nullptr?*value:"")
|
||||
{ }
|
||||
|
||||
VariableValue(std::string&& key,
|
||||
std::string&& value)
|
||||
: m_collection(""),
|
||||
m_key(std::move(key)),
|
||||
m_value(std::move(value))
|
||||
{ m_keyWithCollection = m_key; }
|
||||
|
||||
VariableValue(const std::string *collection,
|
||||
const std::string *key,
|
||||
const std::string *value)
|
||||
@ -56,6 +63,14 @@ class VariableValue {
|
||||
m_value(*value)
|
||||
{ }
|
||||
|
||||
VariableValue(const std::string *collection,
|
||||
std::string&& key,
|
||||
std::string&& value)
|
||||
: m_collection(*collection),
|
||||
m_key(std::move(key)),
|
||||
m_value(std::move(value))
|
||||
{ m_keyWithCollection = m_collection + ":" + m_key; }
|
||||
|
||||
explicit VariableValue(const VariableValue *o) :
|
||||
m_collection(o->m_collection),
|
||||
m_key(o->m_key),
|
||||
|
@ -291,6 +291,7 @@ void LMDB::resolveSingleMatch(const std::string& var,
|
||||
reinterpret_cast<char *>(mdb_value_ret.mv_data),
|
||||
mdb_value_ret.mv_size);
|
||||
VariableValue *v = new VariableValue(&var, a);
|
||||
delete a;
|
||||
l->push_back(v);
|
||||
}
|
||||
|
||||
@ -498,9 +499,9 @@ void LMDB::resolveMultiMatches(const std::string& var,
|
||||
while ((rc = mdb_cursor_get(cursor, &key, &data, MDB_NEXT)) == 0) {
|
||||
l->insert(l->begin(), new VariableValue(
|
||||
&m_name,
|
||||
new std::string(reinterpret_cast<char *>(key.mv_data),
|
||||
std::string(reinterpret_cast<char *>(key.mv_data),
|
||||
key.mv_size),
|
||||
new std::string(reinterpret_cast<char *>(data.mv_data),
|
||||
std::string(reinterpret_cast<char *>(data.mv_data),
|
||||
data.mv_size)));
|
||||
}
|
||||
} else {
|
||||
@ -509,9 +510,9 @@ void LMDB::resolveMultiMatches(const std::string& var,
|
||||
if (strncmp(var.c_str(), a, keySize) == 0) {
|
||||
l->insert(l->begin(), new VariableValue(
|
||||
&m_name,
|
||||
new std::string(reinterpret_cast<char *>(key.mv_data),
|
||||
std::string(reinterpret_cast<char *>(key.mv_data),
|
||||
key.mv_size),
|
||||
new std::string(reinterpret_cast<char *>(data.mv_data),
|
||||
std::string(reinterpret_cast<char *>(data.mv_data),
|
||||
data.mv_size)));
|
||||
}
|
||||
}
|
||||
@ -569,9 +570,9 @@ void LMDB::resolveRegularExpression(const std::string& var,
|
||||
}
|
||||
|
||||
VariableValue *v = new VariableValue(
|
||||
new std::string(reinterpret_cast<char *>(key.mv_data),
|
||||
std::string(reinterpret_cast<char *>(key.mv_data),
|
||||
key.mv_size),
|
||||
new std::string(reinterpret_cast<char *>(data.mv_data),
|
||||
std::string(reinterpret_cast<char *>(data.mv_data),
|
||||
data.mv_size));
|
||||
l->insert(l->begin(), v);
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user