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 daab147b9386f2cb8e27d1fce4cee9cbc6e15bd7..ee08c7ebedf5f95d64aca528ecabb3793a759fa2 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 2937376bba72861a455a3cd982a63f9e193c9dc9..47b11041bc5d6bf8edc2a1fcc59f124d98c340ee 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: "