From 6d843a87ff0617bb55af125e28bafbee479b047c Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jos=C3=A9=20Roberto=20de=20Souza?=
 <zehortigoza@profusion.mobi>
Date: Fri, 4 Jan 2013 19:13:04 -0200
Subject: [PATCH] edbus: Fix signal handler extra match check

---
 src/lib/edbus/edbus_core.c |   28 ++++++++++++++++------------
 1 file changed, 16 insertions(+), 12 deletions(-)

diff --git a/src/lib/edbus/edbus_core.c b/src/lib/edbus/edbus_core.c
index f060ee8..cbe3345 100644
--- a/src/lib/edbus/edbus_core.c
+++ b/src/lib/edbus/edbus_core.c
@@ -762,11 +762,7 @@ cb_dispatch_status(DBusConnection *dbus_conn EINA_UNUSED, DBusDispatchStatus new
 static void
 cb_signal_dispatcher(EDBus_Connection *conn, DBusMessage *msg)
 {
-   DBusMessageIter iter;
-   int counter;
-   char *arg_msg;
    EDBus_Message *edbus_msg;
-   Signal_Argument *arg;
    Eina_Inlist *next;
 
    edbus_msg = edbus_message_new(EINA_FALSE);
@@ -787,7 +783,9 @@ cb_signal_dispatcher(EDBus_Connection *conn, DBusMessage *msg)
    while (next != NULL)
      {
         EDBus_Signal_Handler *sh;
-        int type = 0;
+        unsigned int counter = 0;
+        DBusMessageIter iter;
+        Signal_Argument *arg;
 
         sh = EINA_INLIST_CONTAINER_GET(next, EDBus_Signal_Handler);
         next = next->next;
@@ -809,20 +807,24 @@ cb_signal_dispatcher(EDBus_Connection *conn, DBusMessage *msg)
         if (sh->member && !dbus_message_has_member(msg, sh->member)) continue;
 
         dbus_message_iter_init(msg, &iter);
-        counter = 0;
         EINA_INLIST_FOREACH(sh->args, arg)
           {
+             const char *arg_msg;
+             int type = 0;
+             for (;arg->index > counter && dbus_message_iter_next(&iter); counter++);
+             if (counter != arg->index)
+               goto next_sh;
+
              type = dbus_message_iter_get_arg_type(&iter);
-             if (counter != arg->index || !(type == 's' || type == 'o'))
-               continue;
+             if (!(type == 's' || type == 'o'))
+               goto next_sh;
 
              dbus_message_iter_get_basic(&iter, &arg_msg);
              if (strcmp(arg_msg, arg->value))
-               continue;
-
-             dbus_message_iter_next(&iter);
-             counter++;
+               goto next_sh;
           }
+        if (eina_inlist_count(sh->args)-1 != counter)
+          goto next_sh;
         edbus_signal_handler_ref(sh);
         sh->cb((void *)sh->cb_data, edbus_msg);
         /* update next signal handler because the list may have changed */
@@ -835,6 +837,8 @@ cb_signal_dispatcher(EDBus_Connection *conn, DBusMessage *msg)
          */
         dbus_message_iter_init(edbus_msg->dbus_msg,
                                &edbus_msg->iterator->dbus_iterator);
+        next_sh:
+          counter = 0;//its not possible create a label and dont execute any code
      }
 
    edbus_message_unref(edbus_msg);
-- 
1.7.10.4

