From c40cd77852062aef1895e75bfea1e72e811652f5 Mon Sep 17 00:00:00 2001 From: "sanghyeok.oh" Date: Thu, 15 Mar 2018 18:11:23 +0900 Subject: [PATCH] naive_policy_db: remove try-catch * dlopen deadlock issue Both dlopen and internal try{}catch for stl::map.at() are trying to acquire 'global lock' Change-Id: I185b3aea9964cb1eb0a87a0f00bce9ec15633315 Signed-off-by: sanghyeok.oh --- src/internal/naive_policy_db.cpp | 120 +++++++++++++++++++++++---------------- 1 file changed, 72 insertions(+), 48 deletions(-) diff --git a/src/internal/naive_policy_db.cpp b/src/internal/naive_policy_db.cpp index 304cdf2..f1b3d2b 100755 --- a/src/internal/naive_policy_db.cpp +++ b/src/internal/naive_policy_db.cpp @@ -194,37 +194,49 @@ bool NaivePolicyDb::getPolicySR(const NaivePolicyDb::PolicyTypeSetSR& set, const PolicyTypeValue policy_type_value, const NaivePolicyDb::PolicySR*& policy) const { + std::map::const_iterator it; + if (tslog::enabled()) std::cout << "---policy_type ="; - try { - switch (policy_type) { - case PolicyType::CONTEXT: - if (tslog::enabled()) - std::cout << "CONTEXT =" << (int)policy_type_value.context << std::endl; - policy = &set.context[static_cast(policy_type_value.context) ]; - return true; - case PolicyType::USER: - if (tslog::enabled()) - std::cout << "USER =" << (int)policy_type_value.user << std::endl; - policy = &set.user.at(policy_type_value.user); - return true; - case PolicyType::GROUP: - if (tslog::enabled()) - std::cout << "GROUP = " << (int)policy_type_value.group << std::endl; - policy = &set.group.at(policy_type_value.group); - return true; + + switch (policy_type) { + case PolicyType::CONTEXT: + if (tslog::enabled()) + std::cout << "CONTEXT =" << (int)policy_type_value.context << std::endl; + policy = &set.context[static_cast(policy_type_value.context)]; + return true; + case PolicyType::USER: + if (tslog::enabled()) + std::cout << "USER =" << (int)policy_type_value.user << std::endl; + + it = set.user.find(policy_type_value.user); + if (it == set.user.end()) { + if (tslog::verbose()) + std::cout << "GetPolicy: Out of Range exception\n"; + return false; } - } catch (std::out_of_range&) - { - if (tslog::verbose()) - std::cout << "GetPolicy: Out of Range exception\n"; + policy = &(it->second); + return true; + case PolicyType::GROUP: + if (tslog::enabled()) + std::cout << "GROUP = " << (int)policy_type_value.group << std::endl; + + it = set.group.find(policy_type_value.group); + if (it == set.group.end()) { + if (tslog::verbose()) + std::cout << "GetPolicy: Out of Range exception\n"; + return false; + } + policy = &(it->second); + return true; + default: + if (tslog::enabled()) + std::cout << "NO POLICY\n"; } - if (tslog::enabled()) - std::cout << "NO POLICY\n"; + return false; } - void NaivePolicyDb::addItem(NaivePolicyDb::PolicyTypeSetSR& set, const PolicyType policy_type, const PolicyTypeValue policy_type_value, @@ -248,37 +260,49 @@ bool NaivePolicyDb::getPolicyOwn(const NaivePolicyDb::PolicyTypeSetOwn& set, const PolicyTypeValue policy_type_value, const NaivePolicyDb::PolicyOwn*& policy) const { + std::map::const_iterator it; + if (tslog::enabled()) std::cout << "---policy_type ="; - try { - switch (policy_type) { - case PolicyType::CONTEXT: - if (tslog::enabled()) - std::cout << "CONTEXT =" << (int)policy_type_value.context << std::endl; - policy = &set.context[static_cast(policy_type_value.context) ]; - return true; - case PolicyType::USER: - if (tslog::enabled()) - std::cout << "USER =" << (int)policy_type_value.user << std::endl; - policy = &set.user.at(policy_type_value.user); - return true; - case PolicyType::GROUP: - if (tslog::enabled()) - std::cout << "GROUP = " << (int)policy_type_value.group << std::endl; - policy = &set.group.at(policy_type_value.group); - return true; + + switch (policy_type) { + case PolicyType::CONTEXT: + if (tslog::enabled()) + std::cout << "CONTEXT =" << (int)policy_type_value.context << std::endl; + policy = &set.context[static_cast(policy_type_value.context)]; + return true; + case PolicyType::USER: + if (tslog::enabled()) + std::cout << "USER =" << (int)policy_type_value.user << std::endl; + + it = set.user.find(policy_type_value.user); + if (it == set.user.end()) { + if (tslog::verbose()) + std::cout << "GetPolicy: Out of Range exception\n"; + return false; } - } catch (std::out_of_range&) - { - if (tslog::verbose()) - std::cout << "GetPolicy: Out of Range exception\n"; + policy = &(it->second); + return true; + case PolicyType::GROUP: + if (tslog::enabled()) + std::cout << "GROUP = " << (int)policy_type_value.group << std::endl; + + it = set.group.find(policy_type_value.group); + if (it == set.group.end()) { + if (tslog::verbose()) + std::cout << "GetPolicy: Out of Range exception\n"; + return false; + } + policy = &(it->second); + return true; + default: + if (tslog::enabled()) + std::cout << "NO POLICY\n"; } - if (tslog::enabled()) - std::cout << "NO POLICY\n"; + return false; } - void NaivePolicyDb::addItem(NaivePolicyDb::PolicyTypeSetOwn& set, const PolicyType policy_type, const PolicyTypeValue policy_type_value, -- 2.7.4