Skip to content

Commit 375519d

Browse files
authored
Merge pull request #2983 from martinhsv/v3/master
Fix memory leaks in lmdb code (new'd strings)
2 parents 8594cb8 + dc2e38e commit 375519d

File tree

2 files changed

+14
-22
lines changed

2 files changed

+14
-22
lines changed

Diff for: CHANGES

+2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
v3.x.y - YYYY-MMM-DD (to be released)
22
-------------------------------------
33

4+
- Fix memory leaks in lmdb code (new'd strings)
5+
[Issue #2983 - @martinhsv]
46
- Configure: add additional name to pcre2 pkg-config list
57
[Issue #2939 - @agebhar1, @fzipi, @martinhsv]
68

Diff for: src/collection/backend/lmdb.cc

+12-22
Original file line numberDiff line numberDiff line change
@@ -253,10 +253,8 @@ void LMDB::resolveSingleMatch(const std::string& var,
253253
mdb_cursor_open(txn, m_dbi, &cursor);
254254
while ((rc = mdb_cursor_get(cursor, &mdb_key,
255255
&mdb_value_ret, MDB_NEXT_DUP)) == 0) {
256-
std::string *a = new std::string(
257-
reinterpret_cast<char *>(mdb_value_ret.mv_data),
258-
mdb_value_ret.mv_size);
259-
VariableValue *v = new VariableValue(&var, a);
256+
std::string a(reinterpret_cast<char *>(mdb_value_ret.mv_data), mdb_value_ret.mv_size);
257+
VariableValue *v = new VariableValue(&var, &a);
260258
l->push_back(v);
261259
}
262260

@@ -427,23 +425,18 @@ void LMDB::resolveMultiMatches(const std::string& var,
427425

428426
if (keySize == 0) {
429427
while ((rc = mdb_cursor_get(cursor, &key, &data, MDB_NEXT)) == 0) {
428+
std::string key_to_insert(reinterpret_cast<char *>(key.mv_data), key.mv_size);
429+
std::string value_to_insert(reinterpret_cast<char *>(data.mv_data), data.mv_size);
430430
l->insert(l->begin(), new VariableValue(
431-
&m_name,
432-
new std::string(reinterpret_cast<char *>(key.mv_data),
433-
key.mv_size),
434-
new std::string(reinterpret_cast<char *>(data.mv_data),
435-
data.mv_size)));
431+
&m_name, &key_to_insert, &value_to_insert));
436432
}
437433
} else {
438434
while ((rc = mdb_cursor_get(cursor, &key, &data, MDB_NEXT)) == 0) {
439435
char *a = reinterpret_cast<char *>(key.mv_data);
440436
if (strncmp(var.c_str(), a, keySize) == 0) {
441-
l->insert(l->begin(), new VariableValue(
442-
&m_name,
443-
new std::string(reinterpret_cast<char *>(key.mv_data),
444-
key.mv_size),
445-
new std::string(reinterpret_cast<char *>(data.mv_data),
446-
data.mv_size)));
437+
std::string key_to_insert(reinterpret_cast<char *>(key.mv_data), key.mv_size);
438+
std::string value_to_insert(reinterpret_cast<char *>(data.mv_data), data.mv_size);
439+
l->insert(l->begin(), new VariableValue(&m_name, &key_to_insert, &value_to_insert));
447440
}
448441
}
449442
}
@@ -485,16 +478,13 @@ void LMDB::resolveRegularExpression(const std::string& var,
485478
if (ret <= 0) {
486479
continue;
487480
}
488-
if (ke.toOmit(std::string(reinterpret_cast<char *>(key.mv_data),
489-
key.mv_size))) {
481+
std::string key_to_insert(reinterpret_cast<char *>(key.mv_data), key.mv_size);
482+
if (ke.toOmit(key_to_insert)) {
490483
continue;
491484
}
492485

493-
VariableValue *v = new VariableValue(
494-
new std::string(reinterpret_cast<char *>(key.mv_data),
495-
key.mv_size),
496-
new std::string(reinterpret_cast<char *>(data.mv_data),
497-
data.mv_size));
486+
std::string value_to_insert(reinterpret_cast<char *>(data.mv_data), data.mv_size);
487+
VariableValue *v = new VariableValue(&key_to_insert, &value_to_insert);
498488
l->insert(l->begin(), v);
499489
}
500490

0 commit comments

Comments
 (0)