From 87cb6359367c96a7a63a3a5d18de878fd818d713 Mon Sep 17 00:00:00 2001 From: Julien Desfossez Date: Wed, 14 Feb 2018 16:32:45 -0500 Subject: [PATCH] Fix: reply to version check even on protocol mismatch MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit In the relay, we currently put() the connection when we detect that the major version from the session daemon is not compatible. We don't reply to the version check message. The relay still holds a reference on the connection so it is not closed and the session daemon is left blocking in recvmsg. The relay now replies to the version check so the session daemon knows it is not compatible, and the relay completely closes the connection on its side and removes the FD from the poll set. Signed-off-by: Julien Desfossez Signed-off-by: Jérémie Galarneau --- src/bin/lttng-relayd/main.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/bin/lttng-relayd/main.c b/src/bin/lttng-relayd/main.c index 61f206fdf..cd4f058bf 100644 --- a/src/bin/lttng-relayd/main.c +++ b/src/bin/lttng-relayd/main.c @@ -1601,6 +1601,7 @@ static int relay_send_version(struct lttcomm_relayd_hdr *recv_hdr, { int ret; struct lttcomm_relayd_version reply, msg; + bool compatible = true; conn->version_check_done = 1; @@ -1625,9 +1626,7 @@ static int relay_send_version(struct lttcomm_relayd_hdr *recv_hdr, if (reply.major != be32toh(msg.major)) { DBG("Incompatible major versions (%u vs %u), deleting session", reply.major, be32toh(msg.major)); - connection_put(conn); - ret = 0; - goto end; + compatible = false; } conn->major = reply.major; @@ -1646,6 +1645,11 @@ static int relay_send_version(struct lttcomm_relayd_hdr *recv_hdr, ERR("Relay sending version"); } + if (!compatible) { + ret = -1; + goto end; + } + DBG("Version check done using protocol %u.%u", conn->major, conn->minor); -- 2.34.1