httpd: fix proxy headers passing - full_write() instead of write()
authorDenys Vlasenko <vda.linux@googlemail.com>
Sun, 14 Apr 2019 18:46:57 +0000 (20:46 +0200)
committerDenys Vlasenko <vda.linux@googlemail.com>
Sun, 14 Apr 2019 18:46:57 +0000 (20:46 +0200)
function                                             old     new   delta
handle_incoming_and_exit                            2763    2752     -11

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
networking/httpd.c

index f713f6929891f7789f4246bc6ef1573ecec30c38..c486197b8236bcfd37be4b7de03812547b284790 100644 (file)
@@ -2271,15 +2271,20 @@ static void handle_incoming_and_exit(const len_and_sockaddr *fromAddr)
                                bb_error_msg("header: '%s'", iobuf);
 
 #if ENABLE_FEATURE_HTTPD_PROXY
-                       /* We need 2 more bytes for yet another "\r\n" -
-                        * see near fdprintf(proxy_fd...) further below */
-                       if (proxy_entry && (header_ptr - header_buf) < IOBUF_SIZE - 4) {
-                               int len = strnlen(iobuf, IOBUF_SIZE - (header_ptr - header_buf) - 4);
-                               memcpy(header_ptr, iobuf, len);
-                               header_ptr += len;
-                               header_ptr[0] = '\r';
-                               header_ptr[1] = '\n';
-                               header_ptr += 2;
+                       if (proxy_entry) {
+                               /* Why 4, not 2?
+                                * We need 2 more bytes for yet another "\r\n" -
+                                * see near fdprintf(proxy_fd...) further below.
+                                */
+                               int maxlen = (IOBUF_SIZE-4) - (int)(header_ptr - header_buf);
+                               if (maxlen > 0) {
+                                       int len = strnlen(iobuf, maxlen);
+                                       memcpy(header_ptr, iobuf, len);
+                                       header_ptr += len;
+                                       header_ptr[0] = '\r';
+                                       header_ptr[1] = '\n';
+                                       header_ptr += 2;
+                               }
                        }
 #endif
 
@@ -2401,7 +2406,7 @@ static void handle_incoming_and_exit(const len_and_sockaddr *fromAddr)
        }
 
 #if ENABLE_FEATURE_HTTPD_PROXY
-       if (proxy_entry != NULL) {
+       if (proxy_entry) {
                int proxy_fd;
                len_and_sockaddr *lsa;
 
@@ -2423,7 +2428,7 @@ static void handle_incoming_and_exit(const len_and_sockaddr *fromAddr)
                header_ptr[0] = '\r';
                header_ptr[1] = '\n';
                header_ptr += 2;
-               write(proxy_fd, header_buf, header_ptr - header_buf);
+               full_write(proxy_fd, header_buf, header_ptr - header_buf);
                free(header_buf); /* on the order of 8k, free it */
                cgi_io_loop_and_exit(proxy_fd, proxy_fd, length);
        }