Commit 28bac996 authored by Mark Brand's avatar Mark Brand Committed by Daniel Stenberg
Browse files

gnutls: only translate winsock errors for old versions

Bugfix: https handshake fails using gnutls 3 on windows
http://sourceforge.net/tracker/index.php?func=detail&aid=3441084&group_id=976&atid=100976

New gnutls versions have an error handler that knows about Winsock
errors, which is why gnutls_transport_set_global_errno() was deprecated
and then removed.

This is a correction of commit f5bb3701 (blame me) which meant to
reimplement gnutls_transport_set_global_errno(), which is not necessary.
parent 7248439f
Loading
Loading
Loading
Loading
+9 −6
Original line number Diff line number Diff line
@@ -80,15 +80,17 @@ static void tls_log_func(int level, const char *str)
#endif
static bool gtls_inited = FALSE;

#undef MAP_WINSOCK_ERRORS
#if defined(GNUTLS_VERSION_NUMBER)
#  if (GNUTLS_VERSION_NUMBER >= 0x020c00)
#    undef gnutls_transport_set_lowat
#    define gnutls_transport_set_lowat(A,B) Curl_nop_stmt
#    define USE_GNUTLS_PRIORITY_SET_DIRECT 1
#  endif
#  if (GNUTLS_VERSION_NUMBER >= 0x020c03)
#    undef gnutls_transport_set_global_errno
#    define gnutls_transport_set_global_errno(A) SET_ERRNO((A))
#  if (GNUTLS_VERSION_NUMBER < 0x020c03)
#    ifdef USE_WINSOCK
#      define MAP_WINSOCK_ERRORS
#    endif
#  endif
#endif

@@ -100,6 +102,7 @@ static bool gtls_inited = FALSE;
 * us to get specific about the fourth "flags" argument, and to use arbitrary
 * private data with gnutls_transport_set_ptr if we wish.
 *
 * For old gnutls versions, curl must translate Winsock errors:
 * When these custom push and pull callbacks fail, GNU TLS checks its own
 * session-specific error variable, and when not set also its own global
 * errno variable, in order to take appropriate action. GNU TLS does not
@@ -111,7 +114,7 @@ static bool gtls_inited = FALSE;
 * error translation must take place in these callbacks.
 */

#ifdef USE_WINSOCK
#ifdef MAP_WINSOCK_ERRORS
#  define gtls_EINTR  4
#  define gtls_EIO    5
#  define gtls_EAGAIN 11
@@ -132,7 +135,7 @@ static int gtls_mapped_sockerrno(void)
static ssize_t Curl_gtls_push(void *s, const void *buf, size_t len)
{
  ssize_t ret = swrite(GNUTLS_POINTER_TO_INT_CAST(s), buf, len);
#ifdef USE_WINSOCK
#ifdef MAP_WINSOCK_ERRORS
  if(ret < 0)
    gnutls_transport_set_global_errno(gtls_mapped_sockerrno());
#endif
@@ -142,7 +145,7 @@ static ssize_t Curl_gtls_push(void *s, const void *buf, size_t len)
static ssize_t Curl_gtls_pull(void *s, void *buf, size_t len)
{
  ssize_t ret = sread(GNUTLS_POINTER_TO_INT_CAST(s), buf, len);
#ifdef USE_WINSOCK
#ifdef MAP_WINSOCK_ERRORS
  if(ret < 0)
    gnutls_transport_set_global_errno(gtls_mapped_sockerrno());
#endif