diff options
author | Denys Vlasenko <vda.linux@googlemail.com> | 2019-04-16 13:35:56 +0200 |
---|---|---|
committer | Denys Vlasenko <vda.linux@googlemail.com> | 2019-04-16 13:35:56 +0200 |
commit | 2efa726b22e9ebb7ee6c192a0fea0c478a857219 (patch) | |
tree | 9fd67fea136bcdf96216434f4371aa7f4a2d883e | |
parent | 62ba9e5ac3f158eb36b365af43f8d7d680710963 (diff) | |
download | busybox-w32-2efa726b22e9ebb7ee6c192a0fea0c478a857219.tar.gz busybox-w32-2efa726b22e9ebb7ee6c192a0fea0c478a857219.tar.bz2 busybox-w32-2efa726b22e9ebb7ee6c192a0fea0c478a857219.zip |
httpd: extract query string only after proxying check
function old new delta
handle_incoming_and_exit 2398 2370 -28
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
-rw-r--r-- | networking/httpd.c | 19 |
1 files changed, 7 insertions, 12 deletions
diff --git a/networking/httpd.c b/networking/httpd.c index 7cbf9afef..2b0acd7dc 100644 --- a/networking/httpd.c +++ b/networking/httpd.c | |||
@@ -411,7 +411,7 @@ struct globals { | |||
411 | char *rmt_ip_str; /* for $REMOTE_ADDR and $REMOTE_PORT */ | 411 | char *rmt_ip_str; /* for $REMOTE_ADDR and $REMOTE_PORT */ |
412 | const char *bind_addr_or_port; | 412 | const char *bind_addr_or_port; |
413 | 413 | ||
414 | const char *g_query; | 414 | char *g_query; |
415 | const char *opt_c_configFile; | 415 | const char *opt_c_configFile; |
416 | const char *home_httpd; | 416 | const char *home_httpd; |
417 | const char *index_page; | 417 | const char *index_page; |
@@ -2166,14 +2166,6 @@ static void handle_incoming_and_exit(const len_and_sockaddr *fromAddr) | |||
2166 | strcpy(urlcopy, urlp); | 2166 | strcpy(urlcopy, urlp); |
2167 | /* NB: urlcopy ptr is never changed after this */ | 2167 | /* NB: urlcopy ptr is never changed after this */ |
2168 | 2168 | ||
2169 | /* Extract url args if present */ | ||
2170 | /* g_query = NULL; - already is */ | ||
2171 | tptr = strchr(urlcopy, '?'); | ||
2172 | if (tptr) { | ||
2173 | *tptr++ = '\0'; | ||
2174 | g_query = tptr; | ||
2175 | } | ||
2176 | |||
2177 | #if ENABLE_FEATURE_HTTPD_PROXY | 2169 | #if ENABLE_FEATURE_HTTPD_PROXY |
2178 | { | 2170 | { |
2179 | int proxy_fd; | 2171 | int proxy_fd; |
@@ -2194,12 +2186,10 @@ static void handle_incoming_and_exit(const len_and_sockaddr *fromAddr) | |||
2194 | * When /urlSFX is requested, reverse proxy it | 2186 | * When /urlSFX is requested, reverse proxy it |
2195 | * to http://hostname[:port]/new/pathSFX | 2187 | * to http://hostname[:port]/new/pathSFX |
2196 | */ | 2188 | */ |
2197 | fdprintf(proxy_fd, "%s %s%s%s%s %s\r\n", | 2189 | fdprintf(proxy_fd, "%s %s%s %s\r\n", |
2198 | prequest, /* "GET" or "POST" */ | 2190 | prequest, /* "GET" or "POST" */ |
2199 | proxy_entry->url_to, /* "/new/path" */ | 2191 | proxy_entry->url_to, /* "/new/path" */ |
2200 | urlcopy + strlen(proxy_entry->url_from), /* "SFX" */ | 2192 | urlcopy + strlen(proxy_entry->url_from), /* "SFX" */ |
2201 | (g_query ? "?" : ""), /* "?" (maybe) */ | ||
2202 | (g_query ? g_query : ""), /* query string (maybe) */ | ||
2203 | HTTP_slash /* HTTP/xyz" or "" */ | 2193 | HTTP_slash /* HTTP/xyz" or "" */ |
2204 | ); | 2194 | ); |
2205 | cgi_io_loop_and_exit(proxy_fd, proxy_fd, /*max POST length:*/ INT_MAX); | 2195 | cgi_io_loop_and_exit(proxy_fd, proxy_fd, /*max POST length:*/ INT_MAX); |
@@ -2207,6 +2197,11 @@ static void handle_incoming_and_exit(const len_and_sockaddr *fromAddr) | |||
2207 | } | 2197 | } |
2208 | #endif | 2198 | #endif |
2209 | 2199 | ||
2200 | /* Extract url args if present */ | ||
2201 | g_query = strchr(urlcopy, '?'); | ||
2202 | if (g_query) | ||
2203 | *g_query++ = '\0'; | ||
2204 | |||
2210 | /* Decode URL escape sequences */ | 2205 | /* Decode URL escape sequences */ |
2211 | tptr = percent_decode_in_place(urlcopy, /*strict:*/ 1); | 2206 | tptr = percent_decode_in_place(urlcopy, /*strict:*/ 1); |
2212 | if (tptr == NULL) | 2207 | if (tptr == NULL) |