summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLennart Poettering <lennart@poettering.net>2014-11-26 15:54:53 +0100
committerLennart Poettering <lennart@poettering.net>2014-11-26 17:27:59 +0100
commitdcc2fc01fa850e9ee36c549dc2691e7e5c71bebf (patch)
treef8e81cc61d7257063e3701c4a9198e11c5d8349c
parente0312f4db08c7100bd00299614e87bedc759b366 (diff)
sd-bus: update peeking into receieved messages, with recent kernel change we need to FREE them after all
-rw-r--r--src/core/busname.c19
1 files changed, 13 insertions, 6 deletions
diff --git a/src/core/busname.c b/src/core/busname.c
index 1583d57416..8926c6bd94 100644
--- a/src/core/busname.c
+++ b/src/core/busname.c
@@ -731,6 +731,7 @@ static int busname_peek_message(BusName *n) {
struct kdbus_cmd_recv cmd_recv = {
.flags = KDBUS_RECV_PEEK,
};
+ struct kdbus_cmd_free cmd_free = {};
const char *comm = NULL;
struct kdbus_item *d;
struct kdbus_msg *k;
@@ -739,11 +740,17 @@ static int busname_peek_message(BusName *n) {
pid_t pid = 0;
int r;
+ /* Generate a friendly debug log message about which process
+ * caused triggering of this bus name. This simply peeks the
+ * metadata of the first queued message and logs it. */
+
assert(n);
- /* Generate a friendly log message about which process caused
- * triggering of this bus name. This simply peeks the metadata
- * of the first queued message and logs it. */
+ /* Let's shortcut things a bit, if debug logging is turned off
+ * anyway. */
+
+ if (log_get_max_level() < LOG_DEBUG)
+ return 0;
r = ioctl(n->starter_fd, KDBUS_CMD_MSG_RECV, &cmd_recv);
if (r < 0) {
@@ -795,9 +802,9 @@ finish:
if (p)
(void) munmap(p, sz);
- /* Hint: we don't invoke KDBUS_CMD_MSG_FREE here, as we only
- * PEEKed the message, and didn't ask for it to be dropped
- * from the queue. */
+ cmd_free.offset = cmd_recv.offset;
+ if (ioctl(n->starter_fd, KDBUS_CMD_FREE, &cmd_free) < 0)
+ log_warning_unit(UNIT(n)->id, "Failed to free peeked message, ignoring: %m");
return r;
}