From 1e961ec457d48198118bbff42204d668d714bccb Mon Sep 17 00:00:00 2001 From: Konrad Lipinski Date: Mon, 7 Nov 2016 19:03:53 +0100 Subject: [PATCH] circumvent destruction of ::policy_checker, remove destructors that are empty or never called Motivated by KONA bugs (ex. DF161028-00875). VD product environment apparently likes calling libdbuspolicy1 public functions while exit handlers are being called (and thus global objects are being destroyed). Solution: circumvent destruction of relevant globals altogether. Change-Id: Ibeab05ed83cc24dc6a5da926fb542f31d8a33af1 --- src/internal/internal.cpp | 8 ++++---- src/internal/naive_policy_checker.cpp | 2 +- src/internal/naive_policy_checker.hpp | 14 +++++++++++++- src/internal/naive_policy_db.cpp | 7 ------- src/internal/naive_policy_db.hpp | 3 --- src/internal/policy.cpp | 5 +---- src/internal/policy.hpp | 1 - 7 files changed, 19 insertions(+), 21 deletions(-) diff --git a/src/internal/internal.cpp b/src/internal/internal.cpp index 12c54fa..fb2676f 100644 --- a/src/internal/internal.cpp +++ b/src/internal/internal.cpp @@ -82,7 +82,7 @@ int __internal_can_send(bool bus_type, std::cout << "Destination too long: " << destination << std::endl; return false; } - return static_cast(policy_checker.check(bus_type, user, group, label, matcher, ldp_xml_parser::ItemType::SEND)); + return static_cast(policy_checker().check(bus_type, user, group, label, matcher, ldp_xml_parser::ItemType::SEND)); } int __internal_can_send_multi_dest(bool bus_type, @@ -101,7 +101,7 @@ int __internal_can_send_multi_dest(bool bus_type, while (destination[i]) { matcher.addName(destination[i++]); } - return static_cast(policy_checker.check(bus_type, user, group, label, matcher, ldp_xml_parser::ItemType::SEND)); + return static_cast(policy_checker().check(bus_type, user, group, label, matcher, ldp_xml_parser::ItemType::SEND)); } int __internal_can_recv(bool bus_type, @@ -120,7 +120,7 @@ int __internal_can_recv(bool bus_type, std::cout << "Sender too long: " << sender << std::endl; return false; } - return static_cast(policy_checker.check(bus_type, user, group, label, matcher, ldp_xml_parser::ItemType::RECEIVE)); + return static_cast(policy_checker().check(bus_type, user, group, label, matcher, ldp_xml_parser::ItemType::RECEIVE)); } int __internal_can_own(bool bus_type, @@ -129,5 +129,5 @@ int __internal_can_own(bool bus_type, const char* const label, const char* const service) { - return static_cast(policy_checker.check(bus_type, user, group, label, service)); + return static_cast(policy_checker().check(bus_type, user, group, label, service)); } diff --git a/src/internal/naive_policy_checker.cpp b/src/internal/naive_policy_checker.cpp index 2fd0b4a..0c7cb71 100644 --- a/src/internal/naive_policy_checker.cpp +++ b/src/internal/naive_policy_checker.cpp @@ -9,7 +9,7 @@ using namespace ldp_xml_parser; -ldp_xml_parser::NaivePolicyChecker policy_checker; +DEF_NODESTRUCT_GLOBAL(ldp_xml_parser::NaivePolicyChecker, policy_checker) static void __log_item(const MatchItemSR& item) { diff --git a/src/internal/naive_policy_checker.hpp b/src/internal/naive_policy_checker.hpp index 3471cae..2e330ee 100644 --- a/src/internal/naive_policy_checker.hpp +++ b/src/internal/naive_policy_checker.hpp @@ -154,6 +154,18 @@ namespace ldp_xml_parser }; } -extern ldp_xml_parser::NaivePolicyChecker policy_checker; +/** Declare a global variable that is constructed (via gcc's __attribute__((constructor))) but never destroyed. */ +#define DCL_NODESTRUCT_GLOBAL(TYPE,NAME)\ + namespace detail_NODESTRUCT_GLOBAL { alignas(TYPE) extern uint8_t NAME[sizeof(TYPE)]; }\ + /* awkwardly written to silence gcc's -Wstrict-aliasing because _Pragma("GCC diagnostic ignored \"-Wstrict-aliasing\"") is bugged */\ + static inline TYPE &NAME() { auto p = static_cast(&detail_NODESTRUCT_GLOBAL::NAME[0]); return *reinterpret_cast(p); }\ + namespace detailInit_NODESTRUCT_GLOBAL { __attribute__((constructor)) static void NAME() { new(&::NAME()) TYPE(); } } + +/** Define a global variable that is constructed (via gcc's __attribute__((constructor))) but never destroyed. */ +#define DEF_NODESTRUCT_GLOBAL(TYPE,NAME)\ + namespace detail_NODESTRUCT_GLOBAL { alignas(TYPE) uint8_t NAME[sizeof(TYPE)]; } + + +DCL_NODESTRUCT_GLOBAL(ldp_xml_parser::NaivePolicyChecker, policy_checker) #endif diff --git a/src/internal/naive_policy_db.cpp b/src/internal/naive_policy_db.cpp index 74783d2..e213c70 100644 --- a/src/internal/naive_policy_db.cpp +++ b/src/internal/naive_policy_db.cpp @@ -11,9 +11,6 @@ using namespace ldp_xml_parser; -NaivePolicyDb::~NaivePolicyDb() { -} - NaivePolicyDb::PolicyOwn::PolicyOwn(){ treeRootPtr = new struct TreeNode; treeRootPtr->__decisionItem = {Decision::ANY, NULL}; @@ -24,10 +21,6 @@ NaivePolicyDb::PolicyOwn::PolicyOwn(){ } } -NaivePolicyDb::PolicyOwn::~PolicyOwn(){ - nodeRemove(&treeRootPtr); -} - void NaivePolicyDb::PolicyOwn::nodeRemove(TreeNode **node){ if (!*node) { return; diff --git a/src/internal/naive_policy_db.hpp b/src/internal/naive_policy_db.hpp index 7162d91..d4bf231 100644 --- a/src/internal/naive_policy_db.hpp +++ b/src/internal/naive_policy_db.hpp @@ -73,7 +73,6 @@ namespace ldp_xml_parser void nodeRemove(TreeNode **node); public: PolicyOwn(); - ~PolicyOwn(); /** Adds given item to tree by retrieving its name, decision and checking is it prefix. * \param[in] item Item to add to policy */ @@ -85,8 +84,6 @@ namespace ldp_xml_parser const TreeNode* getTreeRoot() const; }; - ~NaivePolicyDb(); - /** Gets policy with ownership rules from DB * \param[in] policy_type Policy type * \param[in] policy_type_value Policy type value diff --git a/src/internal/policy.cpp b/src/internal/policy.cpp index 752750f..d4ab166 100644 --- a/src/internal/policy.cpp +++ b/src/internal/policy.cpp @@ -183,7 +183,7 @@ void DbAdapter::xmlTraversal(bool bus, xmlTraversal(bus, v.second, t, policy_type, policy_type_value, attr, level + 1); } if (!pt.empty() && level > 1) - __builder.generateItem(policy_checker.db(bus), policy_type, policy_type_value); + __builder.generateItem(policy_checker().db(bus), policy_type, policy_type_value); } } @@ -265,9 +265,6 @@ MatchItemSR::MatchItemSR(const char* i, const char* me, const char* p, MessageTy : names_num(0), interface(i), member(me), path(p), type(t), direction(d) { } -MatchItemSR::~MatchItemSR(){ -} - void MatchItemSR::addName(const char* name) { names[names_num++] = NameSR(name, std::strlen(name)); } diff --git a/src/internal/policy.hpp b/src/internal/policy.hpp index 5f4d84f..344c841 100644 --- a/src/internal/policy.hpp +++ b/src/internal/policy.hpp @@ -176,7 +176,6 @@ namespace ldp_xml_parser MessageType type; MessageDirection direction; MatchItemSR(const char* i = NULL, const char* me = NULL, const char* p = NULL, MessageType t = MessageType::ANY, MessageDirection d = MessageDirection::ANY); - ~MatchItemSR(); void addName(const char* name); bool addNames(const char* name); const char* toString(char* str) const; -- 2.7.4