Zbigniew Jędrzejewski-Szmek 62fe94
From d974ad0524942882f489914013d08ab16d147170 Mon Sep 17 00:00:00 2001
Zbigniew Jędrzejewski-Szmek 62fe94
From: David Herrmann <dh.herrmann@gmail.com>
Zbigniew Jędrzejewski-Szmek 62fe94
Date: Thu, 28 Aug 2014 12:42:03 +0200
Zbigniew Jędrzejewski-Szmek 62fe94
Subject: [PATCH] bus: fix use-after-free in slot-release
Zbigniew Jędrzejewski-Szmek 62fe94
Zbigniew Jędrzejewski-Szmek 62fe94
We must not access slot->floating after we possible dropped the last
Zbigniew Jędrzejewski-Szmek 62fe94
reference to it. Fix all callback-invocations to first check
Zbigniew Jędrzejewski-Szmek 62fe94
slot->floating and possible disconnect the slot, then release the last
Zbigniew Jędrzejewski-Szmek 62fe94
reference.
Zbigniew Jędrzejewski-Szmek 62fe94
---
Zbigniew Jędrzejewski-Szmek 62fe94
 src/libsystemd/sd-bus/sd-bus.c | 12 +++++++++---
Zbigniew Jędrzejewski-Szmek 62fe94
 1 file changed, 9 insertions(+), 3 deletions(-)
Zbigniew Jędrzejewski-Szmek 62fe94
Zbigniew Jędrzejewski-Szmek 62fe94
diff --git a/src/libsystemd/sd-bus/sd-bus.c b/src/libsystemd/sd-bus/sd-bus.c
Zbigniew Jędrzejewski-Szmek 62fe94
index a204d67590..8caa404227 100644
Zbigniew Jędrzejewski-Szmek 62fe94
--- a/src/libsystemd/sd-bus/sd-bus.c
Zbigniew Jędrzejewski-Szmek 62fe94
+++ b/src/libsystemd/sd-bus/sd-bus.c
Zbigniew Jędrzejewski-Szmek 62fe94
@@ -2107,7 +2107,7 @@ static int process_timeout(sd_bus *bus) {
Zbigniew Jędrzejewski-Szmek 62fe94
         r = c->callback(bus, m, slot->userdata, &error_buffer);
Zbigniew Jędrzejewski-Szmek 62fe94
         bus->current_userdata = NULL;
Zbigniew Jędrzejewski-Szmek 62fe94
         bus->current_handler = NULL;
Zbigniew Jędrzejewski-Szmek 62fe94
-        bus->current_slot = sd_bus_slot_unref(slot);
Zbigniew Jędrzejewski-Szmek 62fe94
+        bus->current_slot = NULL;
Zbigniew Jędrzejewski-Szmek 62fe94
         bus->current_message = NULL;
Zbigniew Jędrzejewski-Szmek 62fe94
 
Zbigniew Jędrzejewski-Szmek 62fe94
         if (slot->floating) {
Zbigniew Jędrzejewski-Szmek 62fe94
@@ -2115,6 +2115,8 @@ static int process_timeout(sd_bus *bus) {
Zbigniew Jędrzejewski-Szmek 62fe94
                 sd_bus_slot_unref(slot);
Zbigniew Jędrzejewski-Szmek 62fe94
         }
Zbigniew Jędrzejewski-Szmek 62fe94
 
Zbigniew Jędrzejewski-Szmek 62fe94
+        sd_bus_slot_unref(slot);
Zbigniew Jędrzejewski-Szmek 62fe94
+
Zbigniew Jędrzejewski-Szmek 62fe94
         return bus_maybe_reply_error(m, r, &error_buffer);
Zbigniew Jędrzejewski-Szmek 62fe94
 }
Zbigniew Jędrzejewski-Szmek 62fe94
 
Zbigniew Jędrzejewski-Szmek 62fe94
@@ -2203,13 +2205,15 @@ static int process_reply(sd_bus *bus, sd_bus_message *m) {
Zbigniew Jędrzejewski-Szmek 62fe94
         r = c->callback(bus, m, slot->userdata, &error_buffer);
Zbigniew Jędrzejewski-Szmek 62fe94
         bus->current_userdata = NULL;
Zbigniew Jędrzejewski-Szmek 62fe94
         bus->current_handler = NULL;
Zbigniew Jędrzejewski-Szmek 62fe94
-        bus->current_slot = sd_bus_slot_unref(slot);
Zbigniew Jędrzejewski-Szmek 62fe94
+        bus->current_slot = NULL;
Zbigniew Jędrzejewski-Szmek 62fe94
 
Zbigniew Jędrzejewski-Szmek 62fe94
         if (slot->floating) {
Zbigniew Jędrzejewski-Szmek 62fe94
                 bus_slot_disconnect(slot);
Zbigniew Jędrzejewski-Szmek 62fe94
                 sd_bus_slot_unref(slot);
Zbigniew Jędrzejewski-Szmek 62fe94
         }
Zbigniew Jędrzejewski-Szmek 62fe94
 
Zbigniew Jędrzejewski-Szmek 62fe94
+        sd_bus_slot_unref(slot);
Zbigniew Jędrzejewski-Szmek 62fe94
+
Zbigniew Jędrzejewski-Szmek 62fe94
         return bus_maybe_reply_error(m, r, &error_buffer);
Zbigniew Jędrzejewski-Szmek 62fe94
 }
Zbigniew Jędrzejewski-Szmek 62fe94
 
Zbigniew Jędrzejewski-Szmek 62fe94
@@ -2529,7 +2533,7 @@ static int process_closing(sd_bus *bus, sd_bus_message **ret) {
Zbigniew Jędrzejewski-Szmek 62fe94
                 r = c->callback(bus, m, slot->userdata, &error_buffer);
Zbigniew Jędrzejewski-Szmek 62fe94
                 bus->current_userdata = NULL;
Zbigniew Jędrzejewski-Szmek 62fe94
                 bus->current_handler = NULL;
Zbigniew Jędrzejewski-Szmek 62fe94
-                bus->current_slot = sd_bus_slot_unref(slot);
Zbigniew Jędrzejewski-Szmek 62fe94
+                bus->current_slot = NULL;
Zbigniew Jędrzejewski-Szmek 62fe94
                 bus->current_message = NULL;
Zbigniew Jędrzejewski-Szmek 62fe94
 
Zbigniew Jędrzejewski-Szmek 62fe94
                 if (slot->floating) {
Zbigniew Jędrzejewski-Szmek 62fe94
@@ -2537,6 +2541,8 @@ static int process_closing(sd_bus *bus, sd_bus_message **ret) {
Zbigniew Jędrzejewski-Szmek 62fe94
                         sd_bus_slot_unref(slot);
Zbigniew Jędrzejewski-Szmek 62fe94
                 }
Zbigniew Jędrzejewski-Szmek 62fe94
 
Zbigniew Jędrzejewski-Szmek 62fe94
+                sd_bus_slot_unref(slot);
Zbigniew Jędrzejewski-Szmek 62fe94
+
Zbigniew Jędrzejewski-Szmek 62fe94
                 return bus_maybe_reply_error(m, r, &error_buffer);
Zbigniew Jędrzejewski-Szmek 62fe94
         }
Zbigniew Jędrzejewski-Szmek 62fe94