cynara integration: create deferred message only when it's not already created 09/244109/1
authorAdrian Szyndela <adrian.s@samsung.com>
Mon, 7 Sep 2020 12:54:34 +0000 (14:54 +0200)
committerAdrian Szyndela <adrian.s@samsung.com>
Tue, 15 Sep 2020 06:05:24 +0000 (08:05 +0200)
This will allow altering existing deferred messages, enabling
concurrent asynchronous cynara checks for SEND and RECEIVE.

Change-Id: I1f31c173e4229661bca9f14ecaa158ee67342db4

bus/cynara.c

index 8d4d50a1374725d28830b2e5e8ba287e4e137a83..98255cd5f10abc8abc1242154691124978d1972a 100644 (file)
@@ -153,6 +153,9 @@ bus_cynara_check_privilege (BusCynara *cynara,
 
   _dbus_assert(connection != NULL);
 
+  if (deferred_message_param)
+    deferred_message = *deferred_message_param;
+
   if (dbus_connection_get_unix_user(connection, &uid) == FALSE)
       return BUS_RESULT_FALSE;
 
@@ -189,14 +192,21 @@ bus_cynara_check_privilege (BusCynara *cynara,
     break;
 
   case CYNARA_API_CACHE_MISS:
-     deferred_message = bus_deferred_message_new(message, sender, addressed_recipient,
-         proposed_recipient, BUS_RESULT_LATER);
-     if (deferred_message == NULL)
-       {
-         _dbus_verbose("Failed to allocate memory for deferred message\n");
-         return_result = BUS_RESULT_FALSE;
-         break;
-       }
+    if (deferred_message == NULL)
+      {
+         deferred_message = bus_deferred_message_new(message, sender, addressed_recipient,
+             proposed_recipient, BUS_RESULT_LATER);
+         if (deferred_message == NULL)
+           {
+             _dbus_verbose("Failed to allocate memory for deferred message\n");
+             return_result = BUS_RESULT_FALSE;
+             break;
+           }
+      }
+    else
+      {
+        bus_deferred_message_ref(deferred_message);
+      }
 
     /* callback is supposed to unref deferred_message*/
     result = cynara_async_create_request(cynara->cynara, label, session_id, user, privilege, &check_id,