]> git.sesse.net Git - vlc/commitdiff
Handle fatal errors properly past TLS handshake (close #887)
authorRémi Denis-Courmont <rem@videolan.org>
Thu, 7 Dec 2006 08:39:45 +0000 (08:39 +0000)
committerRémi Denis-Courmont <rem@videolan.org>
Thu, 7 Dec 2006 08:39:45 +0000 (08:39 +0000)
modules/misc/gnutls.c

index d63b8331db1340d4ece452cf7fc16df5c3b19572..3e15f2fc7cf15d3647f2588b7fad04b877d7dc0c 100644 (file)
@@ -150,6 +150,30 @@ typedef struct tls_client_sys_t
 } tls_client_sys_t;
 
 
+static int gnutls_Error (vlc_object_t *obj, int val)
+{
+    switch (val)
+    {
+        case GNUTLS_E_AGAIN:
+            errno = EAGAIN;
+            break;
+
+        case GNUTLS_E_INTERRUPTED:
+            errno = EINTR;
+            break;
+
+        default:
+            msg_Err (obj, "%s", gnutls_strerror (val));
+#ifdef DEBUG
+            if (!gnutls_error_is_fatal (val))
+                msg_Err (obj, "Error above should be handled");
+#endif
+            errno = ECONNRESET;
+    }
+    return -1;
+}
+
+
 /**
  * Sends data through a TLS session.
  */
@@ -162,8 +186,7 @@ gnutls_Send( void *p_session, const void *buf, int i_length )
     p_sys = (tls_session_sys_t *)(((tls_session_t *)p_session)->p_sys);
 
     val = gnutls_record_send( p_sys->session, buf, i_length );
-    /* TODO: handle fatal error */
-    return val < 0 ? -1 : val;
+    return (val < 0) ? gnutls_Error ((vlc_object_t *)p_session, val) : val;
 }
 
 
@@ -179,8 +202,7 @@ gnutls_Recv( void *p_session, void *buf, int i_length )
     p_sys = (tls_session_sys_t *)(((tls_session_t *)p_session)->p_sys);
 
     val = gnutls_record_recv( p_sys->session, buf, i_length );
-    /* TODO: handle fatal error */
-    return val < 0 ? -1 : val;
+    return (val < 0) ? gnutls_Error ((vlc_object_t *)p_session, val) : val;
 }
 
 
@@ -213,7 +235,7 @@ gnutls_ContinueHandshake( tls_session_t *p_session)
 #ifdef WIN32
         msg_Dbg( p_session, "Winsock error %d", WSAGetLastError( ) );
 #endif
-        msg_Err( p_session, "TLS handshake failed: %s",
+        msg_Err( p_session, "TLS handshake error: %s",
                  gnutls_strerror( val ) );
         p_session->pf_close( p_session );
         return -1;