if (!strcmp(DS_EV_TIME, obj->key))
ds_ev_data.event_time = obj->val.time;
break;
+ /* In the following cases, we assume that the key might incorrectly
+ * repeat, and so we free the previous data in that case. In practice
+ * the key should not repeat. This will not happen if our serializer is
+ * used (see function dbus_signal_event_serialize), but the data comes
+ * from a database using a pluggable interface, with no explicit
+ * assumption that the data can be trusted. At the same time, the only
+ * implementation is a NOP database which will never actually return
+ * an event, so it seems that this function does not have this issue
+ * (since it will never be called). */
case TYPE_STRING:
- if (!strcmp(DS_EV_ID, obj->key))
+ if (!strcmp(DS_EV_ID, obj->key)) {
+ free(ds_ev_data.event_id);
ds_ev_data.event_id = strdup(obj->val.s);
- else if (!strcmp(DS_EV_SENDER, obj->key))
+ } else if (!strcmp(DS_EV_SENDER, obj->key)) {
+ free(ds_ev_data.sender);
ds_ev_data.sender = strdup(obj->val.s);
- else if (!strcmp(DS_EV_INTERFACE, obj->key))
+ } else if (!strcmp(DS_EV_INTERFACE, obj->key)) {
+ free(ds_ev_data.interface);
ds_ev_data.interface = strdup(obj->val.s);
- else if (!strcmp(DS_EV_MEMBER, obj->key))
+ } else if (!strcmp(DS_EV_MEMBER, obj->key)) {
+ free(ds_ev_data.member);
ds_ev_data.member = strdup(obj->val.s);
- else if (!strcmp(DS_EV_PATH, obj->key))
+ } else if (!strcmp(DS_EV_PATH, obj->key)) {
+ free(ds_ev_data.path);
ds_ev_data.path = strdup(obj->val.s);
- else if (!strcmp(DS_EV_PATH_NAMESPACE, obj->key))
+ } else if (!strcmp(DS_EV_PATH_NAMESPACE, obj->key)) {
+ free(ds_ev_data.path_namespace);
ds_ev_data.path_namespace = strdup(obj->val.s);
- else if (!strcmp(DS_EV_DESTINATION, obj->key))
+ } else if (!strcmp(DS_EV_DESTINATION, obj->key)) {
+ free(ds_ev_data.destination);
ds_ev_data.destination = strdup(obj->val.s);
+ }
break;
case TYPE_OBJECT:
if (!strcmp(DS_EV_PARAMS, obj->key)) {
+ if (ds_ev_data.match_params)
+ epc_object_unref(ds_ev_data.match_params);
epc_object_ref(obj);
ds_ev_data.match_params = obj;
}