mirror of
https://github.com/owasp-modsecurity/ModSecurity.git
synced 2025-08-14 05:45:59 +03:00
Properly deal with classes destructors
There are some classes such as AuditLog that demands a reference count. That is needed because this class can be used by different instances of the Rules classes.
This commit is contained in:
parent
0c98bdc80b
commit
001d5ebf7f
@ -47,6 +47,9 @@ int main (int argc, char **argv)
|
||||
msc_process_response_headers(assay);
|
||||
msc_process_response_body(assay);
|
||||
|
||||
msc_rules_cleanup(rules);
|
||||
msc_cleanup(modsec);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -121,7 +121,7 @@ class Rule;
|
||||
class ModSecurity {
|
||||
public:
|
||||
ModSecurity();
|
||||
~ModSecurity() { }
|
||||
~ModSecurity();
|
||||
|
||||
static std::string whoAmI();
|
||||
void setConnectorInformation(std::string connector);
|
||||
@ -220,6 +220,8 @@ ModSecurity *msc_init();
|
||||
const char *msc_who_am_i(ModSecurity *msc);
|
||||
/** @ingroup ModSecurity_C_API */
|
||||
void msc_set_connector_info(ModSecurity *msc, const char *connector);
|
||||
/** @ingroup ModSecurity_C_API */
|
||||
void msc_cleanup(ModSecurity *msc);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
|
@ -53,7 +53,7 @@ class Rules {
|
||||
: m_referenceCount(0),
|
||||
m_custom_debug_log(custom_log) { }
|
||||
|
||||
~Rules() { }
|
||||
~Rules();
|
||||
|
||||
void incrementReferenceCount(void);
|
||||
void decrementReferenceCount(void);
|
||||
@ -142,6 +142,7 @@ int msc_rules_merge(Rules *rules_dst, Rules *rules_from);
|
||||
int msc_rules_add_remote(Rules *rules, char *key, char *uri);
|
||||
int msc_rules_add_file(Rules *rules, char *file);
|
||||
int msc_rules_add(Rules *rules, const char *plain_rules);
|
||||
int msc_rules_cleanup(Rules *rules);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
|
@ -34,6 +34,11 @@
|
||||
namespace ModSecurity {
|
||||
|
||||
|
||||
AuditLog::~AuditLog() {
|
||||
m_writer->refCountDecreaseAndCheck();
|
||||
}
|
||||
|
||||
|
||||
bool AuditLog::setStorageDirMode(int permission) {
|
||||
this->directoryPermission = permission;
|
||||
return true;
|
||||
|
@ -43,9 +43,24 @@ class AuditLog {
|
||||
m_writer(NULL),
|
||||
m_relevant(""),
|
||||
filePermission(0600),
|
||||
directoryPermission(0600)
|
||||
directoryPermission(0600),
|
||||
m_refereceCount(1)
|
||||
{ }
|
||||
|
||||
~AuditLog();
|
||||
|
||||
void refCountIncrease() {
|
||||
m_refereceCount++;
|
||||
}
|
||||
|
||||
|
||||
void refCountDecreaseAndCheck() {
|
||||
m_refereceCount--;
|
||||
if (m_refereceCount == 0) {
|
||||
delete this;
|
||||
}
|
||||
}
|
||||
|
||||
enum AuditLogType {
|
||||
SerialAuditLogType,
|
||||
ParallelAuditLogType,
|
||||
@ -180,6 +195,7 @@ class AuditLog {
|
||||
std::string m_relevant;
|
||||
|
||||
AuditLogWriter *m_writer;
|
||||
int m_refereceCount;
|
||||
};
|
||||
|
||||
} // namespace ModSecurity
|
||||
|
@ -38,4 +38,5 @@ bool AuditLogWriter::write(Assay *assay, int parts) {
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
} // namespace ModSecurity
|
||||
|
@ -32,9 +32,14 @@ class AuditLog;
|
||||
class AuditLogWriter {
|
||||
public:
|
||||
explicit AuditLogWriter(AuditLog *audit)
|
||||
: m_audit(audit) { }
|
||||
: m_audit(audit),
|
||||
m_refereceCount(1) { }
|
||||
|
||||
~AuditLogWriter() { }
|
||||
|
||||
virtual void refCountIncrease() = 0;
|
||||
virtual void refCountDecreaseAndCheck() = 0;
|
||||
|
||||
virtual bool close() { return true; }
|
||||
virtual bool init() { return true; }
|
||||
virtual bool write(Assay *assay, int parts);
|
||||
|
||||
@ -42,6 +47,7 @@ class AuditLogWriter {
|
||||
|
||||
protected:
|
||||
AuditLog *m_audit;
|
||||
int m_refereceCount;
|
||||
};
|
||||
|
||||
} // namespace ModSecurity
|
||||
|
@ -69,11 +69,6 @@ bool AuditLogWriterParallel::init() {
|
||||
}
|
||||
|
||||
|
||||
bool AuditLogWriterParallel::close() {
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
bool AuditLogWriterParallel::write(Assay *assay, int parts) {
|
||||
FILE *fp;
|
||||
int fd;
|
||||
|
@ -31,10 +31,22 @@ class AuditLogWriterParallel : public AuditLogWriter {
|
||||
explicit AuditLogWriterParallel(AuditLog *audit)
|
||||
: AuditLogWriter(audit) { }
|
||||
|
||||
~AuditLogWriterParallel() { }
|
||||
bool init() override;
|
||||
bool close() override;
|
||||
bool write(Assay *assay, int parts) override;
|
||||
|
||||
void refCountIncrease() override {
|
||||
m_refereceCount++;
|
||||
}
|
||||
|
||||
|
||||
void refCountDecreaseAndCheck() override {
|
||||
m_refereceCount--;
|
||||
if (m_refereceCount == 0) {
|
||||
delete this;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* Audit log file is saved into a directory structure. This directory
|
||||
|
@ -20,18 +20,18 @@
|
||||
namespace ModSecurity {
|
||||
|
||||
|
||||
AuditLogWriterSerial::~AuditLogWriterSerial()
|
||||
{ }
|
||||
|
||||
|
||||
bool AuditLogWriterSerial::init() {
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
bool AuditLogWriterSerial::close() {
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
bool AuditLogWriterSerial::write(Assay *assay, int parts) {
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
} // namespace ModSecurity
|
||||
|
@ -35,8 +35,21 @@ class AuditLogWriterSerial : public AuditLogWriter {
|
||||
explicit AuditLogWriterSerial(AuditLog *audit)
|
||||
: AuditLogWriter(audit) { }
|
||||
|
||||
bool init() override;
|
||||
bool close() override;
|
||||
~AuditLogWriterSerial();
|
||||
|
||||
void refCountIncrease() override {
|
||||
m_refereceCount++;
|
||||
}
|
||||
|
||||
|
||||
void refCountDecreaseAndCheck() override {
|
||||
m_refereceCount--;
|
||||
if (m_refereceCount == 0) {
|
||||
delete this;
|
||||
}
|
||||
}
|
||||
|
||||
bool init() override;;
|
||||
bool write(Assay *assay, int parts) override;
|
||||
};
|
||||
|
||||
|
@ -45,6 +45,10 @@ ModSecurity::ModSecurity()
|
||||
}
|
||||
|
||||
|
||||
ModSecurity::~ModSecurity() {
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @name whoAmI
|
||||
* @brief Return information about this ModSecurity version and platform.
|
||||
@ -162,6 +166,18 @@ extern "C" const char *msc_who_am_i(ModSecurity *msc) {
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @name msc_cleanup
|
||||
* @brief Cleanup ModSecurity C API
|
||||
*
|
||||
* Cleanup ModSecurity instance.
|
||||
*
|
||||
*/
|
||||
extern "C" void msc_cleanup(ModSecurity *msc) {
|
||||
delete msc;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @name msc_init
|
||||
* @brief Initilizes ModSecurity C API
|
||||
|
12
src/rules.cc
12
src/rules.cc
@ -100,6 +100,11 @@ int Rules::loadFromUri(char *uri) {
|
||||
}
|
||||
|
||||
|
||||
Rules::~Rules() {
|
||||
audit_log->refCountDecreaseAndCheck();
|
||||
}
|
||||
|
||||
|
||||
int Rules::loadRemote(char *key, char *uri) {
|
||||
return true;
|
||||
}
|
||||
@ -258,5 +263,12 @@ extern "C" int msc_rules_add(Rules *rules, const char *plain_rules) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
extern "C" int msc_rules_cleanup(Rules *rules) {
|
||||
delete rules;
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
} // namespace ModSecurity
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user