From 001d5ebf7fbc80437776c510b1a2ee06bc59fa98 Mon Sep 17 00:00:00 2001 From: Felipe Zimmerle Date: Mon, 13 Jul 2015 12:28:25 -0300 Subject: [PATCH] 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. --- examples/simple_example_using_c/test.c | 3 +++ headers/modsecurity/modsecurity.h | 4 +++- headers/modsecurity/rules.h | 3 ++- src/audit_log.cc | 5 +++++ src/audit_log.h | 18 +++++++++++++++++- src/audit_log_writer.cc | 1 + src/audit_log_writer.h | 10 ++++++++-- src/audit_log_writer_parallel.cc | 5 ----- src/audit_log_writer_parallel.h | 14 +++++++++++++- src/audit_log_writer_serial.cc | 10 +++++----- src/audit_log_writer_serial.h | 17 +++++++++++++++-- src/modsecurity.cc | 16 ++++++++++++++++ src/rules.cc | 12 ++++++++++++ 13 files changed, 100 insertions(+), 18 deletions(-) diff --git a/examples/simple_example_using_c/test.c b/examples/simple_example_using_c/test.c index 4d49a75b..d52da59d 100644 --- a/examples/simple_example_using_c/test.c +++ b/examples/simple_example_using_c/test.c @@ -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; } diff --git a/headers/modsecurity/modsecurity.h b/headers/modsecurity/modsecurity.h index 0016707d..2468fb95 100644 --- a/headers/modsecurity/modsecurity.h +++ b/headers/modsecurity/modsecurity.h @@ -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 } diff --git a/headers/modsecurity/rules.h b/headers/modsecurity/rules.h index 524db232..06e8d231 100644 --- a/headers/modsecurity/rules.h +++ b/headers/modsecurity/rules.h @@ -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 } diff --git a/src/audit_log.cc b/src/audit_log.cc index b9d6a903..a051d041 100644 --- a/src/audit_log.cc +++ b/src/audit_log.cc @@ -34,6 +34,11 @@ namespace ModSecurity { +AuditLog::~AuditLog() { + m_writer->refCountDecreaseAndCheck(); +} + + bool AuditLog::setStorageDirMode(int permission) { this->directoryPermission = permission; return true; diff --git a/src/audit_log.h b/src/audit_log.h index 1f6cfdf0..e8650d73 100644 --- a/src/audit_log.h +++ b/src/audit_log.h @@ -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 diff --git a/src/audit_log_writer.cc b/src/audit_log_writer.cc index 7a797051..b6bf59cf 100644 --- a/src/audit_log_writer.cc +++ b/src/audit_log_writer.cc @@ -38,4 +38,5 @@ bool AuditLogWriter::write(Assay *assay, int parts) { return true; } + } // namespace ModSecurity diff --git a/src/audit_log_writer.h b/src/audit_log_writer.h index c7a470a5..885d97f8 100644 --- a/src/audit_log_writer.h +++ b/src/audit_log_writer.h @@ -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 diff --git a/src/audit_log_writer_parallel.cc b/src/audit_log_writer_parallel.cc index f515df69..92695374 100644 --- a/src/audit_log_writer_parallel.cc +++ b/src/audit_log_writer_parallel.cc @@ -69,11 +69,6 @@ bool AuditLogWriterParallel::init() { } -bool AuditLogWriterParallel::close() { - return true; -} - - bool AuditLogWriterParallel::write(Assay *assay, int parts) { FILE *fp; int fd; diff --git a/src/audit_log_writer_parallel.h b/src/audit_log_writer_parallel.h index 90d21ee6..5f309713 100644 --- a/src/audit_log_writer_parallel.h +++ b/src/audit_log_writer_parallel.h @@ -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 diff --git a/src/audit_log_writer_serial.cc b/src/audit_log_writer_serial.cc index 90a7df2a..78c2c746 100644 --- a/src/audit_log_writer_serial.cc +++ b/src/audit_log_writer_serial.cc @@ -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 diff --git a/src/audit_log_writer_serial.h b/src/audit_log_writer_serial.h index baffca3e..197dd4c7 100644 --- a/src/audit_log_writer_serial.h +++ b/src/audit_log_writer_serial.h @@ -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; }; diff --git a/src/modsecurity.cc b/src/modsecurity.cc index 3fde10d5..f7ede7b9 100644 --- a/src/modsecurity.cc +++ b/src/modsecurity.cc @@ -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 diff --git a/src/rules.cc b/src/rules.cc index 0b3b6584..367bf539 100644 --- a/src/rules.cc +++ b/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