chiark / gitweb /
bus: don't allow recursive invocation of sd_bus_process()
authorLennart Poettering <lennart@poettering.net>
Fri, 5 Apr 2013 01:15:10 +0000 (03:15 +0200)
committerLennart Poettering <lennart@poettering.net>
Fri, 5 Apr 2013 01:15:10 +0000 (03:15 +0200)
src/libsystemd-bus/bus-internal.h
src/libsystemd-bus/sd-bus.c
src/systemd/sd-bus.h

index feafed0876f63d5ea593ac463d738dd3524cde5d..9cc1c9c8996f068b97921e80520a80e1709b85e1 100644 (file)
@@ -85,6 +85,7 @@ struct sd_bus {
         bool anonymous_auth:1;
         bool prefer_readv:1;
         bool prefer_writev:1;
+        bool processing:1;
 
         void *rbuffer;
         size_t rbuffer_size;
index 0964649e39d675c1df423591aca7913b4e0d66ed..8daf922dedc5fbeefdea582fd84abd368c234da0 100644 (file)
@@ -1845,6 +1845,10 @@ int sd_bus_process(sd_bus *bus, sd_bus_message **ret) {
         if (bus->input_fd < 0)
                 return -ENOTCONN;
 
+        /* We don't allow recursively invoking sd_bus_process(). */
+        if (bus->processing)
+                return -EBUSY;
+
         switch (bus->state) {
 
         case BUS_UNSET:
@@ -1870,7 +1874,11 @@ int sd_bus_process(sd_bus *bus, sd_bus_message **ret) {
         case BUS_RUNNING:
         case BUS_HELLO:
 
-                return process_running(bus, ret);
+                bus->processing = true;
+                r = process_running(bus, ret);
+                bus->processing = false;
+
+                return r;
         }
 
         assert_not_reached("Unknown state");
index 122ec954ca4b5b92d016f1c75e2244765dd5ad57..b89394e97447bf2baff8f261def944ee1e05b882 100644 (file)
@@ -34,7 +34,6 @@ extern "C" {
 
 /* TODO:
  * - allow registration/removl of callbacks from within callbacks
- * - don't allow recursive processing
  *
  * - add page donation logic
  * - api for appending/reading fixed arrays