chiark / gitweb /
bus: fix parsing of matches against empty strings
[elogind.git] / src / libsystemd-bus / bus-match.c
index 49fc6335c23d0815b951a5aefd25fb7655e951e1..342819d9c06937479a033a0768a865dde715c727 100644 (file)
@@ -22,6 +22,8 @@
 #include "bus-internal.h"
 #include "bus-message.h"
 #include "bus-match.h"
+#include "bus-error.h"
+#include "bus-util.h"
 
 /* Example:
  *
@@ -153,7 +155,7 @@ static bool value_node_test(
                  * should contain all well-known names of the sender,
                  * hence we can fix things there correctly. */
 
-                if (node->value.str[0] != ':' && value_str[0] == ':')
+                if (node->value.str[0] != ':' && value_str && value_str[0] == ':')
                         return true;
 
                 return false;
@@ -272,7 +274,10 @@ int bus_match_run(
 
                 /* Run the callback. And then invoke siblings. */
                 if (node->leaf.callback) {
-                        r = node->leaf.callback(bus, m, node->leaf.userdata);
+                        _cleanup_bus_error_free_ sd_bus_error error_buffer = SD_BUS_ERROR_NULL;
+
+                        r = node->leaf.callback(bus, m, node->leaf.userdata, &error_buffer);
+                        r = bus_maybe_reply_error(m, r, &error_buffer);
                         if (r != 0)
                                 return r;
                 }
@@ -750,6 +755,14 @@ int bus_match_parse(
                         escaped = false;
                 }
 
+                if (!value) {
+                        value = strdup("");
+                        if (!value) {
+                                r = -ENOMEM;
+                                goto fail;
+                        }
+                }
+
                 if (t == BUS_MATCH_MESSAGE_TYPE) {
                         r = bus_message_type_from_string(value, &u);
                         if (r < 0)