From: Francis Deslauriers Date: Mon, 16 Nov 2020 21:50:41 +0000 (-0500) Subject: Fix: lttng-ctl: deserialize on orderly shutdown of sessiond X-Git-Tag: v2.13.0-rc1~418 X-Git-Url: https://git.lttng.org/?p=lttng-tools.git;a=commitdiff_plain;h=bacc41cc41d9702241e7a52617fed046ed5f5506 Fix: lttng-ctl: deserialize on orderly shutdown of sessiond 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 Signed-off-by: Jérémie Galarneau Change-Id: Ib2387526c4101e3bae706e38181bfeb25da26fa3 --- diff --git a/src/lib/lttng-ctl/lttng-ctl.c b/src/lib/lttng-ctl/lttng-ctl.c index 001abffcd..1c51eedc7 100644 --- a/src/lib/lttng-ctl/lttng-ctl.c +++ b/src/lib/lttng-ctl/lttng-ctl.c @@ -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: