Since we need to have a release because of the OpenSSL legalese, we can as well fix the most important (crashing) bugs in 1.8.1. I have opened a branch named `branch-1_8_2' where the 1.8.2-specific changes will be applied.
Note that only bug fixes will be accepted for 1.8.2. No new features. Here are the patches that I plan to apply initially. Please let me know if you have more. Only in wget-1.8.1-patched/src: fl diff -ru wget-1.8.1/src/gen_sslfunc.c wget-1.8.1-patched/src/gen_sslfunc.c --- wget-1.8.1/src/gen_sslfunc.c Mon Dec 17 15:05:08 2001 +++ wget-1.8.1-patched/src/gen_sslfunc.c Sat Apr 13 01:01:30 2002 @@ -221,9 +221,8 @@ do { #ifdef HAVE_SELECT - if (opt.timeout) + if (opt.timeout && !SSL_pending (con)) { - do { res = select_fd (fd, opt.timeout, 0); diff -ru wget-1.8.1/src/headers.c wget-1.8.1-patched/src/headers.c --- wget-1.8.1/src/headers.c Fri Nov 16 20:57:43 2001 +++ wget-1.8.1-patched/src/headers.c Sat Apr 13 01:08:02 2002 @@ -64,8 +64,8 @@ as much memory as necessary for it to fit. It need not contain a `:', thus you can use it to retrieve, say, HTTP status line. - The trailing CRLF or LF are stripped from the header, and it is - zero-terminated. #### Is this well-behaved? */ + All trailing whitespace is stripped from the header, and it is + zero-terminated. */ int header_get (struct rbuf *rbuf, char **hdr, enum header_get_flags flags) { @@ -101,11 +101,13 @@ if (next == '\t' || next == ' ') continue; } - /* The header ends. */ + + /* Strip trailing whitespace. (*hdr)[i] is the newline; + decrement I until it points to the last available + whitespace. */ + while (i > 0 && ISSPACE ((*hdr)[i - 1])) + --i; (*hdr)[i] = '\0'; - /* Get rid of '\r'. */ - if (i > 0 && (*hdr)[i - 1] == '\r') - (*hdr)[i - 1] = '\0'; break; } } diff -ru wget-1.8.1/src/html-url.c wget-1.8.1-patched/src/html-url.c --- wget-1.8.1/src/html-url.c Wed Dec 19 02:15:34 2001 +++ wget-1.8.1-patched/src/html-url.c Sat Apr 13 00:59:02 2002 @@ -521,10 +521,13 @@ get to the URL. */ struct urlpos *entry; - int attrind; - char *p, *refresh = find_attr (tag, "content", &attrind); int timeout = 0; + char *p; + + char *refresh = find_attr (tag, "content", &attrind); + if (!refresh) + return; for (p = refresh; ISDIGIT (*p); p++) timeout = 10 * timeout + *p - '0'; diff -ru wget-1.8.1/src/http.c wget-1.8.1-patched/src/http.c --- wget-1.8.1/src/http.c Thu Dec 13 17:46:56 2001 +++ wget-1.8.1-patched/src/http.c Sat Apr 13 01:05:20 2002 @@ -1215,6 +1215,8 @@ /* In case the caller inspects. */ hs->len = contlen; hs->res = 0; + /* Mark as successfully retrieved. */ + *dt |= RETROKF; FREE_MAYBE (type); FREE_MAYBE (all_headers); CLOSE_INVALIDATE (sock); /* would be CLOSE_FINISH, but there @@ -1357,6 +1359,11 @@ (contlen != -1 ? contlen : 0), &rbuf, keep_alive, &hs->dltime); + if (hs->res >= 0) + CLOSE_FINISH (sock); + else + CLOSE_INVALIDATE (sock); + { /* Close or flush the file. We have to be careful to check for error here. Checking the result of fwrite() is not enough -- @@ -1370,7 +1377,6 @@ hs->res = -2; } FREE_MAYBE (all_headers); - CLOSE_FINISH (sock); if (hs->res == -2) return FWRITEERR; return RETRFINISHED; Only in wget-1.8.1-patched/src: http.c.orig diff -ru wget-1.8.1/src/netrc.c wget-1.8.1-patched/src/netrc.c --- wget-1.8.1/src/netrc.c Fri Nov 30 10:33:22 2001 +++ wget-1.8.1-patched/src/netrc.c Sat Apr 13 01:01:58 2002 @@ -280,6 +280,10 @@ p = line; quote = 0; + /* Skip leading whitespace. */ + while (*p && ISSPACE (*p)) + p ++; + /* If the line is empty, then end any macro definition. */ if (last_token == tok_macdef && !*p) /* End of macro if the line is empty. */ diff -ru wget-1.8.1/src/recur.c wget-1.8.1-patched/src/recur.c --- wget-1.8.1/src/recur.c Wed Dec 19 15:27:29 2001 +++ wget-1.8.1-patched/src/recur.c Sat Apr 13 00:57:08 2002 @@ -186,15 +186,24 @@ uerr_t status = RETROK; /* The queue of URLs we need to load. */ - struct url_queue *queue = url_queue_new (); + struct url_queue *queue; /* The URLs we do not wish to enqueue, because they are already in the queue, but haven't been downloaded yet. */ - struct hash_table *blacklist = make_string_hash_table (0); + struct hash_table *blacklist; - /* We'll need various components of this, so better get it over with - now. */ - struct url *start_url_parsed = url_parse (start_url, NULL); + int up_error_code; + struct url *start_url_parsed = url_parse (start_url, &up_error_code); + + if (!start_url_parsed) + { + logprintf (LOG_NOTQUIET, "%s: %s.\n", start_url, + url_error (up_error_code)); + return URLERROR; + } + + queue = url_queue_new (); + blacklist = make_string_hash_table (0); /* Enqueue the starting URL. Use start_url_parsed->url rather than just URL so we enqueue the canonical form of the URL. */ diff -ru wget-1.8.1/src/url.c wget-1.8.1-patched/src/url.c --- wget-1.8.1/src/url.c Fri Dec 14 16:45:59 2001 +++ wget-1.8.1-patched/src/url.c Sat Apr 13 01:04:37 2002 @@ -528,6 +528,11 @@ memcpy (*user, str, len); (*user)[len] = '\0'; + if (*user) + decode_string (*user); + if (*passwd) + decode_string (*passwd); + return 1; } @@ -1574,6 +1579,35 @@ memcpy (constr, base, baselength); memcpy (constr + baselength, link, linklength); constr[baselength + linklength] = '\0'; + } + else if (linklength > 1 && *link == '/' && *(link + 1) == '/') + { + /* LINK begins with "//" and so is a net path: we need to + replace everything after (and including) the double slash + with LINK. + + So, if BASE is "http://oldhost/whatever/foo/bar", and LINK + is "//newhost/qux/xyzzy", our result should be + "http://newhost/qux/xyzzy". */ + int span; + const char *slash; + const char *start_insert; + /* Look for first slash. */ + slash = memchr (base, '/', end - base); + /* If found slash and it is a double slash, then replace + from this point, + else default to replacing from the beginning. */ + if (slash && *(slash + 1) == '/') + start_insert = slash; + else + start_insert = base; + + span = start_insert - base; + constr = (char *)xmalloc (span + linklength + 1); + if (span) + memcpy (constr, base, span); + memcpy (constr + span, link, linklength); + constr[span + linklength] = '\0'; } else if (*link == '/') { Only in wget-1.8.1-patched/src: url.c.orig diff -ru wget-1.8.1/src/wget.h wget-1.8.1-patched/src/wget.h --- wget-1.8.1/src/wget.h Mon Dec 10 06:31:45 2001 +++ wget-1.8.1-patched/src/wget.h Sat Apr 13 01:02:30 2002 @@ -251,8 +251,9 @@ XREALLOC_ARRAY (basevar, type, do_realloc_newsize); \ else \ { \ - void *drfa_new_basevar = xmalloc (do_realloc_newsize); \ - memcpy (drfa_new_basevar, basevar, (sizevar)); \ + void *drfa_new_basevar = \ + xmalloc (do_realloc_newsize * sizeof (type)); \ + memcpy (drfa_new_basevar, basevar, (sizevar) * sizeof (type)); \ (basevar) = drfa_new_basevar; \ allocap = 0; \ } \