1
0
mirror of https://github.com/moparisthebest/wget synced 2024-07-03 16:38:41 -04:00

Fix some problems with the GNU TLS backend and not-blocking sockets.

This commit is contained in:
Giuseppe Scrivano 2011-08-29 16:21:45 +02:00
parent a024990e18
commit 66bbc5bc63
2 changed files with 58 additions and 30 deletions

View File

@ -1,3 +1,9 @@
2011-08-29 Giuseppe Scrivano <gscrivano@gnu.org>
* gnutls.c (wgnutls_read_timeout): New function.
(wgnutls_read): Use wgnutls_read_timeout.
(wgnutls_peek): Likewise.
2011-08-27 Giuseppe Scrivano <gscrivano@gnu.org> 2011-08-27 Giuseppe Scrivano <gscrivano@gnu.org>
* main.c (print_help): Exit with an error status if print to stdout * main.c (print_help): Exit with an error status if print to stdout

View File

@ -58,7 +58,6 @@ as that of the covered work. */
preprocessor macro. */ preprocessor macro. */
static gnutls_certificate_credentials credentials; static gnutls_certificate_credentials credentials;
bool bool
ssl_init () ssl_init ()
{ {
@ -123,8 +122,9 @@ struct wgnutls_transport_context
# define MIN(i, j) ((i) <= (j) ? (i) : (j)) # define MIN(i, j) ((i) <= (j) ? (i) : (j))
#endif #endif
static int static int
wgnutls_read (int fd, char *buf, int bufsize, void *arg) wgnutls_read_timeout (int fd, char *buf, int bufsize, void *arg, double timeout)
{ {
#ifdef F_GETFL #ifdef F_GETFL
int flags = 0; int flags = 0;
@ -132,20 +132,9 @@ wgnutls_read (int fd, char *buf, int bufsize, void *arg)
int ret = 0; int ret = 0;
struct ptimer *timer; struct ptimer *timer;
struct wgnutls_transport_context *ctx = arg; struct wgnutls_transport_context *ctx = arg;
int timed_out = 0;
if (ctx->peeklen) if (timeout)
{
/* If we have any peek data, simply return that. */
int copysize = MIN (bufsize, ctx->peeklen);
memcpy (buf, ctx->peekbuf, copysize);
ctx->peeklen -= copysize;
if (ctx->peeklen != 0)
memmove (ctx->peekbuf, ctx->peekbuf + copysize, ctx->peeklen);
return copysize;
}
if (opt.read_timeout)
{ {
#ifdef F_GETFL #ifdef F_GETFL
flags = fcntl (fd, F_GETFL, 0); flags = fcntl (fd, F_GETFL, 0);
@ -169,27 +158,61 @@ wgnutls_read (int fd, char *buf, int bufsize, void *arg)
do do
{ {
do double timeout = timeout - ptimer_measure (timer);
ret = gnutls_record_recv (ctx->session, buf, bufsize); if (timeout < 0)
while (ret == GNUTLS_E_INTERRUPTED || ret == GNUTLS_E_AGAIN); break;
}
while (opt.read_timeout == 0 || ptimer_measure (timer) < opt.read_timeout);
if (opt.read_timeout) ret = GNUTLS_E_AGAIN;
if (timeout == 0 || gnutls_record_check_pending (ctx->session)
|| select_fd (fd, timeout, WAIT_FOR_READ))
ret = gnutls_record_recv (ctx->session, buf, bufsize);
timed_out = timeout && ptimer_measure (timer) >= timeout;
}
while (ret == GNUTLS_E_INTERRUPTED || (ret == GNUTLS_E_AGAIN && !timed_out));
if (timeout)
{ {
int status;
ptimer_destroy (timer); ptimer_destroy (timer);
#ifdef F_GETFL #ifdef F_GETFL
ret = fcntl (fd, F_SETFL, flags); status = fcntl (fd, F_SETFL, flags);
if (ret < 0) if (status < 0)
return ret; return status;
#else #else
const int zero = 0; const int zero = 0;
ret = ioctl (fd, FIONBIO, &zero); status = ioctl (fd, FIONBIO, &zero);
if (ret < 0) if (status < 0)
return ret; return status;
#endif #endif
} }
return ret;
}
static int
wgnutls_read (int fd, char *buf, int bufsize, void *arg)
{
#ifdef F_GETFL
int flags = 0;
#endif
int ret = 0;
struct ptimer *timer;
struct wgnutls_transport_context *ctx = arg;
if (ctx->peeklen)
{
/* If we have any peek data, simply return that. */
int copysize = MIN (bufsize, ctx->peeklen);
memcpy (buf, ctx->peekbuf, copysize);
ctx->peeklen -= copysize;
if (ctx->peeklen != 0)
memmove (ctx->peekbuf, ctx->peekbuf + copysize, ctx->peeklen);
return copysize;
}
ret = wgnutls_read_timeout (fd, buf, bufsize, arg, opt.read_timeout);
if (ret < 0) if (ret < 0)
ctx->last_error = ret; ctx->last_error = ret;
@ -235,9 +258,8 @@ wgnutls_peek (int fd, char *buf, int bufsize, void *arg)
&& select_fd (fd, 0.0, WAIT_FOR_READ) <= 0) && select_fd (fd, 0.0, WAIT_FOR_READ) <= 0)
read = 0; read = 0;
else else
read = gnutls_record_recv (ctx->session, buf + offset, read = wgnutls_read_timeout (fd, buf + offset, bufsize - offset,
bufsize - offset); ctx->session, opt.read_timeout);
if (read < 0) if (read < 0)
{ {
if (offset) if (offset)