Skip to content

Commit d0813fe

Browse files
authored
Merge pull request #2602 from LMDB/issue2601
Fix #2601 misuses of LMDB API
2 parents 4e37985 + a6e1074 commit d0813fe

File tree

2 files changed

+26
-107
lines changed

2 files changed

+26
-107
lines changed

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

+25-107
Original file line numberDiff line numberDiff line change
@@ -37,9 +37,13 @@ namespace backend {
3737

3838
LMDB::LMDB(std::string name) :
3939
Collection(name), m_env(NULL) {
40+
MDB_txn *txn;
4041
mdb_env_create(&m_env);
4142
mdb_env_open(m_env, "./modsec-shared-collections",
4243
MDB_WRITEMAP | MDB_NOSUBDIR, 0664);
44+
mdb_txn_begin(m_env, NULL, 0, &txn);
45+
mdb_dbi_open(txn, NULL, MDB_CREATE | MDB_DUPSORT, &m_dbi);
46+
mdb_txn_commit(txn);
4347
}
4448

4549

@@ -89,23 +93,6 @@ void LMDB::lmdb_debug(int rc, std::string op, std::string scope) {
8993
break;
9094
}
9195
std::cout << std::endl;
92-
} else if (op == "dbi") {
93-
std::cout << scope << ", LMDB failure while opening dbi: ";
94-
switch (rc) {
95-
case MDB_NOTFOUND:
96-
std::cout << "not found: the specified database doesn't ";
97-
std::cout << "exist in the environment and MDB_CREATE was ";
98-
std::cout << "not specified.";
99-
break;
100-
case MDB_DBS_FULL:
101-
std::cout << "full: too many databases have been opened. See ";
102-
std::cout << "mdb_env_set_maxdbs().";
103-
break;
104-
default:
105-
std::cout << "not sure what is wrong.";
106-
break;
107-
}
108-
std::cout << std::endl;
10996
} else if (op == "get") {
11097
std::cout << scope << ", LMDB failure while getting the key: ";
11198
switch (rc) {
@@ -169,21 +156,15 @@ std::unique_ptr<std::string> LMDB::resolveFirst(const std::string& var) {
169156
MDB_val mdb_value_ret;
170157
std::unique_ptr<std::string> ret = NULL;
171158
MDB_txn *txn = NULL;
172-
MDB_dbi dbi;
173159

174160
string2val(var, &mdb_key);
175161

176-
rc = mdb_txn_begin(m_env, NULL, 0, &txn);
162+
rc = mdb_txn_begin(m_env, NULL, MDB_RDONLY, &txn);
177163
lmdb_debug(rc, "txn", "resolveFirst");
178164
if (rc != 0) {
179165
goto end_txn;
180166
}
181-
rc = mdb_dbi_open(txn, NULL, MDB_CREATE | MDB_DUPSORT, &dbi);
182-
lmdb_debug(rc, "dbi", "resolveFirst");
183-
if (rc != 0) {
184-
goto end_dbi;
185-
}
186-
rc = mdb_get(txn, dbi, &mdb_key, &mdb_value_ret);
167+
rc = mdb_get(txn, m_dbi, &mdb_key, &mdb_value_ret);
187168
lmdb_debug(rc, "get", "resolveFirst");
188169
if (rc != 0) {
189170
goto end_get;
@@ -194,8 +175,6 @@ std::unique_ptr<std::string> LMDB::resolveFirst(const std::string& var) {
194175
mdb_value_ret.mv_size));
195176

196177
end_get:
197-
mdb_dbi_close(m_env, dbi);
198-
end_dbi:
199178
mdb_txn_abort(txn);
200179
end_txn:
201180
return ret;
@@ -206,7 +185,6 @@ bool LMDB::storeOrUpdateFirst(const std::string &key,
206185
const std::string &value) {
207186
int rc;
208187
MDB_txn *txn;
209-
MDB_dbi dbi;
210188
MDB_val mdb_key;
211189
MDB_val mdb_value;
212190
MDB_val mdb_value_ret;
@@ -220,23 +198,17 @@ bool LMDB::storeOrUpdateFirst(const std::string &key,
220198
goto end_txn;
221199
}
222200

223-
rc = mdb_dbi_open(txn, NULL, MDB_CREATE | MDB_DUPSORT, &dbi);
224-
lmdb_debug(rc, "dbi", "storeOrUpdateFirst");
225-
if (rc != 0) {
226-
goto end_dbi;
227-
}
228-
229-
rc = mdb_get(txn, dbi, &mdb_key, &mdb_value_ret);
201+
rc = mdb_get(txn, m_dbi, &mdb_key, &mdb_value_ret);
230202
lmdb_debug(rc, "get", "storeOrUpdateFirst");
231203
if (rc == 0) {
232-
rc = mdb_del(txn, dbi, &mdb_key, &mdb_value_ret);
204+
rc = mdb_del(txn, m_dbi, &mdb_key, &mdb_value_ret);
233205
lmdb_debug(rc, "del", "storeOrUpdateFirst");
234206
if (rc != 0) {
235207
goto end_del;
236208
}
237209
}
238210

239-
rc = mdb_put(txn, dbi, &mdb_key, &mdb_value, 0);
211+
rc = mdb_put(txn, m_dbi, &mdb_key, &mdb_value, 0);
240212
lmdb_debug(rc, "put", "storeOrUpdateFirst");
241213
if (rc != 0) {
242214
goto end_put;
@@ -248,14 +220,12 @@ bool LMDB::storeOrUpdateFirst(const std::string &key,
248220
goto end_commit;
249221
}
250222

251-
end_commit:
252223
end_put:
253224
end_del:
254-
mdb_dbi_close(m_env, dbi);
255-
end_dbi:
256225
if (rc != 0) {
257226
mdb_txn_abort(txn);
258227
}
228+
end_commit:
259229
end_txn:
260230
return true;
261231
}
@@ -265,26 +235,20 @@ void LMDB::resolveSingleMatch(const std::string& var,
265235
std::vector<const VariableValue *> *l) {
266236
int rc;
267237
MDB_txn *txn;
268-
MDB_dbi dbi;
269238
MDB_val mdb_key;
270239
MDB_val mdb_value;
271240
MDB_val mdb_value_ret;
272241
MDB_cursor *cursor;
273242

274-
rc = mdb_txn_begin(m_env, NULL, 0, &txn);
243+
rc = mdb_txn_begin(m_env, NULL, MDB_RDONLY, &txn);
275244
lmdb_debug(rc, "txn", "resolveSingleMatch");
276245
if (rc != 0) {
277246
goto end_txn;
278247
}
279-
rc = mdb_dbi_open(txn, NULL, MDB_CREATE | MDB_DUPSORT, &dbi);
280-
lmdb_debug(rc, "dbi", "resolveSingleMatch");
281-
if (rc != 0) {
282-
goto end_dbi;
283-
}
284248

285249
string2val(var, &mdb_key);
286250

287-
mdb_cursor_open(txn, dbi, &cursor);
251+
mdb_cursor_open(txn, m_dbi, &cursor);
288252
while ((rc = mdb_cursor_get(cursor, &mdb_key,
289253
&mdb_value_ret, MDB_NEXT_DUP)) == 0) {
290254
std::string *a = new std::string(
@@ -295,9 +259,6 @@ void LMDB::resolveSingleMatch(const std::string& var,
295259
}
296260

297261
mdb_cursor_close(cursor);
298-
299-
mdb_dbi_close(m_env, dbi);
300-
end_dbi:
301262
mdb_txn_abort(txn);
302263
end_txn:
303264
return;
@@ -307,7 +268,6 @@ void LMDB::resolveSingleMatch(const std::string& var,
307268
void LMDB::store(std::string key, std::string value) {
308269
MDB_val mdb_key, mdb_data;
309270
MDB_txn *txn = NULL;
310-
MDB_dbi dbi;
311271
int rc;
312272
MDB_stat mst;
313273

@@ -316,15 +276,10 @@ void LMDB::store(std::string key, std::string value) {
316276
if (rc != 0) {
317277
goto end_txn;
318278
}
319-
rc = mdb_dbi_open(txn, NULL, MDB_CREATE | MDB_DUPSORT, &dbi);
320-
lmdb_debug(rc, "dbi", "store");
321-
if (rc != 0) {
322-
goto end_dbi;
323-
}
324279

325280
string2val(key, &mdb_key);
326281
string2val(value, &mdb_data);
327-
rc = mdb_put(txn, dbi, &mdb_key, &mdb_data, 0);
282+
rc = mdb_put(txn, m_dbi, &mdb_key, &mdb_data, 0);
328283
lmdb_debug(rc, "put", "store");
329284
if (rc != 0) {
330285
goto end_put;
@@ -336,13 +291,12 @@ void LMDB::store(std::string key, std::string value) {
336291
goto end_commit;
337292
}
338293

339-
end_commit:
340294
end_put:
341-
mdb_dbi_close(m_env, dbi);
342295
end_dbi:
343296
if (rc != 0) {
344297
mdb_txn_abort(txn);
345298
}
299+
end_commit:
346300
end_txn:
347301
return;
348302
}
@@ -352,7 +306,6 @@ bool LMDB::updateFirst(const std::string &key,
352306
const std::string &value) {
353307
int rc;
354308
MDB_txn *txn;
355-
MDB_dbi dbi;
356309
MDB_val mdb_key;
357310
MDB_val mdb_value;
358311
MDB_val mdb_value_ret;
@@ -363,28 +316,22 @@ bool LMDB::updateFirst(const std::string &key,
363316
goto end_txn;
364317
}
365318

366-
rc = mdb_dbi_open(txn, NULL, MDB_CREATE | MDB_DUPSORT, &dbi);
367-
lmdb_debug(rc, "dbi", "updateFirst");
368-
if (rc != 0) {
369-
goto end_dbi;
370-
}
371-
372319
string2val(key, &mdb_key);
373320
string2val(value, &mdb_value);
374321

375-
rc = mdb_get(txn, dbi, &mdb_key, &mdb_value_ret);
322+
rc = mdb_get(txn, m_dbi, &mdb_key, &mdb_value_ret);
376323
lmdb_debug(rc, "get", "updateFirst");
377324
if (rc != 0) {
378325
goto end_get;
379326
}
380327

381-
rc = mdb_del(txn, dbi, &mdb_key, &mdb_value_ret);
328+
rc = mdb_del(txn, m_dbi, &mdb_key, &mdb_value_ret);
382329
lmdb_debug(rc, "del", "updateFirst");
383330
if (rc != 0) {
384331
goto end_del;
385332
}
386333

387-
rc = mdb_put(txn, dbi, &mdb_key, &mdb_value, 0);
334+
rc = mdb_put(txn, m_dbi, &mdb_key, &mdb_value, 0);
388335
lmdb_debug(rc, "put", "updateFirst");
389336
if (rc != 0) {
390337
goto end_put;
@@ -396,15 +343,13 @@ bool LMDB::updateFirst(const std::string &key,
396343
goto end_commit;
397344
}
398345

399-
end_commit:
400346
end_put:
401347
end_del:
402348
end_get:
403-
mdb_dbi_close(m_env, dbi);
404-
end_dbi:
405349
if (rc != 0) {
406350
mdb_txn_abort(txn);
407351
}
352+
end_commit:
408353
end_txn:
409354

410355
return rc == 0;
@@ -414,7 +359,6 @@ bool LMDB::updateFirst(const std::string &key,
414359
void LMDB::del(const std::string& key) {
415360
int rc;
416361
MDB_txn *txn;
417-
MDB_dbi dbi;
418362
MDB_val mdb_key;
419363
MDB_val mdb_value;
420364
MDB_val mdb_value_ret;
@@ -426,21 +370,15 @@ void LMDB::del(const std::string& key) {
426370
goto end_txn;
427371
}
428372

429-
rc = mdb_dbi_open(txn, NULL, MDB_CREATE | MDB_DUPSORT, &dbi);
430-
lmdb_debug(rc, "dbi", "del");
431-
if (rc != 0) {
432-
goto end_dbi;
433-
}
434-
435373
string2val(key, &mdb_key);
436374

437-
rc = mdb_get(txn, dbi, &mdb_key, &mdb_value_ret);
375+
rc = mdb_get(txn, m_dbi, &mdb_key, &mdb_value_ret);
438376
lmdb_debug(rc, "get", "del");
439377
if (rc != 0) {
440378
goto end_get;
441379
}
442380

443-
rc = mdb_del(txn, dbi, &mdb_key, &mdb_value_ret);
381+
rc = mdb_del(txn, m_dbi, &mdb_key, &mdb_value_ret);
444382
lmdb_debug(rc, "del", "del");
445383
if (rc != 0) {
446384
goto end_del;
@@ -452,14 +390,12 @@ void LMDB::del(const std::string& key) {
452390
goto end_commit;
453391
}
454392

455-
end_commit:
456393
end_del:
457394
end_get:
458-
mdb_dbi_close(m_env, dbi);
459-
end_dbi:
460395
if (rc != 0) {
461396
mdb_txn_abort(txn);
462397
}
398+
end_commit:
463399
end_txn:
464400
return;
465401
}
@@ -470,25 +406,18 @@ void LMDB::resolveMultiMatches(const std::string& var,
470406
variables::KeyExclusions &ke) {
471407
MDB_val key, data;
472408
MDB_txn *txn = NULL;
473-
MDB_dbi dbi;
474409
int rc;
475410
MDB_stat mst;
476411
size_t keySize = var.size();
477412
MDB_cursor *cursor;
478413

479-
rc = mdb_txn_begin(m_env, NULL, 0, &txn);
414+
rc = mdb_txn_begin(m_env, NULL, MDB_RDONLY, &txn);
480415
lmdb_debug(rc, "txn", "resolveMultiMatches");
481416
if (rc != 0) {
482417
goto end_txn;
483418
}
484419

485-
rc = mdb_dbi_open(txn, NULL, MDB_CREATE | MDB_DUPSORT, &dbi);
486-
lmdb_debug(rc, "dbi", "resolveMultiMatches");
487-
if (rc != 0) {
488-
goto end_dbi;
489-
}
490-
491-
rc = mdb_cursor_open(txn, dbi, &cursor);
420+
rc = mdb_cursor_open(txn, m_dbi, &cursor);
492421
lmdb_debug(rc, "cursor_open", "resolveMultiMatches");
493422
if (rc != 0) {
494423
goto end_cursor_open;
@@ -519,8 +448,6 @@ void LMDB::resolveMultiMatches(const std::string& var,
519448

520449
mdb_cursor_close(cursor);
521450
end_cursor_open:
522-
mdb_dbi_close(m_env, dbi);
523-
end_dbi:
524451
mdb_txn_abort(txn);
525452
end_txn:
526453
return;
@@ -532,26 +459,19 @@ void LMDB::resolveRegularExpression(const std::string& var,
532459
variables::KeyExclusions &ke) {
533460
MDB_val key, data;
534461
MDB_txn *txn = NULL;
535-
MDB_dbi dbi;
536462
int rc;
537463
MDB_stat mst;
538464
MDB_cursor *cursor;
539465

540466
Utils::Regex r(var, true);
541467

542-
rc = mdb_txn_begin(m_env, NULL, 0, &txn);
468+
rc = mdb_txn_begin(m_env, NULL, MDB_RDONLY, &txn);
543469
lmdb_debug(rc, "txn", "resolveRegularExpression");
544470
if (rc != 0) {
545471
goto end_txn;
546472
}
547473

548-
rc = mdb_dbi_open(txn, NULL, MDB_CREATE | MDB_DUPSORT, &dbi);
549-
lmdb_debug(rc, "dbi", "resolveRegularExpression");
550-
if (rc != 0) {
551-
goto end_dbi;
552-
}
553-
554-
rc = mdb_cursor_open(txn, dbi, &cursor);
474+
rc = mdb_cursor_open(txn, m_dbi, &cursor);
555475
lmdb_debug(rc, "cursor_open", "resolveRegularExpression");
556476
if (rc != 0) {
557477
goto end_cursor_open;
@@ -578,8 +498,6 @@ void LMDB::resolveRegularExpression(const std::string& var,
578498

579499
mdb_cursor_close(cursor);
580500
end_cursor_open:
581-
mdb_dbi_close(m_env, dbi);
582-
end_dbi:
583501
mdb_txn_abort(txn);
584502
end_txn:
585503
return;

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

+1
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,7 @@ class LMDB :
7979
void inline lmdb_debug(int rc, std::string op, std::string scope);
8080

8181
MDB_env *m_env;
82+
MDB_dbi m_dbi;
8283
};
8384

8485
} // namespace backend

0 commit comments

Comments
 (0)