From d18b9749d94b29856ceecfd30ebda958bd954f55 Mon Sep 17 00:00:00 2001 From: Giuseppe Scrivano Date: Thu, 7 Apr 2011 12:02:07 +0200 Subject: [PATCH] Fix a bug recently introduced in wgnutls_peek. --- src/ChangeLog | 6 ++++++ src/gnutls.c | 22 ++++++++++++---------- 2 files changed, 18 insertions(+), 10 deletions(-) diff --git a/src/ChangeLog b/src/ChangeLog index 001b62e2..fb42a544 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,9 @@ +2011-04-07 Giuseppe Scrivano + + * gnutls.c (wgnutls_peek): New local variable `read'. + Use `read' instead of `ret' to store the number of read bytes. + Reported by: Ray Satiro + 2011-04-04 Giuseppe Scrivano * openssl.c [WINDOWS]: Include . diff --git a/src/gnutls.c b/src/gnutls.c index 2e5f89a7..1d631629 100644 --- a/src/gnutls.c +++ b/src/gnutls.c @@ -173,7 +173,7 @@ wgnutls_poll (int fd, double timeout, int wait_for, void *arg) static int wgnutls_peek (int fd, char *buf, int bufsize, void *arg) { - int ret = 0; + int ret = 0, read = 0; struct wgnutls_transport_context *ctx = arg; int offset = MIN (bufsize, ctx->peeklen); if (bufsize > sizeof ctx->peekbuf) @@ -203,27 +203,29 @@ wgnutls_peek (int fd, char *buf, int bufsize, void *arg) do { ret = gnutls_record_recv (ctx->session, buf + offset, - bufsize - offset); + bufsize - offset); } while (ret == GNUTLS_E_INTERRUPTED); - if (ret < 0) + read = ret; + + if (read < 0) { if (offset) - ret = 0; + read = 0; else - return ret; + return read; } - if (ret > 0) + if (read > 0) { memcpy (ctx->peekbuf + offset, buf + offset, - ret); - ctx->peeklen += ret; + read); + ctx->peeklen += read; } #ifdef F_GETFL - fcntl (fd, F_SETFL, flags); + ret = fcntl (fd, F_SETFL, flags); if (ret < 0) return ret; #else @@ -234,7 +236,7 @@ wgnutls_peek (int fd, char *buf, int bufsize, void *arg) #endif } - return offset + ret; + return offset + read; } static const char * -- 2.39.2