[glib-networking] gnutls: fix G_TLS_ERROR_EOF handling with gnutls 3.0



commit 9e2aaacafb45d51cff57dc033f4b5ad5bc1a1762
Author: Dan Winship <danw gnome org>
Date:   Fri Sep 16 11:29:29 2011 -0400

    gnutls: fix G_TLS_ERROR_EOF handling with gnutls 3.0
    
    gnutls 3.0 has a new error code for "peer closed connection without
    sending a Close packet", so add some #ifdefs to do the right thing
    with either 2.x or 3.x.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=659233

 tls/gnutls/gtlsconnection-gnutls.c |   30 +++++++++++++++++++-----------
 1 files changed, 19 insertions(+), 11 deletions(-)
---
diff --git a/tls/gnutls/gtlsconnection-gnutls.c b/tls/gnutls/gtlsconnection-gnutls.c
index c1ede79..0f792bb 100644
--- a/tls/gnutls/gtlsconnection-gnutls.c
+++ b/tls/gnutls/gtlsconnection-gnutls.c
@@ -132,7 +132,10 @@ struct _GTlsConnectionGnutlsPrivate
 
   GError *error;
   GCancellable *cancellable;
-  gboolean blocking, eof;
+  gboolean blocking;
+#ifndef GNUTLS_E_PREMATURE_TERMINATION
+  gboolean eof;
+#endif
   GIOCondition internal_direction;
 };
 
@@ -548,19 +551,22 @@ end_gnutls_io (GTlsConnectionGnutls  *gnutls,
       gnutls->priv->need_handshake = TRUE;
       return status;
     }
-  else if (status == GNUTLS_E_UNEXPECTED_PACKET_LENGTH)
+  else if (
+#ifdef GNUTLS_E_PREMATURE_TERMINATION
+	   status == GNUTLS_E_PREMATURE_TERMINATION
+#else
+	   status == GNUTLS_E_UNEXPECTED_PACKET_LENGTH && gnutls->priv->eof
+#endif
+	   )
     {
-      if (gnutls->priv->eof)
+      if (gnutls->priv->require_close_notify)
 	{
-	  if (gnutls->priv->require_close_notify)
-	    {
-	      g_set_error_literal (error, G_TLS_ERROR, G_TLS_ERROR_EOF,
-				   _("TLS connection closed unexpectedly"));
-	      return status;
-	    }
-	  else
-	    return 0;
+	  g_set_error_literal (error, G_TLS_ERROR, G_TLS_ERROR_EOF,
+			       _("TLS connection closed unexpectedly"));
+	  return status;
 	}
+      else
+	return 0;
     }
 
   return status;
@@ -795,8 +801,10 @@ g_tls_connection_gnutls_pull_func (gnutls_transport_ptr_t  transport_data,
 
   if (ret < 0)
     set_gnutls_error (gnutls, G_IO_IN);
+#ifndef GNUTLS_E_PREMATURE_TERMINATION
   else if (ret == 0)
     gnutls->priv->eof = TRUE;
+#endif
 
   return ret;
 }



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