bug-wget
[Top][All Lists]
Advanced

[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



reply via email to

[Prev in Thread] Current Thread [Next in Thread]