mirror of
https://github.com/owasp-modsecurity/ModSecurity.git
synced 2025-10-02 04:27:47 +03:00
swtich singleton to thread safe version
This commit is contained in:
@@ -42,9 +42,8 @@ LMDB::LMDB(std::string name) :
|
|||||||
|
|
||||||
int LMDB::txn_begin(unsigned int flags, MDB_txn **ret) {
|
int LMDB::txn_begin(unsigned int flags, MDB_txn **ret) {
|
||||||
if (!isOpen) {
|
if (!isOpen) {
|
||||||
MDBEnvProvider* provider = MDBEnvProvider::GetInstance();
|
m_env = MDBEnvProvider::GetInstance().GetEnv();
|
||||||
m_env = provider->GetEnv();
|
m_dbi = *(MDBEnvProvider::GetInstance().GetDBI());
|
||||||
m_dbi = *(provider->GetDBI());
|
|
||||||
isOpen = true;
|
isOpen = true;
|
||||||
}
|
}
|
||||||
return mdb_txn_begin(m_env, NULL, flags, ret);
|
return mdb_txn_begin(m_env, NULL, flags, ret);
|
||||||
@@ -502,22 +501,6 @@ end_txn:
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
MDBEnvProvider* MDBEnvProvider::provider_ = nullptr;
|
|
||||||
|
|
||||||
MDBEnvProvider* MDBEnvProvider::GetInstance() {
|
|
||||||
if (provider_==nullptr) {
|
|
||||||
provider_ = new MDBEnvProvider();
|
|
||||||
}
|
|
||||||
return provider_;
|
|
||||||
}
|
|
||||||
|
|
||||||
void MDBEnvProvider::Finalize() {
|
|
||||||
if (provider_!=nullptr) {
|
|
||||||
provider_->close();
|
|
||||||
provider_ = nullptr;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
MDBEnvProvider::MDBEnvProvider() :
|
MDBEnvProvider::MDBEnvProvider() :
|
||||||
m_env(NULL), initialized(false) {
|
m_env(NULL), initialized(false) {
|
||||||
pthread_mutex_init(&m_lock, NULL);
|
pthread_mutex_init(&m_lock, NULL);
|
||||||
|
@@ -66,9 +66,7 @@ namespace backend {
|
|||||||
* "Use an MDB_env* in the process which opened it, without fork()ing."
|
* "Use an MDB_env* in the process which opened it, without fork()ing."
|
||||||
*/
|
*/
|
||||||
class MDBEnvProvider {
|
class MDBEnvProvider {
|
||||||
protected:
|
|
||||||
static MDBEnvProvider* provider_;
|
|
||||||
MDBEnvProvider();
|
|
||||||
public:
|
public:
|
||||||
MDBEnvProvider(MDBEnvProvider &other) = delete;
|
MDBEnvProvider(MDBEnvProvider &other) = delete;
|
||||||
void operator=(const MDBEnvProvider &) = delete;
|
void operator=(const MDBEnvProvider &) = delete;
|
||||||
@@ -77,11 +75,12 @@ class MDBEnvProvider {
|
|||||||
* This is the static method that controls the access to the singleton
|
* This is the static method that controls the access to the singleton
|
||||||
* instance. On the first run, it creates a singleton object and places it
|
* instance. On the first run, it creates a singleton object and places it
|
||||||
* into the static field. On subsequent runs, it returns the client existing
|
* into the static field. On subsequent runs, it returns the client existing
|
||||||
* object stored in the static field.
|
* object stored in the static field (Meyers Singleton implementation).
|
||||||
*/
|
*/
|
||||||
static MDBEnvProvider* GetInstance();
|
static MDBEnvProvider& GetInstance() {
|
||||||
static void Finalize();
|
static MDBEnvProvider instance;
|
||||||
|
return instance;
|
||||||
|
}
|
||||||
MDB_env* GetEnv();
|
MDB_env* GetEnv();
|
||||||
MDB_dbi* GetDBI();
|
MDB_dbi* GetDBI();
|
||||||
|
|
||||||
@@ -90,6 +89,7 @@ class MDBEnvProvider {
|
|||||||
MDB_dbi m_dbi;
|
MDB_dbi m_dbi;
|
||||||
pthread_mutex_t m_lock;
|
pthread_mutex_t m_lock;
|
||||||
|
|
||||||
|
MDBEnvProvider();
|
||||||
bool initialized;
|
bool initialized;
|
||||||
void init();
|
void init();
|
||||||
void close();
|
void close();
|
||||||
|
@@ -106,9 +106,6 @@ ModSecurity::~ModSecurity() {
|
|||||||
delete m_ip_collection;
|
delete m_ip_collection;
|
||||||
delete m_session_collection;
|
delete m_session_collection;
|
||||||
delete m_user_collection;
|
delete m_user_collection;
|
||||||
#ifdef WITH_LMDB
|
|
||||||
collection::backend::MDBEnvProvider::Finalize();
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@@ -44,14 +44,14 @@ functionStatic:src/engine/lua.h:71
|
|||||||
functionConst:src/utils/geo_lookup.h:49
|
functionConst:src/utils/geo_lookup.h:49
|
||||||
useInitializationList:src/operators/rbl.h:69
|
useInitializationList:src/operators/rbl.h:69
|
||||||
constStatement:test/common/modsecurity_test.cc:82
|
constStatement:test/common/modsecurity_test.cc:82
|
||||||
danglingTemporaryLifetime:src/modsecurity.cc:209
|
danglingTemporaryLifetime:src/modsecurity.cc:206
|
||||||
functionStatic:src/operators/geo_lookup.h:35
|
functionStatic:src/operators/geo_lookup.h:35
|
||||||
duplicateBreak:src/operators/validate_utf8_encoding.cc
|
duplicateBreak:src/operators/validate_utf8_encoding.cc
|
||||||
duplicateBranch:src/request_body_processor/multipart.cc:91
|
duplicateBranch:src/request_body_processor/multipart.cc:91
|
||||||
syntaxError:src/transaction.cc:62
|
syntaxError:src/transaction.cc:62
|
||||||
noConstructor:src/variables/variable.h:152
|
noConstructor:src/variables/variable.h:152
|
||||||
duplicateBranch:src/request_body_processor/multipart.cc:93
|
duplicateBranch:src/request_body_processor/multipart.cc:93
|
||||||
danglingTempReference:src/modsecurity.cc:209
|
danglingTempReference:src/modsecurity.cc:206
|
||||||
knownConditionTrueFalse:src/operators/validate_url_encoding.cc:77
|
knownConditionTrueFalse:src/operators/validate_url_encoding.cc:77
|
||||||
knownConditionTrueFalse:src/operators/verify_svnr.cc:87
|
knownConditionTrueFalse:src/operators/verify_svnr.cc:87
|
||||||
rethrowNoCurrentException:headers/modsecurity/transaction.h:307
|
rethrowNoCurrentException:headers/modsecurity/transaction.h:307
|
||||||
|
Reference in New Issue
Block a user