From 75c6ca0f5d1cc9baf604ed44f1a7b68a0373357d Mon Sep 17 00:00:00 2001 From: Giuseppe Scrivano Date: Thu, 29 Jul 2010 12:24:34 +0200 Subject: [PATCH] gnutls: Fix a problem with multiple peek read calls. --- src/ChangeLog | 5 +++++ src/gnutls.c | 33 +++++++++++++++++++-------------- 2 files changed, 24 insertions(+), 14 deletions(-) diff --git a/src/ChangeLog b/src/ChangeLog index 60e82d94..30f75cd6 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,8 @@ +2010-07-29 Giuseppe Scrivano + + * gnutls.c (wgnutls_peek): Don't read more data if the buffered peek + data is sufficient. + 2010-07-28 Giuseppe Scrivano * http.h (http_loop): Add new argument `original_url' diff --git a/src/gnutls.c b/src/gnutls.c index adba8560..17c7c928 100644 --- a/src/gnutls.c +++ b/src/gnutls.c @@ -173,28 +173,33 @@ wgnutls_peek (int fd, char *buf, int bufsize, void *arg) { int ret = 0; struct wgnutls_transport_context *ctx = arg; - int offset = ctx->peeklen; - + int offset = MIN (bufsize, ctx->peeklen); if (bufsize > sizeof ctx->peekbuf) bufsize = sizeof ctx->peekbuf; - if (offset) + if (ctx->peeklen) memcpy (buf, ctx->peekbuf, offset); - do + if (bufsize > offset) { - if (gnutls_record_check_pending (ctx->session) - || select_fd (fd, 0, WAIT_FOR_READ)) - ret = gnutls_record_recv (ctx->session, buf + offset, bufsize - offset); - } - while (ret == GNUTLS_E_INTERRUPTED); + do + { + if (gnutls_record_check_pending (ctx->session) + || select_fd (fd, 0, WAIT_FOR_READ)) + ret = gnutls_record_recv (ctx->session, buf + offset, + bufsize - offset); + } + while (ret == GNUTLS_E_INTERRUPTED); - if (ret > 0) - { - memcpy (ctx->peekbuf + offset, buf + offset, ret); - ctx->peeklen += ret; + if (ret > 0) + { + memcpy (ctx->peekbuf + offset, buf + offset, + ret); + ctx->peeklen += ret; + } } - return ctx->peeklen; + + return offset + ret; } static const char * -- 2.39.2