From 49ad114be1920e3e7786ea7c4f4c6dc15a940ba5 Mon Sep 17 00:00:00 2001
From: deuce <>
Date: Fri, 9 Mar 2018 01:34:32 +0000
Subject: [PATCH] Actually implement the timeout specified in Socket.recv().
 This has apparently never been implemented for non-TLS sockets, but it is
 used by some.

---
 src/sbbs3/js_socket.c | 12 ++++++++++--
 1 file changed, 10 insertions(+), 2 deletions(-)

diff --git a/src/sbbs3/js_socket.c b/src/sbbs3/js_socket.c
index cf672d65c1..b72c2e8909 100644
--- a/src/sbbs3/js_socket.c
+++ b/src/sbbs3/js_socket.c
@@ -121,11 +121,19 @@ static ptrdiff_t js_socket_recv(js_socket_private_t *p, void *buf, size_t len, i
 {
 	ptrdiff_t	total=0;
 	int	copied,ret;
+	fd_set		socket_set;
+	struct		timeval tv = {0, 0};
 	
 	if (len == 0)
 		return total;
-	if(p->session==-1)
-		return(recv(p->sock, buf, len, flags));	/* Blocked here, indefinitely, in MSP-UDP service */
+	if(p->session==-1) {
+		FD_ZERO(&socket_set);
+		FD_SET(p->sock,&socket_set);
+		tv.tv_sec = timeout;
+		if(select(p->sock+1,&socket_set,NULL,NULL,&tv)==1)
+			return(recv(p->sock, buf, len, flags));	/* Blocked here, indefinitely, in MSP-UDP service */
+		return 0;
+	}
 #if 0
 	if (do_cryptAttribute(p->session, CRYPT_OPTION_NET_READTIMEOUT, p->nonblocking?0:timeout) != CRYPT_OK)
 		return -1;
-- 
GitLab