bus/policy: reduce number of params in check_ functions
authorAdrian Szyndela <adrian.s@samsung.com>
Wed, 20 May 2020 12:17:33 +0000 (14:17 +0200)
committerAdrian Szyndela <adrian.s@samsung.com>
Tue, 23 Jun 2020 08:09:38 +0000 (10:09 +0200)
No functional changes, just packed arguments to structs.

Change-Id: I0e5a22a208ba7085727e617c52cd061c39524967

bus/policy.c

index 5e3ab2e..fdd85f7 100644 (file)
@@ -858,14 +858,18 @@ bus_policy_rule_to_string (BusPolicyRule *rule,
   return TRUE;
 }
 
+struct MatchSendRuleParams {
+  BusRegistry    *registry;
+  dbus_bool_t     requested_reply;
+  DBusConnection *receiver;
+  DBusMessage    *message;
+};
+
 static dbus_bool_t
 check_send_rule (const BusPolicyRule  *rule,
-                 BusRegistry          *registry,
-                 dbus_bool_t           requested_reply,
-                 DBusConnection       *receiver,
-                 DBusMessage          *message,
-                 BusResult            *result,
-                 const char          **privilege)
+                 const struct MatchSendRuleParams *match_params,
+                 BusResult      *result,
+                 const char    **privilege)
 {
   /* Rule is skipped if it specifies a different
    * message name from the message, or a different
@@ -879,7 +883,7 @@ check_send_rule (const BusPolicyRule  *rule,
 
   if (rule->d.send.message_type != DBUS_MESSAGE_TYPE_INVALID)
     {
-      if (dbus_message_get_type (message) != rule->d.send.message_type)
+      if (dbus_message_get_type (match_params->message) != rule->d.send.message_type)
         {
           _dbus_verbose ("  (policy) skipping rule for different message type\n");
           return FALSE;
@@ -887,13 +891,13 @@ check_send_rule (const BusPolicyRule  *rule,
     }
 
   /* If it's a reply, the requested_reply flag kicks in */
-  if (dbus_message_get_reply_serial (message) != 0)
+  if (dbus_message_get_reply_serial (match_params->message) != 0)
     {
       /* for allow or check requested_reply=true means the rule applies
        * only when reply was requested. requested_reply=false means the
        * rule always applies
        */
-      if (!requested_reply && rule->access != BUS_POLICY_RULE_ACCESS_DENY && rule->d.send.requested_reply && !rule->d.send.eavesdrop)
+      if (!match_params->requested_reply && rule->access != BUS_POLICY_RULE_ACCESS_DENY && rule->d.send.requested_reply && !rule->d.send.eavesdrop)
         {
           _dbus_verbose ("  (policy) skipping %s rule since it only applies to requested replies and does not allow eavesdropping\n",
               rule->access == BUS_POLICY_RULE_ACCESS_ALLOW ? "allow" : "check");
@@ -904,7 +908,7 @@ check_send_rule (const BusPolicyRule  *rule,
        * when the reply was not requested. requested_reply=true means the
        * rule always applies.
        */
-      if (requested_reply && rule->access == BUS_POLICY_RULE_ACCESS_DENY && !rule->d.send.requested_reply)
+      if (match_params->requested_reply && rule->access == BUS_POLICY_RULE_ACCESS_DENY && !rule->d.send.requested_reply)
         {
           _dbus_verbose ("  (policy) skipping deny rule since it only applies to unrequested replies\n");
           return FALSE;
@@ -913,8 +917,8 @@ check_send_rule (const BusPolicyRule  *rule,
 
   if (rule->d.send.path != NULL)
     {
-      if (dbus_message_get_path (message) != NULL &&
-          strcmp (dbus_message_get_path (message),
+      if (dbus_message_get_path (match_params->message) != NULL &&
+          strcmp (dbus_message_get_path (match_params->message),
                   rule->d.send.path) != 0)
         {
           _dbus_verbose ("  (policy) skipping rule for different path\n");
@@ -933,11 +937,11 @@ check_send_rule (const BusPolicyRule  *rule,
        */
       dbus_bool_t no_interface;
 
-      no_interface = dbus_message_get_interface (message) == NULL;
+      no_interface = dbus_message_get_interface (match_params->message) == NULL;
       
       if ((no_interface && rule->access != BUS_POLICY_RULE_ACCESS_DENY) ||
           (!no_interface &&
-           strcmp (dbus_message_get_interface (message),
+           strcmp (dbus_message_get_interface (match_params->message),
                    rule->d.send.interface) != 0))
         {
           _dbus_verbose ("  (policy) skipping rule for different interface\n");
@@ -947,8 +951,8 @@ check_send_rule (const BusPolicyRule  *rule,
 
   if (rule->d.send.member != NULL)
     {
-      if (dbus_message_get_member (message) != NULL &&
-          strcmp (dbus_message_get_member (message),
+      if (dbus_message_get_member (match_params->message) != NULL &&
+          strcmp (dbus_message_get_member (match_params->message),
                   rule->d.send.member) != 0)
         {
           _dbus_verbose ("  (policy) skipping rule for different member\n");
@@ -958,8 +962,8 @@ check_send_rule (const BusPolicyRule  *rule,
 
   if (rule->d.send.error != NULL)
     {
-      if (dbus_message_get_error_name (message) != NULL &&
-          strcmp (dbus_message_get_error_name (message),
+      if (dbus_message_get_error_name (match_params->message) != NULL &&
+          strcmp (dbus_message_get_error_name (match_params->message),
                   rule->d.send.error) != 0)
         {
           _dbus_verbose ("  (policy) skipping rule for different error name\n");
@@ -981,9 +985,9 @@ check_send_rule (const BusPolicyRule  *rule,
            * on the assumption that the activated service will have the
            * requested name and no others.
            */
-          if (receiver == NULL)
+          if (match_params->receiver == NULL)
             {
-              if (!dbus_message_has_destination (message,
+              if (!dbus_message_has_destination (match_params->message,
                                                  rule->d.send.destination))
                 {
                   _dbus_verbose ("  (policy) skipping rule because message dest is not %s\n",
@@ -998,7 +1002,7 @@ check_send_rule (const BusPolicyRule  *rule,
 
               _dbus_string_init_const (&str, rule->d.send.destination);
 
-              service = bus_registry_lookup (registry, &str);
+              service = bus_registry_lookup (match_params->registry, &str);
               if (service == NULL)
                 {
                   _dbus_verbose ("  (policy) skipping rule because dest %s doesn't exist\n",
@@ -1006,7 +1010,7 @@ check_send_rule (const BusPolicyRule  *rule,
                   return FALSE;
                 }
 
-              if (!bus_service_has_owner (service, receiver))
+              if (!bus_service_has_owner (service, match_params->receiver))
                 {
                   _dbus_verbose ("  (policy) skipping rule because dest %s isn't owned by receiver\n",
                                  rule->d.send.destination);
@@ -1017,9 +1021,9 @@ check_send_rule (const BusPolicyRule  *rule,
       else if (rule->d.send.destination_prefix)
         {
           /* receiver can be NULL - the same as in !send.destination_prefix */
-          if (receiver == NULL)
+          if (match_params->receiver == NULL)
             {
-              const char *destination = dbus_message_get_destination (message);
+              const char *destination = dbus_message_get_destination (match_params->message);
               DBusString dest_name;
 
               if (destination == NULL)
@@ -1041,7 +1045,7 @@ check_send_rule (const BusPolicyRule  *rule,
             }
           else
             {
-              if (!bus_connection_is_service_owner_by_prefix (receiver,
+              if (!bus_connection_is_service_owner_by_prefix (match_params->receiver,
                                                               rule->d.send.destination))
                 {
                   _dbus_verbose ("  (policy) skipping rule because no dest with prefix %s is owned by receiver\n",
@@ -1088,6 +1092,12 @@ bus_client_policy_check_can_send (DBusConnection      *sender,
   BusResult result;
   const char *privilege;
   BusPolicyRule *matched_rule = NULL;
+  struct MatchSendRuleParams params;
+
+  params.registry = registry;
+  params.requested_reply = requested_reply;
+  params.receiver = receiver;
+  params.message = message;
 
   /* policy->rules is in the order the rules appeared
    * in the config file, i.e. last rule that applies wins
@@ -1104,8 +1114,7 @@ bus_client_policy_check_can_send (DBusConnection      *sender,
 
       link = _dbus_list_get_next_link (&policy->rules, link);
 
-      if (check_send_rule (rule, registry, requested_reply, receiver, message,
-                           &result, &privilege))
+      if (check_send_rule (rule, &params, &result, &privilege))
         {
           *log = rule->d.send.log;
           (*toggles)++;
@@ -1142,15 +1151,19 @@ bus_client_policy_check_can_send (DBusConnection      *sender,
   return result;
 }
 
+struct MatchReceiveRuleParams {
+  BusRegistry    *registry;
+  dbus_bool_t     requested_reply;
+  DBusConnection *sender;
+  DBusMessage    *message;
+  dbus_bool_t     eavesdropping;
+};
+
 static dbus_bool_t
 check_receive_rule (const BusPolicyRule  *rule,
-                    BusRegistry          *registry,
-                    dbus_bool_t           requested_reply,
-                    DBusConnection       *sender,
-                    DBusMessage          *message,
-                    dbus_bool_t           eavesdropping,
-                    BusResult            *result,
-                    const char          **privilege)
+                    const struct MatchReceiveRuleParams *match_params,
+                    BusResult      *result,
+                    const char    **privilege)
 {
   if (rule->type != BUS_POLICY_RULE_RECEIVE)
     {
@@ -1160,7 +1173,7 @@ check_receive_rule (const BusPolicyRule  *rule,
 
   if (rule->d.receive.message_type != DBUS_MESSAGE_TYPE_INVALID)
     {
-      if (dbus_message_get_type (message) != rule->d.receive.message_type)
+      if (dbus_message_get_type (match_params->message) != rule->d.receive.message_type)
         {
           _dbus_verbose ("  (policy) skipping rule for different message type\n");
           return FALSE;
@@ -1171,7 +1184,7 @@ check_receive_rule (const BusPolicyRule  *rule,
   /* for allow or check, eavesdrop=false means the rule doesn't apply when
    * eavesdropping. eavesdrop=true means the rule always applies
    */
-  if (eavesdropping && rule->access != BUS_POLICY_RULE_ACCESS_DENY && !rule->d.receive.eavesdrop)
+  if (match_params->eavesdropping && rule->access != BUS_POLICY_RULE_ACCESS_DENY && !rule->d.receive.eavesdrop)
     {
       _dbus_verbose ("  (policy) skipping %s rule since it doesn't apply to eavesdropping\n",
           rule->access == BUS_POLICY_RULE_ACCESS_ALLOW ? "allow" : "check");
@@ -1181,20 +1194,20 @@ check_receive_rule (const BusPolicyRule  *rule,
   /* for deny, eavesdrop=true means the rule applies only when
    * eavesdropping; eavesdrop=false means always deny.
    */
-  if (!eavesdropping && rule->access == BUS_POLICY_RULE_ACCESS_DENY && rule->d.receive.eavesdrop)
+  if (!match_params->eavesdropping && rule->access == BUS_POLICY_RULE_ACCESS_DENY && rule->d.receive.eavesdrop)
     {
       _dbus_verbose ("  (policy) skipping deny rule since it only applies to eavesdropping\n");
       return FALSE;
     }
 
   /* If it's a reply, the requested_reply flag kicks in */
-  if (dbus_message_get_reply_serial (message) != 0)
+  if (dbus_message_get_reply_serial (match_params->message) != 0)
     {
       /* for allow or check requested_reply=true means the rule applies
        * only when reply was requested. requested_reply=false means the
        * rule always applies
        */
-      if (!requested_reply && rule->access != BUS_POLICY_RULE_ACCESS_DENY && rule->d.send.requested_reply && !rule->d.send.eavesdrop)
+      if (!match_params->requested_reply && rule->access != BUS_POLICY_RULE_ACCESS_DENY && rule->d.send.requested_reply && !rule->d.send.eavesdrop)
         {
           _dbus_verbose ("  (policy) skipping %s rule since it only applies to requested replies and does not allow eavesdropping\n",
               rule->access == BUS_POLICY_RULE_ACCESS_DENY ? "allow" : "deny");
@@ -1205,7 +1218,7 @@ check_receive_rule (const BusPolicyRule  *rule,
        * when the reply was not requested. requested_reply=true means the
        * rule always applies.
        */
-      if (requested_reply && rule->access == BUS_POLICY_RULE_ACCESS_DENY && !rule->d.receive.requested_reply)
+      if (match_params->requested_reply && rule->access == BUS_POLICY_RULE_ACCESS_DENY && !rule->d.receive.requested_reply)
         {
           _dbus_verbose ("  (policy) skipping deny rule since it only applies to unrequested replies\n");
           return FALSE;
@@ -1214,8 +1227,8 @@ check_receive_rule (const BusPolicyRule  *rule,
 
   if (rule->d.receive.path != NULL)
     {
-      if (dbus_message_get_path (message) != NULL &&
-          strcmp (dbus_message_get_path (message),
+      if (dbus_message_get_path (match_params->message) != NULL &&
+          strcmp (dbus_message_get_path (match_params->message),
                   rule->d.receive.path) != 0)
         {
           _dbus_verbose ("  (policy) skipping rule for different path\n");
@@ -1232,11 +1245,11 @@ check_receive_rule (const BusPolicyRule  *rule,
        */
       dbus_bool_t no_interface;
 
-      no_interface = dbus_message_get_interface (message) == NULL;
+      no_interface = dbus_message_get_interface (match_params->message) == NULL;
 
       if ((no_interface && rule->access != BUS_POLICY_RULE_ACCESS_DENY) ||
           (!no_interface &&
-           strcmp (dbus_message_get_interface (message),
+           strcmp (dbus_message_get_interface (match_params->message),
                    rule->d.receive.interface) != 0))
         {
           _dbus_verbose ("  (policy) skipping rule for different interface\n");
@@ -1246,8 +1259,8 @@ check_receive_rule (const BusPolicyRule  *rule,
 
   if (rule->d.receive.member != NULL)
     {
-      if (dbus_message_get_member (message) != NULL &&
-          strcmp (dbus_message_get_member (message),
+      if (dbus_message_get_member (match_params->message) != NULL &&
+          strcmp (dbus_message_get_member (match_params->message),
                   rule->d.receive.member) != 0)
         {
           _dbus_verbose ("  (policy) skipping rule for different member\n");
@@ -1257,8 +1270,8 @@ check_receive_rule (const BusPolicyRule  *rule,
 
   if (rule->d.receive.error != NULL)
     {
-      if (dbus_message_get_error_name (message) != NULL &&
-          strcmp (dbus_message_get_error_name (message),
+      if (dbus_message_get_error_name (match_params->message) != NULL &&
+          strcmp (dbus_message_get_error_name (match_params->message),
                   rule->d.receive.error) != 0)
         {
           _dbus_verbose ("  (policy) skipping rule for different error name\n");
@@ -1273,9 +1286,9 @@ check_receive_rule (const BusPolicyRule  *rule,
        * built-in services don't have a DBusConnection but will
        * still set the sender on their messages.
        */
-      if (sender == NULL)
+      if (match_params->sender == NULL)
         {
-          if (!dbus_message_has_sender (message,
+          if (!dbus_message_has_sender (match_params->message,
                                         rule->d.receive.origin))
             {
               _dbus_verbose ("  (policy) skipping rule because message sender is not %s\n",
@@ -1290,7 +1303,7 @@ check_receive_rule (const BusPolicyRule  *rule,
 
           _dbus_string_init_const (&str, rule->d.receive.origin);
 
-          service = bus_registry_lookup (registry, &str);
+          service = bus_registry_lookup (match_params->registry, &str);
           
           if (service == NULL)
             {
@@ -1299,7 +1312,7 @@ check_receive_rule (const BusPolicyRule  *rule,
               return FALSE;
             }
 
-          if (!bus_service_has_owner (service, sender))
+          if (!bus_service_has_owner (service, match_params->sender))
             {
               _dbus_verbose ("  (policy) skipping rule because origin %s isn't owned by sender\n",
                              rule->d.receive.origin);
@@ -1343,14 +1356,18 @@ bus_client_policy_check_can_receive (BusClientPolicy     *policy,
                                      char               **out_rule)
 {
   DBusList *link;
-  dbus_bool_t eavesdropping;
   BusResult result;
   const char *privilege;
   BusPolicyRule *matched_rule = NULL;
+  struct MatchReceiveRuleParams params;
 
-  eavesdropping =
+  params.eavesdropping =
     addressed_recipient != proposed_recipient &&
     dbus_message_get_destination (message) != NULL;
+  params.registry = registry;
+  params.requested_reply = requested_reply;
+  params.sender = sender;
+  params.message = message;
 
   /* policy->rules is in the order the rules appeared
    * in the config file, i.e. last rule that applies wins
@@ -1367,8 +1384,7 @@ bus_client_policy_check_can_receive (BusClientPolicy     *policy,
 
       link = _dbus_list_get_next_link (&policy->rules, link);
 
-      if (check_receive_rule (rule, registry, requested_reply, sender,
-                              message, eavesdropping, &result, &privilege))
+      if (check_receive_rule (rule, &params, &result, &privilege))
         {
           (*toggles)++;
           matched_rule = (BusPolicyRule *)rule;