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_headers(assay);
msc_process_response_body(assay); msc_process_response_body(assay);
msc_rules_cleanup(rules);
msc_cleanup(modsec);
return 0; return 0;
} }

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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