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

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