dbus_listener: Acquire signal parameters on event retrieval 34/212134/2
authorKarol Lewandowski <k.lewandowsk@samsung.com>
Wed, 14 Aug 2019 16:08:58 +0000 (18:08 +0200)
committerMaciej Slodczyk <m.slodczyk2@partner.samsung.com>
Tue, 20 Aug 2019 15:43:42 +0000 (17:43 +0200)
Do not use parameters used when configuring match but the params
that actually caused the callback to be called.  This is important
because eg. one can specify path_namespace in match, but it's not
parameter that will be in message - it's "match parameter" only(!)

Change-Id: I4d3d922887accf9402282ae0210d682f170bbdb8

src/listeners/dbus.c

index 435d8e4b500d594509061a3433c42c70ba24fb8d..ccf09dcf1a878ac43078f85f516120dcae326497 100644 (file)
@@ -165,15 +165,23 @@ static void on_dbus_signal_match(GDBusConnection *connection,
        } while (0)
 
        COPY_COND(event_id);
-       COPY_COND(sender);
-       COPY_COND(interface);
-       COPY_COND(member);
-       COPY_COND(path);
        COPY_COND(path_namespace);
        COPY_COND(destination);
 
 #undef COPY_COND
 
+       // copy actual signal data
+       // While it's possible to copy some of the values from userdata, which was
+       // used during signal registration but at least path must be copied from
+       // function parameters
+       ds_ev_data.sender = strdup(sender_name);
+       ds_ev_data.path = strdup(object_path);
+       ds_ev_data.interface = strdup(interface_name);
+       ds_ev_data.member = strdup(signal_name);
+       if (!ds_ev_data.sender || !ds_ev_data.path || !ds_ev_data.interface || !ds_ev_data.member)
+               // XXX handle individual errors
+               goto finish;
+
        if (epc_object_new(&ds_ev_data.params) < 0)
                goto finish;