]> sjero.net Git - wget/commitdiff
Fix some problems with GNU TLS.
authorGiuseppe Scrivano <gscrivano@gnu.org>
Mon, 14 Jun 2010 17:40:03 +0000 (19:40 +0200)
committerGiuseppe Scrivano <gscrivano@gnu.org>
Mon, 14 Jun 2010 17:40:03 +0000 (19:40 +0200)
NEWS
src/ChangeLog
src/gnutls.c

diff --git a/NEWS b/NEWS
index 992e3ab74484dc6005cac777390afccf361c7e02..eec503f507a0f0592742cf28cf4d460a4e4ffe82 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -29,6 +29,8 @@ Please send GNU Wget bug reports to <bug-wget@gnu.org>.
 
 ** Report the average transfer speed correctly when multiple URL's are specified
    and -c influences the transferred data amount.
+
+** GNU TLS backend works again.
 \f
 * Changes in Wget 1.12
 
index 84cdfc2ed4d52e90b3c42aa8ba3c7566acab4886..283e2d28455d4de5d42fe656299c374ca3d6e723 100644 (file)
@@ -1,5 +1,14 @@
 2010-06-14  Giuseppe Scrivano  <gscrivano@gnu.org>
 
+       * gnutls.c: Include <stdlib.h>.
+       (struct wgnutls_transport_context): Remove `peekstart'.
+       (ssl_connect_wget): Renamed from `ssl_connect'.
+       (wgnutls_poll): New variable `ctx'.
+       (wgnutls_read): Don't use `ctx->peekstart'.
+       (wgnutls_peek): Likewise.  Don't attempt to read if there is not
+       ready data.
+
+2010-06-14  Giuseppe Scrivano  <gscrivano@gnu.org>
        * http.c (http_loop): Always send a HEAD request when -N is used
        together with --content-disposition.
        Reported by: Jochen Roderburg <Roderburg@Uni-Koeln.DE>.
index 6d30a5d5c66f58caf5882affe12c632cb7562ee4..30ed5e17f7d81cabae04e6075f23935fa0eb4468 100644 (file)
@@ -37,6 +37,7 @@ as that of the covered work.  */
 #endif
 #include <string.h>
 #include <stdio.h>
+#include <stdlib.h>
 
 #include <gnutls/gnutls.h>
 #include <gnutls/x509.h>
@@ -73,7 +74,7 @@ struct wgnutls_transport_context {
      is stored to PEEKBUF, and wgnutls_read checks that buffer before
      actually reading.  */
   char peekbuf[512];
-  int peekstart, peeklen;
+  int peeklen;
 };
 
 #ifndef MIN
@@ -83,19 +84,18 @@ struct wgnutls_transport_context {
 static int
 wgnutls_read (int fd, char *buf, int bufsize, void *arg)
 {
-  int ret;
+  int ret = 0;
   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 + ctx->peekstart, copysize);
+      memcpy (buf, ctx->peekbuf, copysize);
       ctx->peeklen -= copysize;
       if (ctx->peeklen != 0)
-        ctx->peekstart += copysize;
-      else
-        ctx->peekstart = 0;
+        memmove (ctx->peekbuf, ctx->peekbuf + copysize, ctx->peeklen);
+
       return copysize;
     }
 
@@ -124,31 +124,38 @@ wgnutls_write (int fd, char *buf, int bufsize, void *arg)
 static int
 wgnutls_poll (int fd, double timeout, int wait_for, void *arg)
 {
-  return 1;
+  struct wgnutls_transport_context *ctx = arg;
+  return ctx->peeklen || gnutls_record_check_pending (ctx->session)
+    || select_fd (fd, timeout, wait_for);
 }
 
 static int
 wgnutls_peek (int fd, char *buf, int bufsize, void *arg)
 {
-  int ret;
+  int ret = 0;
   struct wgnutls_transport_context *ctx = arg;
+  int offset = ctx->peeklen;
 
-  /* We don't support peeks following peeks: the reader must drain all
-     peeked data before the next peek.  */
-  assert (ctx->peeklen == 0);
   if (bufsize > sizeof ctx->peekbuf)
     bufsize = sizeof ctx->peekbuf;
 
+  if (offset)
+    memcpy (buf, ctx->peekbuf, offset);
+
   do
-    ret = gnutls_record_recv (ctx->session, buf, bufsize);
+    {
+      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)
+  if (ret > 0)
     {
-      memcpy (ctx->peekbuf, buf, ret);
-      ctx->peeklen = ret;
+      memcpy (ctx->peekbuf + offset, buf + offset, ret);
+      ctx->peeklen += ret;
     }
-  return ret;
+  return ctx->peeklen;
 }
 
 static const char *
@@ -177,7 +184,7 @@ static struct transport_implementation wgnutls_transport = {
 };
 
 bool
-ssl_connect (int fd)
+ssl_connect_wget (int fd)
 {
   static const int cert_type_priority[] = {
     GNUTLS_CRT_X509, GNUTLS_CRT_OPENPGP, 0