From ea965339038ddc3c8646811351b1a482b8fb296b Mon Sep 17 00:00:00 2001 From: Giuseppe Scrivano Date: Sun, 24 Oct 2010 01:21:01 +0200 Subject: [PATCH] gnutls: Read correctly last chunk of data. --- src/ChangeLog | 5 +++++ src/gnutls.c | 14 +++++++++++--- 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/src/ChangeLog b/src/ChangeLog index a3b7921f..4c17f4a4 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,8 @@ +2010-10-24 Giuseppe Scrivano + + * gnutls.c (wgnutls_peek): Do not return an error when + `gnutls_record_recv' fails but some data is already available. + 2010-10-23 Giuseppe Scrivano * Makefile.am (LIBS): Remove @LIBGNUTLS@ and use @W32LIBS@ as last diff --git a/src/gnutls.c b/src/gnutls.c index 440b1aed..1bf4aefd 100644 --- a/src/gnutls.c +++ b/src/gnutls.c @@ -104,7 +104,8 @@ ssl_init () return true; } -struct wgnutls_transport_context { +struct wgnutls_transport_context +{ gnutls_session session; /* GnuTLS session handle */ int last_error; /* last error returned by read/write/... */ @@ -144,6 +145,7 @@ wgnutls_read (int fd, char *buf, int bufsize, void *arg) if (ret < 0) ctx->last_error = ret; + return ret; } @@ -190,7 +192,12 @@ wgnutls_peek (int fd, char *buf, int bufsize, void *arg) while (ret == GNUTLS_E_INTERRUPTED); if (ret < 0) - return ret; + { + if (offset) + ret = 0; + else + return ret; + } if (ret > 0) { @@ -223,7 +230,8 @@ wgnutls_close (int fd, void *arg) /* gnutls_transport is the singleton that describes the SSL transport methods provided by this file. */ -static struct transport_implementation wgnutls_transport = { +static struct transport_implementation wgnutls_transport = +{ wgnutls_read, wgnutls_write, wgnutls_poll, wgnutls_peek, wgnutls_errstr, wgnutls_close };