[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Bug-wget] [PATCH] gnutls.c: fix infinite read timeout
From: |
Giuseppe Scrivano |
Subject: |
Re: [Bug-wget] [PATCH] gnutls.c: fix infinite read timeout |
Date: |
Sat, 19 May 2012 13:08:44 +0200 |
User-agent: |
Gnus/5.13 (Gnus v5.13) Emacs/23.4 (gnu/linux) |
thanks again for your contribution! The patch seems ok to me. Could
you please also provide a complete entry for the ChangeLog file?
> Subject: [PATCH] * gnutls.c fix infinite read timeout
As a side note, if you would like to include the ChangeLog entry in the
commit message, please keep a simple description of the change as the
first line.
Giuseppe
Tim Ruehsen <address@hidden> writes:
> Hi,
>
> I finally got --timeout=0 working together with gnutls.
>
> After all it is about two lines in wgnutls_peek().
>
> I lost a few hours in debugging the polling/select/peek/blocking mechanism of
> wget which came together with reading into gnutls. But who knows what it is
> good for ;-)
>
> Tim
>
> From 20638ef4da3a53ddc962e36a2b1aba6a89da6dd0 Mon Sep 17 00:00:00 2001
> From: Tim Ruehsen <address@hidden>
> Date: Fri, 18 May 2012 13:23:56 +0200
>
> ---
> src/gnutls.c | 30 +++++++++++++++++++-----------
> 1 file changed, 19 insertions(+), 11 deletions(-)
>
> diff --git a/src/gnutls.c b/src/gnutls.c
> index 9847ab4..32c6d17 100644
> --- a/src/gnutls.c
> +++ b/src/gnutls.c
> @@ -216,11 +216,11 @@ wgnutls_read_timeout (int fd, char *buf, int bufsize,
> void *arg, double timeout)
> {
> double next_timeout = 0;
> if (timeout)
> - {
> - next_timeout = timeout - ptimer_measure (timer);
> - if (next_timeout < 0)
> - break;
> - }
> + {
> + next_timeout = timeout - ptimer_measure (timer);
> + if (next_timeout < 0)
> + break;
> + }
>
> ret = GNUTLS_E_AGAIN;
> if (timeout == 0 || gnutls_record_check_pending (ctx->session)
> @@ -294,8 +294,12 @@ static int
> wgnutls_poll (int fd, double timeout, int wait_for, void *arg)
> {
> struct wgnutls_transport_context *ctx = arg;
> - return ctx->peeklen || gnutls_record_check_pending (ctx->session)
> - || select_fd (fd, timeout, wait_for);
> +
> + if (timeout)
> + return ctx->peeklen || gnutls_record_check_pending (ctx->session)
> + || select_fd (fd, timeout, wait_for);
> + else
> + return ctx->peeklen || gnutls_record_check_pending (ctx->session);
> }
>
> static int
> @@ -304,15 +308,19 @@ wgnutls_peek (int fd, char *buf, int bufsize, void *arg)
> int read = 0;
> struct wgnutls_transport_context *ctx = arg;
> int offset = MIN (bufsize, ctx->peeklen);
> - if (bufsize > sizeof ctx->peekbuf)
> - bufsize = sizeof ctx->peekbuf;
>
> if (ctx->peeklen)
> - memcpy (buf, ctx->peekbuf, offset);
> + {
> + memcpy (buf, ctx->peekbuf, offset);
> + return offset;
> + }
> +
> + if (bufsize > sizeof ctx->peekbuf)
> + bufsize = sizeof ctx->peekbuf;
>
> if (bufsize > offset)
> {
> - if (gnutls_record_check_pending (ctx->session) <= 0
> + if (opt.read_timeout && gnutls_record_check_pending (ctx->session) == 0
> && select_fd (fd, 0.0, WAIT_FOR_READ) <= 0)
> read = 0;
> else