Fix potential segfaults if assert won't throw 79/30279/5
authorLukasz Wojciechowski <l.wojciechow@partner.samsung.com>
Thu, 13 Nov 2014 14:02:23 +0000 (15:02 +0100)
committerLukasz Wojciechowski <l.wojciechow@partner.samsung.com>
Sat, 6 Dec 2014 01:03:14 +0000 (02:03 +0100)
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

tests/cynara-tests/common/cynara_test_client_async_request_monitor.cpp
tests/cynara-tests/common/cynara_test_client_async_status_monitor.cpp

index daab147..ee08c7e 100644 (file)
@@ -54,39 +54,47 @@ void RequestMonitor::updateResponse(cynara_check_id checkId, cynara_async_call_c
                                     int response, void *data)
 {
     RequestMonitor *monitor = reinterpret_cast<RequestMonitor*>(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
index 2937376..47b1104 100644 (file)
@@ -28,8 +28,10 @@ StatusMonitor::StatusMonitor()
 void StatusMonitor::updateStatus(int oldFd, int newFd, cynara_async_status status, void *data)
 {
     StatusMonitor *monitor = reinterpret_cast<StatusMonitor*>(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: "