Skip to content

Commit f923838

Browse files
authored
Merge pull request #2761 from GetPageSpeed/v3/master
Prevent LMDB related segfault for #2755
2 parents af27018 + 204908c commit f923838

File tree

2 files changed

+23
-6
lines changed

2 files changed

+23
-6
lines changed

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

+20-6
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,12 @@ int LMDB::txn_begin(unsigned int flags, MDB_txn **ret) {
4646
m_dbi = *(MDBEnvProvider::GetInstance().GetDBI());
4747
isOpen = true;
4848
}
49-
return mdb_txn_begin(m_env, NULL, flags, ret);
49+
50+
if (MDBEnvProvider::GetInstance().isValid()) {
51+
return mdb_txn_begin(m_env, NULL, flags, ret);
52+
} else {
53+
return -1;
54+
}
5055
}
5156

5257
void LMDB::string2val(const std::string& str, MDB_val *val) {
@@ -501,14 +506,19 @@ void LMDB::resolveRegularExpression(const std::string& var,
501506
}
502507

503508

504-
MDBEnvProvider::MDBEnvProvider() : m_env(NULL) {
509+
MDBEnvProvider::MDBEnvProvider() : m_env(NULL), valid(false) {
510+
int rc;
505511
MDB_txn *txn;
506512
mdb_env_create(&m_env);
507-
mdb_env_open(m_env, "./modsec-shared-collections",
513+
rc = mdb_env_open(m_env, "./modsec-shared-collections",
508514
MDB_WRITEMAP | MDB_NOSUBDIR, 0664);
509-
mdb_txn_begin(m_env, NULL, 0, &txn);
510-
mdb_dbi_open(txn, NULL, MDB_CREATE | MDB_DUPSORT, &m_dbi);
511-
mdb_txn_commit(txn);
515+
516+
if (rc == 0) {
517+
valid = true;
518+
mdb_txn_begin(m_env, NULL, 0, &txn);
519+
mdb_dbi_open(txn, NULL, MDB_CREATE | MDB_DUPSORT, &m_dbi);
520+
mdb_txn_commit(txn);
521+
}
512522
}
513523

514524
MDB_env* MDBEnvProvider::GetEnv() {
@@ -519,6 +529,10 @@ MDB_dbi* MDBEnvProvider::GetDBI() {
519529
return &m_dbi;
520530
}
521531

532+
bool MDBEnvProvider::isValid() {
533+
return valid;
534+
}
535+
522536
MDBEnvProvider::~MDBEnvProvider() {
523537
mdb_dbi_close(m_env, m_dbi);
524538
mdb_env_close(m_env);

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

+3
Original file line numberDiff line numberDiff line change
@@ -83,10 +83,13 @@ class MDBEnvProvider {
8383
}
8484
MDB_env* GetEnv();
8585
MDB_dbi* GetDBI();
86+
bool isValid();
87+
8688
~MDBEnvProvider();
8789
private:
8890
MDB_env *m_env;
8991
MDB_dbi m_dbi;
92+
bool valid;
9093

9194
MDBEnvProvider();
9295
};

0 commit comments

Comments
 (0)