[glib-networking/wip/pwithnall/dtls: 8/8] dtlsconnection: Fix handshaking when packets are lost



commit fe51c94c3262b6129c90ccad91102bfc7c8ab65f
Author: Olivier CrĂȘte <olivier crete collabora com>
Date:   Wed Jan 6 21:58:41 2016 -0500

    dtlsconnection: Fix handshaking when packets are lost
    
    During a handshake, the timeout is set to "-1", so blocking forever,
    this is wrong for DTLS, where the blocking should instead happen inside
    the pull_timeout function. Also, return EAGAIN during the handshake so
    that GnuTLS will do the re-tries for us internally and the re-sending as
    required.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=697908

 tls/gnutls/gtlsconnection-gnutls.c |    9 ++++++++-
 1 files changed, 8 insertions(+), 1 deletions(-)
---
diff --git a/tls/gnutls/gtlsconnection-gnutls.c b/tls/gnutls/gtlsconnection-gnutls.c
index ebd170e..82180b8 100644
--- a/tls/gnutls/gtlsconnection-gnutls.c
+++ b/tls/gnutls/gtlsconnection-gnutls.c
@@ -1362,7 +1362,13 @@ set_gnutls_error (GTlsConnectionGnutls *gnutls,
   if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED))
     gnutls_transport_set_errno (gnutls->priv->session, EINTR);
   else if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_WOULD_BLOCK))
-    gnutls_transport_set_errno (gnutls->priv->session, EINTR);
+    {
+      if (gnutls->priv->base_socket &&
+          gnutls->priv->handshaking)
+        gnutls_transport_set_errno (gnutls->priv->session, EAGAIN);
+      else
+        gnutls_transport_set_errno (gnutls->priv->session, EINTR);
+    }
   else if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_TIMED_OUT))
     gnutls_transport_set_errno (gnutls->priv->session, EINTR);
   else if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_MESSAGE_TOO_LARGE))
@@ -1394,6 +1400,7 @@ g_tls_connection_gnutls_pull_func (gnutls_transport_ptr_t  transport_data,
 
       ret = g_datagram_based_receive_messages (gnutls->priv->base_socket,
                                                &message, 1, 0,
+                                               gnutls->priv->handshaking ? 0 :
                                                gnutls->priv->read_timeout,
                                                gnutls->priv->read_cancellable,
                                                &gnutls->priv->read_error);


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]