From: Lukasz Wojciechowski Date: Thu, 13 Nov 2014 14:02:23 +0000 (+0100) Subject: Fix potential segfaults if assert won't throw X-Git-Tag: security-manager_5.5_testing~178 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=a0896f6616079ab3120e4a251666096efaa5108c;p=platform%2Fcore%2Ftest%2Fsecurity-tests.git Fix potential segfaults if assert won't throw Prepare code for assertions that won't throw an exception even if condition check fails. Such situation can happen, when when exception would have been thrown during stack unwinding after another exception. Change-Id: Icb44b0e5e51bcb9b7f23fcc270d2e60eab4ecc1e --- diff --git a/tests/cynara-tests/common/cynara_test_client_async_request_monitor.cpp b/tests/cynara-tests/common/cynara_test_client_async_request_monitor.cpp index daab147b..ee08c7eb 100644 --- a/tests/cynara-tests/common/cynara_test_client_async_request_monitor.cpp +++ b/tests/cynara-tests/common/cynara_test_client_async_request_monitor.cpp @@ -54,39 +54,47 @@ void RequestMonitor::updateResponse(cynara_check_id checkId, cynara_async_call_c int response, void *data) { RequestMonitor *monitor = reinterpret_cast(data); - RUNNER_ASSERT_MSG(monitor != nullptr, - "Bad user data (nullptr) in response callback."); + if (!monitor) { + RUNNER_FAIL_MSG("Bad user data (nullptr) in response callback."); + return; + } auto it = monitor->m_requests.find(checkId); - RUNNER_ASSERT_MSG(it != monitor->m_requests.end(), - "Received unexpected callback for request:" - << "id = " << checkId << "," - << "response = " << response << "," - << "cause = " << cause << "."); + if (it == monitor->m_requests.end()) { + RUNNER_FAIL_MSG("Received unexpected callback for request:" + << "id = " << checkId << "," + << "response = " << response << "," + << "cause = " << cause << "."); + return; + } - RUNNER_ASSERT_MSG(cause == it->second.m_expectedCause, + //save request data and remove request from monitored requests + auto expectedResponse = it->second.m_expectedResponse; + auto expectedCause = it->second.m_expectedCause; + auto userFunction = it->second.m_userFunction; + monitor->m_requests.erase(it); + + RUNNER_ASSERT_MSG(cause == expectedCause, "Unexpected cause in response callback:" << "id = " << checkId << "," << "received response = " << response << "," - << "expected response = " << it->second.m_expectedResponse << "," + << "expected response = " << expectedResponse << "," << "received cause = " << cause << "," - << "expected cause = " << it->second.m_expectedCause << "."); + << "expected cause = " << expectedCause << "."); if (cause == CYNARA_CALL_CAUSE_ANSWER) { - RUNNER_ASSERT_MSG(response == it->second.m_expectedResponse, + RUNNER_ASSERT_MSG(response == expectedResponse, "Unexpected response in response callback:" << "id = " << checkId << "," << "received response = " << response << "," - << "expected response = " << it->second.m_expectedResponse << "," + << "expected response = " << expectedResponse << "," << "received cause = " << cause << "," - << "expected cause = " << it->second.m_expectedCause << "."); + << "expected cause = " << expectedCause << "."); } - if (it->second.m_userFunction) - it->second.m_userFunction(); - - monitor->m_requests.erase(it); + if (userFunction) + userFunction(); } }// namespace CynaraTestClientAsync diff --git a/tests/cynara-tests/common/cynara_test_client_async_status_monitor.cpp b/tests/cynara-tests/common/cynara_test_client_async_status_monitor.cpp index 2937376b..47b11041 100644 --- a/tests/cynara-tests/common/cynara_test_client_async_status_monitor.cpp +++ b/tests/cynara-tests/common/cynara_test_client_async_status_monitor.cpp @@ -28,8 +28,10 @@ StatusMonitor::StatusMonitor() void StatusMonitor::updateStatus(int oldFd, int newFd, cynara_async_status status, void *data) { StatusMonitor *monitor = reinterpret_cast(data); - RUNNER_ASSERT_MSG(monitor != nullptr, - "Bad user data (nullptr) in status callback."); + if (!monitor) { + RUNNER_FAIL_MSG("Bad user data (nullptr) in status callback."); + return; + } RUNNER_ASSERT_MSG(monitor->m_fd == oldFd, "fd value mismatch: "