| http://bugs.gentoo.org/329941 |
| |
| based on upstream commit, but tweaked to work with wget-1.12 and |
| remove useless style changes |
| |
| ------------------------------------------------------------ |
| revno: 2409 |
| committer: Giuseppe Scrivano <gscrivano@gnu.org> |
| branch nick: wget |
| timestamp: Wed 2010-07-28 21:22:22 +0200 |
| message: |
| Introduce --trust-server-names. Close CVE-2010-2252. |
| diff: |
| |
| NEWS: |
| ** By default, on server redirects, use the original URL to get the |
| local file name. Close CVE-2010-2252. |
| |
| ChangeLog: |
| 2010-07-28 Giuseppe Scrivano <gscrivano@gnu.org> |
| |
| * http.h (http_loop): Add new argument `original_url' |
| * http.c (http_loop): Add new argument `original_url'. Use |
| `original_url' to get a filename if `trustservernames' is false. |
| |
| * init.c (commands): Add "trustservernames". |
| |
| * options.h (library): Add variable `trustservernames'. |
| |
| * main.c (option_data): Add trust-server-names. |
| (print_help): Describe --trust-server-names. |
| |
| * retr.c (retrieve_url): Pass new argument to `http_loop'. |
| |
| === modified file 'doc/wget.texi' |
| --- doc/wget.texi 2010-05-27 10:45:15 +0000 |
| +++ doc/wget.texi 2010-07-28 19:22:22 +0000 |
| @@ -1498,6 +1498,13 @@ |
| @code{Content-Disposition} headers to describe what the name of a |
| downloaded file should be. |
| |
| +@cindex Trust server names |
| +@item --trust-server-names |
| + |
| +If this is set to on, on a redirect the last component of the |
| +redirection URL will be used as the local file name. By default it is |
| +used the last component in the original URL. |
| + |
| @cindex authentication |
| @item --auth-no-challenge |
| |
| @@ -2810,6 +2817,10 @@ |
| Turn on recognition of the (non-standard) @samp{Content-Disposition} |
| HTTP header---if set to @samp{on}, the same as @samp{--content-disposition}. |
| |
| +@item trust_server_names = on/off |
| +If set to on, use the last component of a redirection URL for the local |
| +file name. |
| + |
| @item continue = on/off |
| If set to on, force continuation of preexistent partially retrieved |
| files. See @samp{-c} before setting it. |
| |
| === modified file 'src/http.c' |
| --- src/http.c 2010-07-20 17:42:13 +0000 |
| +++ src/http.c 2010-07-28 19:22:22 +0000 |
| @@ -2593,8 +2593,9 @@ |
| /* The genuine HTTP loop! This is the part where the retrieval is |
| retried, and retried, and retried, and... */ |
| uerr_t |
| -http_loop (struct url *u, char **newloc, char **local_file, const char *referer, |
| - int *dt, struct url *proxy, struct iri *iri) |
| +http_loop (struct url *u, struct url *original_url, char **newloc, |
| + char **local_file, const char *referer, int *dt, struct url *proxy, |
| + struct iri *iri) |
| { |
| int count; |
| bool got_head = false; /* used for time-stamping and filename detection */ |
| @@ -2641,7 +2642,8 @@ |
| } |
| else if (!opt.content_disposition) |
| { |
| - hstat.local_file = url_file_name (u); |
| + hstat.local_file = |
| + url_file_name (opt.trustservernames ? u : original_url); |
| got_name = true; |
| } |
| |
| @@ -2679,7 +2681,7 @@ |
| |
| /* Send preliminary HEAD request if -N is given and we have an existing |
| * destination file. */ |
| - file_name = url_file_name (u); |
| + file_name = url_file_name (opt.trustservernames ? u : original_url); |
| if (opt.timestamping |
| && !opt.content_disposition |
| && file_exists_p (file_name)) |
| === modified file 'src/http.h' |
| --- src/http.h 2010-05-08 19:56:15 +0000 |
| +++ src/http.h 2010-07-28 19:22:22 +0000 |
| @@ -33,8 +33,8 @@ |
| |
| struct url; |
| |
| -uerr_t http_loop (struct url *, char **, char **, const char *, int *, |
| - struct url *, struct iri *); |
| +uerr_t http_loop (struct url *, struct url *, char **, char **, const char *, |
| + int *, struct url *, struct iri *); |
| void save_cookies (void); |
| void http_cleanup (void); |
| time_t http_atotm (const char *); |
| |
| === modified file 'src/init.c' |
| --- src/init.c 2010-05-08 19:56:15 +0000 |
| +++ src/init.c 2010-07-28 19:22:22 +0000 |
| @@ -252,6 +252,7 @@ |
| { "timeout", NULL, cmd_spec_timeout }, |
| { "timestamping", &opt.timestamping, cmd_boolean }, |
| { "tries", &opt.ntry, cmd_number_inf }, |
| + { "trustservernames", &opt.trustservernames, cmd_boolean }, |
| { "useproxy", &opt.use_proxy, cmd_boolean }, |
| { "user", &opt.user, cmd_string }, |
| { "useragent", NULL, cmd_spec_useragent }, |
| |
| === modified file 'src/main.c' |
| --- src/main.c 2010-06-20 10:10:35 +0000 |
| +++ src/main.c 2010-07-28 19:22:22 +0000 |
| @@ -266,5 +266,6 @@ |
| { "timeout", 'T', OPT_VALUE, "timeout", -1 }, |
| { "timestamping", 'N', OPT_BOOLEAN, "timestamping", -1 }, |
| { "tries", 't', OPT_VALUE, "tries", -1 }, |
| + { "trust-server-names", 0, OPT_BOOLEAN, "trustservernames", -1 }, |
| { "user", 0, OPT_VALUE, "user", -1 }, |
| { "user-agent", 'U', OPT_VALUE, "useragent", -1 }, |
| @@ -680,6 +681,8 @@ |
| N_("\ |
| -I, --include-directories=LIST list of allowed directories.\n"), |
| N_("\ |
| + --trust-server-names use the name specified by the redirection url last component.\n"), |
| + N_("\ |
| -X, --exclude-directories=LIST list of excluded directories.\n"), |
| N_("\ |
| -np, --no-parent don't ascend to the parent directory.\n"), |
| |
| === modified file 'src/options.h' |
| --- src/options.h 2010-05-08 19:56:15 +0000 |
| +++ src/options.h 2010-07-28 19:22:22 +0000 |
| @@ -242,6 +242,7 @@ |
| char *encoding_remote; |
| char *locale; |
| |
| + bool trustservernames; |
| #ifdef __VMS |
| int ftp_stmlf; /* Force Stream_LF format for binary FTP. */ |
| #endif /* def __VMS */ |
| |
| === modified file 'src/retr.c' |
| --- src/retr.c 2010-05-08 19:56:15 +0000 |
| +++ src/retr.c 2010-07-28 19:22:22 +0000 |
| @@ -731,7 +731,8 @@ |
| #endif |
| || (proxy_url && proxy_url->scheme == SCHEME_HTTP)) |
| { |
| - result = http_loop (u, &mynewloc, &local_file, refurl, dt, proxy_url, iri); |
| + result = http_loop (u, orig_parsed, &mynewloc, &local_file, refurl, dt, |
| + proxy_url, iri); |
| } |
| else if (u->scheme == SCHEME_FTP) |
| { |
| |
| make sure tests pass after this change |
| https://bugs.gentoo.org/333965 |
| https://savannah.gnu.org/bugs/index.php?30841 |
| |
| --- tests/Test-iri-forced-remote.px |
| +++ tests/Test-iri-forced-remote.px |
| @@ -174,7 +174,7 @@ my %urls = ( |
| }, |
| ); |
| |
| -my $cmdline = $WgetTest::WGETPATH . " --iri --remote-encoding=iso-8859-1 -nH -r http://localhost:{{port}}/"; |
| +my $cmdline = $WgetTest::WGETPATH . " --iri --trust-server-names --remote-encoding=iso-8859-1 -nH -r http://localhost:{{port}}/"; |
| |
| my $expected_error_code = 0; |
| |
| --- tests/Test-iri-list.px |
| +++ tests/Test-iri-list.px |
| @@ -143,7 +143,7 @@ my %urls = ( |
| }, |
| ); |
| |
| -my $cmdline = $WgetTest::WGETPATH . " --iri -i http://localhost:{{port}}/url_list.txt"; |
| +my $cmdline = $WgetTest::WGETPATH . " --iri --trust-server-names -i http://localhost:{{port}}/url_list.txt"; |
| |
| my $expected_error_code = 0; |
| |
| --- tests/Test-iri.px |
| +++ tests/Test-iri.px |
| @@ -186,7 +186,7 @@ my %urls = ( |
| }, |
| ); |
| |
| -my $cmdline = $WgetTest::WGETPATH . " --iri --restrict-file-names=nocontrol -nH -r http://localhost:{{port}}/"; |
| +my $cmdline = $WgetTest::WGETPATH . " --iri --trust-server-names --restrict-file-names=nocontrol -nH -r http://localhost:{{port}}/"; |
| |
| my $expected_error_code = 0; |
| |