From 27c665639811574e9d0e737938e1688fd171c1cf Mon Sep 17 00:00:00 2001
From: Sergey Lyubka <valenok@gmail.com>
Date: Tue, 4 Mar 2014 13:23:40 +0000
Subject: [PATCH] SSL_accept fixes

---
 mongoose.c | 16 ++++++++++------
 1 file changed, 10 insertions(+), 6 deletions(-)

diff --git a/mongoose.c b/mongoose.c
index 1293719db..96227ac41 100644
--- a/mongoose.c
+++ b/mongoose.c
@@ -658,7 +658,7 @@ static void ns_read_from_socket(struct ns_connection *conn) {
       int ssl_err = SSL_get_error(conn->ssl, res);
       DBG(("%p res %d %d", conn, res, ssl_err));
       if (res == 1) {
-        conn->flags |= NSF_SSL_HANDSHAKE_DONE;
+        conn->flags = NSF_SSL_HANDSHAKE_DONE;
       } else if (res == 0 || ssl_err == 2 || ssl_err == 3) {
         return; // Call us again
       } else {
@@ -680,8 +680,15 @@ static void ns_read_from_socket(struct ns_connection *conn) {
     if (conn->flags & NSF_SSL_HANDSHAKE_DONE) {
       n = SSL_read(conn->ssl, buf, sizeof(buf));
     } else {
-      if (SSL_accept(conn->ssl) == 1) {
+      int res = SSL_accept(conn->ssl);
+      int ssl_err = SSL_get_error(conn->ssl, res);
+      DBG(("%p res %d %d", conn, res, ssl_err));
+      if (res == 1) {
         conn->flags |= NSF_SSL_HANDSHAKE_DONE;
+      } else if (res == 0 || ssl_err == 2 || ssl_err == 3) {
+        return; // Call us again
+      } else {
+        conn->flags |= NSF_CLOSE_IMMEDIATELY;
       }
       return;
     }
@@ -842,10 +849,6 @@ struct ns_connection *ns_connect(struct ns_server *server, const char *host,
   struct ns_connection *conn = NULL;
   int connect_ret_val;
 
-#ifndef NS_ENABLE_SSL
-  if (use_ssl) return 0;
-#endif
-
   if (host == NULL || (he = gethostbyname(host)) == NULL ||
       (sock = socket(AF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET) {
     DBG(("gethostbyname(%s) failed: %s", host, strerror(errno)));
@@ -859,6 +862,7 @@ struct ns_connection *ns_connect(struct ns_server *server, const char *host,
 
   connect_ret_val = connect(sock, (struct sockaddr *) &sin, sizeof(sin));
   if (ns_is_error(connect_ret_val)) {
+    closesocket(sock);
     return NULL;
   } else if ((conn = (struct ns_connection *)
               NS_MALLOC(sizeof(*conn))) == NULL) {
-- 
GitLab