BUG/MAJOR: lua/socket: resources not detroyed when the socket is aborted

In some cases, the socket is misused. The user can open socket and never
close it, or open the socket and close it without sending data. This
causes resources leak on all resources associated to the stream (buffer,
spoe, ...)

This is caused by the stream_shutdown function which is called outside
of the stream execution process. Sometimes, the shtudown is required
while the stream is not started, so the cleanup is ignored.

This patch change the shutdown mode of the session. Now if the session is
no longer used and the Lua want to destroy it, it just set a destroy flag
and the session kill itself.

This patch should be backported in 1.6 and 1.7
diff --git a/include/types/applet.h b/include/types/applet.h
index 5c1b074..e81cff7 100644
--- a/include/types/applet.h
+++ b/include/types/applet.h
@@ -76,6 +76,7 @@
 			struct hlua_socket *socket;
 			struct list wake_on_read;
 			struct list wake_on_write;
+			int die;
 		} hlua_cosocket;                /* used by the Lua cosockets */
 		struct {
 			struct hlua *hlua;
diff --git a/src/hlua.c b/src/hlua.c
index de4af39..ef172fb 100644
--- a/src/hlua.c
+++ b/src/hlua.c
@@ -1553,6 +1553,15 @@
 	struct stream_interface *si = appctx->owner;
 	struct connection *c = objt_conn(si_opposite(si)->end);
 
+	if (appctx->ctx.hlua_cosocket.die) {
+		si_shutw(si);
+		si_shutr(si);
+		si_ic(si)->flags |= CF_READ_NULL;
+		hlua_com_wake(&appctx->ctx.hlua_cosocket.wake_on_read);
+		hlua_com_wake(&appctx->ctx.hlua_cosocket.wake_on_write);
+		stream_shutdown(si_strm(si), SF_ERR_KILLED);
+	}
+
 	/* If the connection object is not avalaible, close all the
 	 * streams and wakeup everithing waiting for.
 	 */
@@ -1628,9 +1637,10 @@
 
 	/* Remove all reference between the Lua stack and the coroutine stream. */
 	appctx = objt_appctx(socket->s->si[0].end);
-	stream_shutdown(socket->s, SF_ERR_KILLED);
 	socket->s = NULL;
 	appctx->ctx.hlua_cosocket.socket = NULL;
+	appctx->ctx.hlua_cosocket.die = 1;
+	appctx_wakeup(appctx);
 
 	return 0;
 }
@@ -1650,10 +1660,11 @@
 		return 0;
 
 	/* Close the stream and remove the associated stop task. */
-	stream_shutdown(socket->s, SF_ERR_KILLED);
 	appctx = objt_appctx(socket->s->si[0].end);
 	appctx->ctx.hlua_cosocket.socket = NULL;
 	socket->s = NULL;
+	appctx->ctx.hlua_cosocket.die = 1;
+	appctx_wakeup(appctx);
 
 	return 0;
 }
@@ -2325,6 +2336,7 @@
 
 	appctx->ctx.hlua_cosocket.socket = socket;
 	appctx->ctx.hlua_cosocket.connected = 0;
+	appctx->ctx.hlua_cosocket.die = 0;
 	LIST_INIT(&appctx->ctx.hlua_cosocket.wake_on_write);
 	LIST_INIT(&appctx->ctx.hlua_cosocket.wake_on_read);