]> granicus.if.org Git - mutt/commitdiff
Add checks for buffered OpenSSL or GnuTLS data when polling.
authorKevin McCarthy <kevin@8t8.us>
Sun, 28 Jul 2019 14:54:32 +0000 (07:54 -0700)
committerKevin McCarthy <kevin@8t8.us>
Tue, 13 Aug 2019 21:29:58 +0000 (14:29 -0700)
I don't believe this has had an actual effect, because Mutt doesn't
support renegotiation, and we are only polling immediately after
sending NOOP.

However, it looks like checking is technically the correct thing to do
to avoid polling waiting for data that is already buffered.

mutt_ssl.c
mutt_ssl_gnutls.c

index 3d83d1ea190d4ce43d7c707f4af756adccc4657b..3e9ef9fffdce960c6de1b78d13d25484882ccee4 100644 (file)
@@ -38,6 +38,7 @@
 #define X509_getm_notBefore X509_get_notBefore
 #define X509_getm_notAfter X509_get_notAfter
 #define X509_STORE_CTX_get0_chain X509_STORE_CTX_get_chain
+#define SSL_has_pending SSL_pending
 #endif
 
 #undef _
@@ -94,6 +95,7 @@ static int ssl_init (void);
 static int add_entropy (const char *file);
 static int ssl_socket_read (CONNECTION* conn, char* buf, size_t len);
 static int ssl_socket_write (CONNECTION* conn, const char* buf, size_t len);
+static int ssl_socket_poll (CONNECTION* conn, time_t wait_secs);
 static int ssl_socket_open (CONNECTION * conn);
 static int ssl_socket_close (CONNECTION * conn);
 static int tls_close (CONNECTION* conn);
@@ -284,6 +286,7 @@ int mutt_ssl_starttls (CONNECTION* conn)
   conn->conn_read = ssl_socket_read;
   conn->conn_write = ssl_socket_write;
   conn->conn_close = tls_close;
+  conn->conn_poll = ssl_socket_poll;
 
   conn->ssf = SSL_CIPHER_get_bits (SSL_get_current_cipher (ssldata->ssl),
                                    &maxbits);
@@ -413,7 +416,7 @@ int mutt_ssl_socket_setup (CONNECTION * conn)
   conn->conn_read      = ssl_socket_read;
   conn->conn_write     = ssl_socket_write;
   conn->conn_close     = ssl_socket_close;
-  conn->conn_poll       = raw_socket_poll;
+  conn->conn_poll       = ssl_socket_poll;
 
   return 0;
 }
@@ -445,6 +448,16 @@ static int ssl_socket_write (CONNECTION* conn, const char* buf, size_t len)
   return rc;
 }
 
+static int ssl_socket_poll (CONNECTION* conn, time_t wait_secs)
+{
+  sslsockdata *data = conn->sockdata;
+
+  if (SSL_has_pending (data->ssl))
+    return 1;
+  else
+    return raw_socket_poll (conn, wait_secs);
+}
+
 static int ssl_socket_open (CONNECTION * conn)
 {
   sslsockdata *data;
@@ -647,6 +660,7 @@ static int tls_close (CONNECTION* conn)
   conn->conn_read = raw_socket_read;
   conn->conn_write = raw_socket_write;
   conn->conn_close = raw_socket_close;
+  conn->conn_poll = raw_socket_poll;
 
   return rc;
 }
index 72d9e0a39e5b3fd50829b0505f0a35738ead580f..94a3c6d25ea93e28ef649e90c6aa9315b5bcbaaf 100644 (file)
@@ -85,6 +85,7 @@ tlssockdata;
 /* local prototypes */
 static int tls_socket_read (CONNECTION* conn, char* buf, size_t len);
 static int tls_socket_write (CONNECTION* conn, const char* buf, size_t len);
+static int tls_socket_poll (CONNECTION* conn, time_t wait_secs);
 static int tls_socket_open (CONNECTION* conn);
 static int tls_socket_close (CONNECTION* conn);
 static int tls_starttls_close (CONNECTION* conn);
@@ -123,7 +124,7 @@ int mutt_ssl_socket_setup (CONNECTION* conn)
   conn->conn_read      = tls_socket_read;
   conn->conn_write     = tls_socket_write;
   conn->conn_close     = tls_socket_close;
-  conn->conn_poll       = raw_socket_poll;
+  conn->conn_poll       = tls_socket_poll;
 
   return 0;
 }
@@ -188,6 +189,16 @@ static int tls_socket_write (CONNECTION* conn, const char* buf, size_t len)
   return sent;
 }
 
+static int tls_socket_poll (CONNECTION* conn, time_t wait_secs)
+{
+  tlssockdata *data = conn->sockdata;
+
+  if (gnutls_record_check_pending (data->state))
+    return 1;
+  else
+    return raw_socket_poll (conn, wait_secs);
+}
+
 static int tls_socket_open (CONNECTION* conn)
 {
   if (raw_socket_open (conn) < 0)
@@ -213,6 +224,7 @@ int mutt_ssl_starttls (CONNECTION* conn)
   conn->conn_read      = tls_socket_read;
   conn->conn_write     = tls_socket_write;
   conn->conn_close     = tls_starttls_close;
+  conn->conn_poll       = tls_socket_poll;
 
   return 0;
 }
@@ -523,6 +535,7 @@ static int tls_starttls_close (CONNECTION* conn)
   conn->conn_read = raw_socket_read;
   conn->conn_write = raw_socket_write;
   conn->conn_close = raw_socket_close;
+  conn->conn_poll = raw_socket_poll;
 
   return rc;
 }