From 557686d7b68938522f63e82bdfb27b46096ea130 Mon Sep 17 00:00:00 2001 From: MilhouseVH Date: Thu, 22 Jun 2017 04:56:54 +0100 Subject: [PATCH] busybox: fix wget with brain-damaged http servers --- ...4_fix_for_brain_damaged_http_servers.patch | 80 +++++++++++++++++++ 1 file changed, 80 insertions(+) create mode 100644 packages/sysutils/busybox/patches/busybox-04_fix_for_brain_damaged_http_servers.patch diff --git a/packages/sysutils/busybox/patches/busybox-04_fix_for_brain_damaged_http_servers.patch b/packages/sysutils/busybox/patches/busybox-04_fix_for_brain_damaged_http_servers.patch new file mode 100644 index 0000000000..6938421c71 --- /dev/null +++ b/packages/sysutils/busybox/patches/busybox-04_fix_for_brain_damaged_http_servers.patch @@ -0,0 +1,80 @@ +From a6f8651911716d1d1624712eb19e4f3608767c7e Mon Sep 17 00:00:00 2001 +From: Denys Vlasenko +Date: Wed, 11 Jan 2017 20:16:45 +0100 +Subject: [PATCH] wget: fix for brain-damaged HTTP servers. Closes 9471 + +write(3, "GET / HTTP/1.1\r\nUser-Agent: Wget\r\nConnection: close\r\n\r\n", 74) = 74 +shutdown(3, SHUT_WR) = 0 +alarm(900) = 900 +read(3, "", 1024) = 0 +write(2, "wget: error getting response\n", 29) = 29 +exit(1) + +The peer simply does not return anything. It closes its connection. + +Probably it detects wget closing its writing end: shutdown(3, SHUT_WR). + +The point it, closing write side of the socket is _valid_ for HTTP. +wget sent the full request, it won't be sending anything more: +it will only receive the response, and that's it. + +Signed-off-by: Denys Vlasenko +--- + networking/wget.c | 23 +++++++++++++++-------- + 1 file changed, 15 insertions(+), 8 deletions(-) + +diff --git a/networking/wget.c b/networking/wget.c +index c82086878..d5a92a950 100644 +--- a/networking/wget.c ++++ b/networking/wget.c +@@ -137,6 +137,8 @@ + #endif + + ++#define SSL_SUPPORTED (ENABLE_FEATURE_WGET_OPENSSL || ENABLE_FEATURE_WGET_SSL_HELPER) ++ + struct host_info { + char *allocated; + const char *path; +@@ -147,7 +149,7 @@ struct host_info { + }; + static const char P_FTP[] ALIGN1 = "ftp"; + static const char P_HTTP[] ALIGN1 = "http"; +-#if ENABLE_FEATURE_WGET_OPENSSL || ENABLE_FEATURE_WGET_SSL_HELPER ++#if SSL_SUPPORTED + static const char P_HTTPS[] ALIGN1 = "https"; + #endif + +@@ -448,7 +450,7 @@ static void parse_url(const char *src_url, struct host_info *h) + if (strcmp(url, P_FTP) == 0) { + h->port = bb_lookup_port(P_FTP, "tcp", 21); + } else +-#if ENABLE_FEATURE_WGET_OPENSSL || ENABLE_FEATURE_WGET_SSL_HELPER ++#if SSL_SUPPORTED + if (strcmp(url, P_HTTPS) == 0) { + h->port = bb_lookup_port(P_HTTPS, "tcp", 443); + h->protocol = P_HTTPS; +@@ -1089,12 +1091,17 @@ static void download_one_url(const char *url) + } + + fflush(sfp); +- /* If we use SSL helper, keeping our end of the socket open for writing +- * makes our end (i.e. the same fd!) readable (EAGAIN instead of EOF) +- * even after child closes its copy of the fd. +- * This helps: +- */ +- shutdown(fileno(sfp), SHUT_WR); ++ ++#if SSL_SUPPORTED ++ if (target.protocol == P_HTTPS) { ++ /* If we use SSL helper, keeping our end of the socket open for writing ++ * makes our end (i.e. the same fd!) readable (EAGAIN instead of EOF) ++ * even after child closes its copy of the fd. ++ * This helps: ++ */ ++ shutdown(fileno(sfp), SHUT_WR); ++ } ++#endif + + /* + * Retrieve HTTP response line and check for "200" status code.