From: Laurent Bercot Date: Fri, 6 Jan 2017 21:03:08 +0000 (+0100) Subject: httpd: fix address family for reverse proxy client socket X-Git-Tag: 1_27_0~275 X-Git-Url: https://git.librecmc.org/?a=commitdiff_plain;h=0ef478f01bb3d42f6776f58fb5891e1430af8799;p=oweals%2Fbusybox.git httpd: fix address family for reverse proxy client socket When httpd proxies a request to another server, it first creates an AF_INET socket, then resolves the server name to a sockaddr, then connects to it. This fails if the server name resolves to an IPv6 address. This patch ensures that the socket is created with the correct address family (AF_INET6 if the server resolves to an IPv6 address and AF_INET otherwise). Signed-off-by: Laurent Bercot Signed-off-by: Denys Vlasenko --- diff --git a/networking/httpd.c b/networking/httpd.c index d301d598d..cfcd2a06e 100644 --- a/networking/httpd.c +++ b/networking/httpd.c @@ -2396,12 +2396,12 @@ static void handle_incoming_and_exit(const len_and_sockaddr *fromAddr) int proxy_fd; len_and_sockaddr *lsa; - proxy_fd = socket(AF_INET, SOCK_STREAM, 0); - if (proxy_fd < 0) - send_headers_and_exit(HTTP_INTERNAL_SERVER_ERROR); lsa = host2sockaddr(proxy_entry->host_port, 80); if (lsa == NULL) send_headers_and_exit(HTTP_INTERNAL_SERVER_ERROR); + proxy_fd = socket(lsa->u.sa.sa_family, SOCK_STREAM, 0); + if (proxy_fd < 0) + send_headers_and_exit(HTTP_INTERNAL_SERVER_ERROR); if (connect(proxy_fd, &lsa->u.sa, lsa->len) < 0) send_headers_and_exit(HTTP_INTERNAL_SERVER_ERROR); fdprintf(proxy_fd, "%s %s%s%s%s HTTP/%c.%c\r\n",