/*
- * Copyright (c) 2015-2019 Samsung Electronics Co., Ltd All Rights Reserved
+ * Copyright (c) 2015-2020 Samsung Electronics Co., Ltd. All rights reserved
*
* Contact: Rafal Krypa <r.krypa@samsung.com>
*
bool CheckProperDrop::checkThreads()
{
-#define REPORT_THREAD_ERROR(TID, NAME, VAL1, VAL2) { \
- LogError("Invalid value of " << (NAME) << " for thread " << (TID) << ". " \
- << "Process has " << (VAL1) << ", thread has " << (VAL2) << ". " \
- << "Application candidate process not prepared properly for launch. " \
- << (NAME) << " values should be same for all threads."); \
- return false; \
-}
-
-#define CHECK_THREAD_CRED_FIELD(P, T, FIELD) { \
- int pval = (P)->FIELD, tval = (T)->FIELD; \
- if (pval != tval) \
- REPORT_THREAD_ERROR((T)->tid, #FIELD, pval, tval); \
-}
-
-#define CHECK_THREAD_CRED_FIELD_LONG(P, T, FIELD) { \
- long pval = (P)->FIELD, tval = (T)->FIELD; \
- if (pval != tval) \
- REPORT_THREAD_ERROR((T)->tid, #FIELD, pval, tval); \
-}
-
-
std::string smackProc = SmackLabels::getSmackLabelFromPid(m_pid);
auto capProcPtr = makeUnique(cap_get_pid(m_pid), cap_free);
"Unable to get capabilities for " << m_pid);
for (const auto &thread : m_threads) {
+
+ #define REPORT_THREAD_ERROR(NAME, VAL1, VAL2) do { \
+ LogError("Invalid value of " << (NAME) << " for thread " << thread->tid << ". " \
+ << "Process has " << (VAL1) << ", thread has " << (VAL2) << ". " \
+ << "Application candidate process not prepared properly for launch. " \
+ << (NAME) << " values should be same for all threads."); \
+ return false; \
+ } while (0)
+
auto capThreadPtr = makeUnique(cap_get_pid(thread->tid), cap_free);
if (!capThreadPtr)
ThrowMsg(Exception::CapError,
if (!capStrThreadPtr)
ThrowMsg(Exception::CapError, "Unable to get capabilities for " << thread->tid);
- REPORT_THREAD_ERROR(thread->tid, "capabilities",
- capProcStrPtr.get(), capStrThreadPtr.get());
+ REPORT_THREAD_ERROR("capabilities", capProcStrPtr.get(), capStrThreadPtr.get());
}
std::string smackThread = SmackLabels::getSmackLabelFromPid(thread->tid);
if (smackProc != smackThread)
- REPORT_THREAD_ERROR(thread->tid, "Smack label",
- smackProc, smackThread);
+ REPORT_THREAD_ERROR("Smack label", smackProc, smackThread);
if (m_proc->supgid && thread->supgid) {
if (strcmp(m_proc->supgid, thread->supgid))
- REPORT_THREAD_ERROR(thread->tid, "Supplementary groups",
- m_proc->supgid, thread->supgid);
+ REPORT_THREAD_ERROR("Supplementary groups", m_proc->supgid, thread->supgid);
} else {
if (m_proc->supgid != thread->supgid)
- REPORT_THREAD_ERROR(thread->tid, "Supplementary groups",
- m_proc->supgid ? m_proc->supgid : "<NULL>",
- thread->supgid ? thread->supgid : "<NULL>");
+ REPORT_THREAD_ERROR("Supplementary groups",
+ m_proc->supgid ? m_proc->supgid : "<NULL>",
+ thread->supgid ? thread->supgid : "<NULL>");
}
- CHECK_THREAD_CRED_FIELD(m_proc, thread, euid);
- CHECK_THREAD_CRED_FIELD(m_proc, thread, egid);
- CHECK_THREAD_CRED_FIELD(m_proc, thread, ruid);
- CHECK_THREAD_CRED_FIELD(m_proc, thread, rgid);
- CHECK_THREAD_CRED_FIELD(m_proc, thread, suid);
- CHECK_THREAD_CRED_FIELD(m_proc, thread, sgid);
- CHECK_THREAD_CRED_FIELD(m_proc, thread, fuid);
- CHECK_THREAD_CRED_FIELD(m_proc, thread, fgid);
- CHECK_THREAD_CRED_FIELD_LONG(m_proc, thread, ns[IPCNS]);
- CHECK_THREAD_CRED_FIELD_LONG(m_proc, thread, ns[MNTNS]);
- CHECK_THREAD_CRED_FIELD_LONG(m_proc, thread, ns[NETNS]);
- CHECK_THREAD_CRED_FIELD_LONG(m_proc, thread, ns[PIDNS]);
- CHECK_THREAD_CRED_FIELD_LONG(m_proc, thread, ns[USERNS]);
- CHECK_THREAD_CRED_FIELD_LONG(m_proc, thread, ns[UTSNS]);
+ #define CHECK_THREAD_CRED_FIELD(FIELD) do { \
+ const auto pval = m_proc->FIELD, tval = thread->FIELD; \
+ if (pval != tval) \
+ REPORT_THREAD_ERROR(#FIELD, pval, tval); \
+ } while (0)
+
+ CHECK_THREAD_CRED_FIELD(euid);
+ CHECK_THREAD_CRED_FIELD(egid);
+ CHECK_THREAD_CRED_FIELD(ruid);
+ CHECK_THREAD_CRED_FIELD(rgid);
+ CHECK_THREAD_CRED_FIELD(suid);
+ CHECK_THREAD_CRED_FIELD(sgid);
+ CHECK_THREAD_CRED_FIELD(fuid);
+ CHECK_THREAD_CRED_FIELD(fgid);
+ CHECK_THREAD_CRED_FIELD(ns[IPCNS]);
+ CHECK_THREAD_CRED_FIELD(ns[MNTNS]);
+ CHECK_THREAD_CRED_FIELD(ns[NETNS]);
+ CHECK_THREAD_CRED_FIELD(ns[PIDNS]);
+ CHECK_THREAD_CRED_FIELD(ns[USERNS]);
+ CHECK_THREAD_CRED_FIELD(ns[UTSNS]);
+
+ #undef CHECK_THREAD_CRED_FIELD
+ #undef REPORT_THREAD_ERROR
}
return true;