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 *