summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHarald Welte <laforge@gnumonks.org>2017-12-22 16:43:24 +0100
committerHarald Welte <laforge@gnumonks.org>2017-12-22 16:48:14 +0100
commitf360b42ca11bdad01036b95ca1983533ed35c542 (patch)
tree6f0cb9de7197e542e8c0a6001666338b69028c6e
parentaafc27ce37337bdca4a8e9db4e186b808585070a (diff)
control_if: Close control connection socket/fd on read/write == 0
When read() or write() system calls return '0' on a stream socket, it means that the connection has been closed ("EOF"). We must accordingly close this socket and remove all related state. Before this patch, every new CTRL connection would introduce a leak of both some memory/state, as well as a file descriptor :( Change-Id: I4fb70e5f123b37dece29f156c5f430c875e7cbaf
-rw-r--r--src/ctrl/control_if.c10
1 files changed, 9 insertions, 1 deletions
diff --git a/src/ctrl/control_if.c b/src/ctrl/control_if.c
index 17a012a9..6293ff52 100644
--- a/src/ctrl/control_if.c
+++ b/src/ctrl/control_if.c
@@ -341,6 +341,7 @@ static int handle_control_read(struct osmo_fd * bfd)
/* msg was already discarded. */
if (ret == 0) {
LOGP(DLCTRL, LOGL_INFO, "The control connection was closed\n");
+ control_close_conn(ccon);
ret = -EIO;
}
else
@@ -414,10 +415,17 @@ int ctrl_handle_msg(struct ctrl_handle *ctrl, struct ctrl_connection *ccon, stru
static int control_write_cb(struct osmo_fd *bfd, struct msgb *msg)
{
+ struct osmo_wqueue *queue;
+ struct ctrl_connection *ccon;
int rc;
+ queue = container_of(bfd, struct osmo_wqueue, bfd);
+ ccon = container_of(queue, struct ctrl_connection, write_queue);
+
rc = write(bfd->fd, msg->data, msg->len);
- if (rc != msg->len)
+ if (rc == 0)
+ control_close_conn(ccon);
+ else if (rc != msg->len)
LOGP(DLCTRL, LOGL_ERROR, "Failed to write message to the control connection.\n");
return rc;