mirror of
https://github.com/owasp-modsecurity/ModSecurity.git
synced 2025-08-14 13:56:01 +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_headers(assay);
|
||||||
msc_process_response_body(assay);
|
msc_process_response_body(assay);
|
||||||
|
|
||||||
|
msc_rules_cleanup(rules);
|
||||||
|
msc_cleanup(modsec);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -121,7 +121,7 @@ class Rule;
|
|||||||
class ModSecurity {
|
class ModSecurity {
|
||||||
public:
|
public:
|
||||||
ModSecurity();
|
ModSecurity();
|
||||||
~ModSecurity() { }
|
~ModSecurity();
|
||||||
|
|
||||||
static std::string whoAmI();
|
static std::string whoAmI();
|
||||||
void setConnectorInformation(std::string connector);
|
void setConnectorInformation(std::string connector);
|
||||||
@ -220,6 +220,8 @@ ModSecurity *msc_init();
|
|||||||
const char *msc_who_am_i(ModSecurity *msc);
|
const char *msc_who_am_i(ModSecurity *msc);
|
||||||
/** @ingroup ModSecurity_C_API */
|
/** @ingroup ModSecurity_C_API */
|
||||||
void msc_set_connector_info(ModSecurity *msc, const char *connector);
|
void msc_set_connector_info(ModSecurity *msc, const char *connector);
|
||||||
|
/** @ingroup ModSecurity_C_API */
|
||||||
|
void msc_cleanup(ModSecurity *msc);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
@ -53,7 +53,7 @@ class Rules {
|
|||||||
: m_referenceCount(0),
|
: m_referenceCount(0),
|
||||||
m_custom_debug_log(custom_log) { }
|
m_custom_debug_log(custom_log) { }
|
||||||
|
|
||||||
~Rules() { }
|
~Rules();
|
||||||
|
|
||||||
void incrementReferenceCount(void);
|
void incrementReferenceCount(void);
|
||||||
void decrementReferenceCount(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_remote(Rules *rules, char *key, char *uri);
|
||||||
int msc_rules_add_file(Rules *rules, char *file);
|
int msc_rules_add_file(Rules *rules, char *file);
|
||||||
int msc_rules_add(Rules *rules, const char *plain_rules);
|
int msc_rules_add(Rules *rules, const char *plain_rules);
|
||||||
|
int msc_rules_cleanup(Rules *rules);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
@ -34,6 +34,11 @@
|
|||||||
namespace ModSecurity {
|
namespace ModSecurity {
|
||||||
|
|
||||||
|
|
||||||
|
AuditLog::~AuditLog() {
|
||||||
|
m_writer->refCountDecreaseAndCheck();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
bool AuditLog::setStorageDirMode(int permission) {
|
bool AuditLog::setStorageDirMode(int permission) {
|
||||||
this->directoryPermission = permission;
|
this->directoryPermission = permission;
|
||||||
return true;
|
return true;
|
||||||
|
@ -43,9 +43,24 @@ class AuditLog {
|
|||||||
m_writer(NULL),
|
m_writer(NULL),
|
||||||
m_relevant(""),
|
m_relevant(""),
|
||||||
filePermission(0600),
|
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 {
|
enum AuditLogType {
|
||||||
SerialAuditLogType,
|
SerialAuditLogType,
|
||||||
ParallelAuditLogType,
|
ParallelAuditLogType,
|
||||||
@ -180,6 +195,7 @@ class AuditLog {
|
|||||||
std::string m_relevant;
|
std::string m_relevant;
|
||||||
|
|
||||||
AuditLogWriter *m_writer;
|
AuditLogWriter *m_writer;
|
||||||
|
int m_refereceCount;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace ModSecurity
|
} // namespace ModSecurity
|
||||||
|
@ -38,4 +38,5 @@ bool AuditLogWriter::write(Assay *assay, int parts) {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
} // namespace ModSecurity
|
} // namespace ModSecurity
|
||||||
|
@ -32,9 +32,14 @@ class AuditLog;
|
|||||||
class AuditLogWriter {
|
class AuditLogWriter {
|
||||||
public:
|
public:
|
||||||
explicit AuditLogWriter(AuditLog *audit)
|
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 init() { return true; }
|
||||||
virtual bool write(Assay *assay, int parts);
|
virtual bool write(Assay *assay, int parts);
|
||||||
|
|
||||||
@ -42,6 +47,7 @@ class AuditLogWriter {
|
|||||||
|
|
||||||
protected:
|
protected:
|
||||||
AuditLog *m_audit;
|
AuditLog *m_audit;
|
||||||
|
int m_refereceCount;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace ModSecurity
|
} // namespace ModSecurity
|
||||||
|
@ -69,11 +69,6 @@ bool AuditLogWriterParallel::init() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool AuditLogWriterParallel::close() {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
bool AuditLogWriterParallel::write(Assay *assay, int parts) {
|
bool AuditLogWriterParallel::write(Assay *assay, int parts) {
|
||||||
FILE *fp;
|
FILE *fp;
|
||||||
int fd;
|
int fd;
|
||||||
|
@ -31,10 +31,22 @@ class AuditLogWriterParallel : public AuditLogWriter {
|
|||||||
explicit AuditLogWriterParallel(AuditLog *audit)
|
explicit AuditLogWriterParallel(AuditLog *audit)
|
||||||
: AuditLogWriter(audit) { }
|
: AuditLogWriter(audit) { }
|
||||||
|
|
||||||
|
~AuditLogWriterParallel() { }
|
||||||
bool init() override;
|
bool init() override;
|
||||||
bool close() override;
|
|
||||||
bool write(Assay *assay, int parts) 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
|
* Audit log file is saved into a directory structure. This directory
|
||||||
|
@ -20,18 +20,18 @@
|
|||||||
namespace ModSecurity {
|
namespace ModSecurity {
|
||||||
|
|
||||||
|
|
||||||
|
AuditLogWriterSerial::~AuditLogWriterSerial()
|
||||||
|
{ }
|
||||||
|
|
||||||
|
|
||||||
bool AuditLogWriterSerial::init() {
|
bool AuditLogWriterSerial::init() {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool AuditLogWriterSerial::close() {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
bool AuditLogWriterSerial::write(Assay *assay, int parts) {
|
bool AuditLogWriterSerial::write(Assay *assay, int parts) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
} // namespace ModSecurity
|
} // namespace ModSecurity
|
||||||
|
@ -35,8 +35,21 @@ class AuditLogWriterSerial : public AuditLogWriter {
|
|||||||
explicit AuditLogWriterSerial(AuditLog *audit)
|
explicit AuditLogWriterSerial(AuditLog *audit)
|
||||||
: AuditLogWriter(audit) { }
|
: AuditLogWriter(audit) { }
|
||||||
|
|
||||||
bool init() override;
|
~AuditLogWriterSerial();
|
||||||
bool close() override;
|
|
||||||
|
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;
|
bool write(Assay *assay, int parts) override;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -45,6 +45,10 @@ ModSecurity::ModSecurity()
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
ModSecurity::~ModSecurity() {
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @name whoAmI
|
* @name whoAmI
|
||||||
* @brief Return information about this ModSecurity version and platform.
|
* @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
|
* @name msc_init
|
||||||
* @brief Initilizes ModSecurity C API
|
* @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) {
|
int Rules::loadRemote(char *key, char *uri) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -258,5 +263,12 @@ extern "C" int msc_rules_add(Rules *rules, const char *plain_rules) {
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
extern "C" int msc_rules_cleanup(Rules *rules) {
|
||||||
|
delete rules;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
} // namespace ModSecurity
|
} // namespace ModSecurity
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user