Fix a bug recently introduced in wgnutls_peek.

This commit is contained in:
Giuseppe Scrivano 2011-04-07 12:02:07 +02:00
parent 6dca252c60
commit d18b9749d9
2 changed files with 18 additions and 10 deletions

View File

@ -1,3 +1,9 @@
2011-04-07 Giuseppe Scrivano <gscrivano@gnu.org>
* gnutls.c (wgnutls_peek): New local variable `read'.
Use `read' instead of `ret' to store the number of read bytes.
Reported by: Ray Satiro <raysatiro@yahoo.com>
2011-04-04 Giuseppe Scrivano <gscrivano@gnu.org> 2011-04-04 Giuseppe Scrivano <gscrivano@gnu.org>
* openssl.c [WINDOWS]: Include <w32sock.h>. * openssl.c [WINDOWS]: Include <w32sock.h>.

View File

@ -173,7 +173,7 @@ wgnutls_poll (int fd, double timeout, int wait_for, void *arg)
static int static int
wgnutls_peek (int fd, char *buf, int bufsize, void *arg) wgnutls_peek (int fd, char *buf, int bufsize, void *arg)
{ {
int ret = 0; int ret = 0, read = 0;
struct wgnutls_transport_context *ctx = arg; struct wgnutls_transport_context *ctx = arg;
int offset = MIN (bufsize, ctx->peeklen); int offset = MIN (bufsize, ctx->peeklen);
if (bufsize > sizeof ctx->peekbuf) if (bufsize > sizeof ctx->peekbuf)
@ -203,27 +203,29 @@ wgnutls_peek (int fd, char *buf, int bufsize, void *arg)
do do
{ {
ret = gnutls_record_recv (ctx->session, buf + offset, ret = gnutls_record_recv (ctx->session, buf + offset,
bufsize - offset); bufsize - offset);
} }
while (ret == GNUTLS_E_INTERRUPTED); while (ret == GNUTLS_E_INTERRUPTED);
if (ret < 0) read = ret;
if (read < 0)
{ {
if (offset) if (offset)
ret = 0; read = 0;
else else
return ret; return read;
} }
if (ret > 0) if (read > 0)
{ {
memcpy (ctx->peekbuf + offset, buf + offset, memcpy (ctx->peekbuf + offset, buf + offset,
ret); read);
ctx->peeklen += ret; ctx->peeklen += read;
} }
#ifdef F_GETFL #ifdef F_GETFL
fcntl (fd, F_SETFL, flags); ret = fcntl (fd, F_SETFL, flags);
if (ret < 0) if (ret < 0)
return ret; return ret;
#else #else
@ -234,7 +236,7 @@ wgnutls_peek (int fd, char *buf, int bufsize, void *arg)
#endif #endif
} }
return offset + ret; return offset + read;
} }
static const char * static const char *