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:
Felipe Zimmerle 2015-07-13 12:28:25 -03:00
parent 0c98bdc80b
commit 001d5ebf7f
13 changed files with 100 additions and 18 deletions

View File

@ -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;
}

View File

@ -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
}

View File

@ -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
}

View File

@ -34,6 +34,11 @@
namespace ModSecurity {
AuditLog::~AuditLog() {
m_writer->refCountDecreaseAndCheck();
}
bool AuditLog::setStorageDirMode(int permission) {
this->directoryPermission = permission;
return true;

View File

@ -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

View File

@ -38,4 +38,5 @@ bool AuditLogWriter::write(Assay *assay, int parts) {
return true;
}
} // namespace ModSecurity

View File

@ -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

View File

@ -69,11 +69,6 @@ bool AuditLogWriterParallel::init() {
}
bool AuditLogWriterParallel::close() {
return true;
}
bool AuditLogWriterParallel::write(Assay *assay, int parts) {
FILE *fp;
int fd;

View File

@ -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

View File

@ -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

View File

@ -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;
};

View File

@ -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

View File

@ -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