bus: detect blocking message calls to our own connection and return ELOOP early
authorLennart Poettering <lennart@poettering.net>
Mon, 11 Nov 2013 22:42:30 +0000 (23:42 +0100)
committerLennart Poettering <lennart@poettering.net>
Mon, 11 Nov 2013 23:12:44 +0000 (00:12 +0100)
src/libsystemd-bus/sd-bus.c

index 3ecda17..89437c1 100644 (file)
@@ -1637,6 +1637,19 @@ _public_ int sd_bus_call(
 
                                 sd_bus_message_unref(incoming);
                                 return -EIO;
+
+                        } else if (incoming->header->serial == serial &&
+                                   bus->unique_name &&
+                                   incoming->sender &&
+                                   streq(bus->unique_name, incoming->sender)) {
+
+                                /* Our own message? Somebody is trying
+                                 * to send its own client a message,
+                                 * let's not dead-lock, let's fail
+                                 * immediately. */
+
+                                sd_bus_message_unref(incoming);
+                                return -ELOOP;
                         }
 
                         /* There's already guaranteed to be room for