From 26eef6e071510d9ab0c83e6f108037e5628c8578 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Santeri=20Hernej=C3=A4rvi?= <santeri@spotify.com>
Date: Thu, 14 Mar 2019 12:05:35 +0100
Subject: [PATCH] mbedtls: Fix reads getting stuck when the socket has
 disconnected

We've seen this behaviour when iOS resumes from sleep:

dbg> 0x11cd03750: ssl err dbg> lws_ssl_capable_read: WANT_READ
dbg> 0x11cd03750: LWS_SSL_CAPABLE_MORE_SERVICE
dbg> SSL Capable more service
dbg> 0x11cd03750: SSL_read says -1
dbg> 0x11cd03750: ssl err 2 errno 57
dbg> lws_ssl_capable_read: WANT_READ
dbg> 0x11cd0375dbg> SSL Capable more service
dbg> 0x11cd03750: SSL_read says -1
dbg> 0x11cd03750: ssl err 2 errno 57
dbg> lws_ssl_capable_read: WANT_READ
---
 .gitignore            | 1 +
 lib/tls/mbedtls/ssl.c | 5 +++++
 2 files changed, 6 insertions(+)

diff --git a/.gitignore b/.gitignore
index 5805b27d..4b6639aa 100644
--- a/.gitignore
+++ b/.gitignore
@@ -52,3 +52,4 @@ doc
 /cov-int/
 /.vs/
 /build-mtls/
+/build-mingw64/
diff --git a/lib/tls/mbedtls/ssl.c b/lib/tls/mbedtls/ssl.c
index b81f8886..69956f7d 100644
--- a/lib/tls/mbedtls/ssl.c
+++ b/lib/tls/mbedtls/ssl.c
@@ -99,6 +99,11 @@ lws_ssl_capable_read(struct lws *wsi, unsigned char *buf, int len)
 	if (n < 0) {
 		m = SSL_get_error(wsi->tls.ssl, n);
 		lwsl_debug("%p: ssl err %d errno %d\n", wsi, m, errno);
+		if (errno == LWS_ENOTCONN) {
+			/* If the socket isn't connected anymore, bail out. */
+			wsi->socket_is_permanently_unusable = 1;
+			return LWS_SSL_CAPABLE_ERROR;
+		}
 		if (m == SSL_ERROR_ZERO_RETURN ||
 		    m == SSL_ERROR_SYSCALL)
 			return LWS_SSL_CAPABLE_ERROR;
-- 
GitLab