circumvent destruction of ::policy_checker, remove destructors that are empty or... 17/96517/1 submit/tizen_3.0/20161109.081209
authorKonrad Lipinski <konrad.l@samsung.com>
Mon, 7 Nov 2016 18:03:53 +0000 (19:03 +0100)
committerHyotaek Shim <hyotaek.shim@samsung.com>
Wed, 9 Nov 2016 07:56:20 +0000 (23:56 -0800)
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
(cherry picked from commit 1e961ec457d48198118bbff42204d668d714bccb)

src/internal/internal.cpp
src/internal/naive_policy_checker.cpp
src/internal/naive_policy_checker.hpp
src/internal/naive_policy_db.cpp
src/internal/naive_policy_db.hpp
src/internal/policy.cpp
src/internal/policy.hpp

index 12c54fa..fb2676f 100644 (file)
@@ -82,7 +82,7 @@ int __internal_can_send(bool bus_type,
                        std::cout << "Destination too long: " << destination << std::endl;
                return false;
        }
-       return static_cast<int>(policy_checker.check(bus_type, user, group, label, matcher, ldp_xml_parser::ItemType::SEND));
+       return static_cast<int>(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<int>(policy_checker.check(bus_type, user, group, label, matcher, ldp_xml_parser::ItemType::SEND));
+       return static_cast<int>(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<int>(policy_checker.check(bus_type, user, group, label, matcher, ldp_xml_parser::ItemType::RECEIVE));
+       return static_cast<int>(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<int>(policy_checker.check(bus_type, user, group, label, service));
+       return static_cast<int>(policy_checker().check(bus_type, user, group, label, service));
 }
index 2fd0b4a..0c7cb71 100644 (file)
@@ -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)
 {
index 3471cae..2e330ee 100644 (file)
@@ -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<void*>(&detail_NODESTRUCT_GLOBAL::NAME[0]); return *reinterpret_cast<TYPE*>(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
index 74783d2..e213c70 100644 (file)
@@ -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;
index 7162d91..d4bf231 100644 (file)
@@ -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
index 752750f..d4ab166 100644 (file)
@@ -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));
 }
index 5f4d84f..344c841 100644 (file)
@@ -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;