Fix: lttng-ctl: deserialize on orderly shutdown of sessiond
authorFrancis Deslauriers <francis.deslauriers@efficios.com>
Mon, 16 Nov 2020 21:50:41 +0000 (16:50 -0500)
committerJérémie Galarneau <jeremie.galarneau@efficios.com>
Fri, 20 Nov 2020 21:50:05 +0000 (16:50 -0500)
Issue
=====
The `recv_data_sessiond()` function may return zero if the socket peer
has shutdown orderly. This happens if the session daemon is killed while
the client is blocked on the `recv_data_sessiond()` call. Currently,
when this happens, the client simply goes on to decode the uninitialized
reply buffer.

This bug was witnessed while developing the upcoming event-notifier
feature where complex objects are received from sessiond and attempts to
deserialize these objects resulted in segmentation faults.

Solution
========
Return -LTTNG_ERR_NO_SESSIOND when `recvmsg()` returns zero. This way,
the client can simply tell the user that the session daemon is no longer
available.

Signed-off-by: Francis Deslauriers <francis.deslauriers@efficios.com>
Signed-off-by: Jérémie Galarneau <jeremie.galarneau@efficios.com>
Change-Id: Ib2387526c4101e3bae706e38181bfeb25da26fa3

src/lib/lttng-ctl/lttng-ctl.c

index 001abffcd925705fbcee43a613ed055e2cea50c7..1c51eedc7814ff4879a844303b280200ae2e6fe2 100644 (file)
@@ -211,6 +211,8 @@ static int recv_data_sessiond(void *buf, size_t len)
 {
        int ret;
 
+       assert(len > 0);
+
        if (!connected) {
                ret = -LTTNG_ERR_NO_SESSIOND;
                goto end;
@@ -219,6 +221,8 @@ static int recv_data_sessiond(void *buf, size_t len)
        ret = lttcomm_recv_unix_sock(sessiond_socket, buf, len);
        if (ret < 0) {
                ret = -LTTNG_ERR_FATAL;
+       } else if (ret == 0) {
+               ret = -LTTNG_ERR_NO_SESSIOND;
        }
 
 end:
This page took 0.034837 seconds and 4 git commands to generate.