Skip to content

Commit 31a273d

Browse files
committed
avoid duplicate end-of-stdin header
avoid passing {iov_base = &buffer, iov_len=0} to writev() when there is no stdin data git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@1032266 13f79535-47bb-0310-9956-ffa450edef68
1 parent 75f7b96 commit 31a273d

1 file changed

Lines changed: 17 additions & 10 deletions

File tree

modules/proxy/mod_proxy_fcgi.c

Lines changed: 17 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -611,6 +611,7 @@ static apr_status_t dispatch(proxy_conn_rec *conn, request_rec *r,
611611
char writebuf[AP_IOBUFSIZE];
612612
apr_size_t writebuflen;
613613
int last_stdin = 0;
614+
int nvec = 0;
614615

615616
rv = ap_get_brigade(r->input_filters, ib,
616617
AP_MODE_READBYTES, APR_BLOCK_READ,
@@ -637,26 +638,32 @@ static apr_status_t dispatch(proxy_conn_rec *conn, request_rec *r,
637638
(apr_uint16_t) writebuflen, 0);
638639
fcgi_header_to_array(&header, farray);
639640

640-
vec[0].iov_base = farray;
641-
vec[0].iov_len = sizeof(farray);
642-
vec[1].iov_base = writebuf;
643-
vec[1].iov_len = writebuflen;
641+
vec[nvec].iov_base = farray;
642+
vec[nvec].iov_len = sizeof(farray);
643+
++nvec;
644+
if (writebuflen) {
645+
vec[nvec].iov_base = writebuf;
646+
vec[nvec].iov_len = writebuflen;
647+
++nvec;
648+
}
644649

645-
rv = send_data(conn, vec, 2, &len, 0);
650+
rv = send_data(conn, vec, nvec, &len, 0);
646651
if (rv != APR_SUCCESS) {
647652
break;
648653
}
649654

650655
if (last_stdin) {
651656
pfd.reqevents = APR_POLLIN; /* Done with input data */
652657

653-
fill_in_header(&header, FCGI_STDIN, request_id, 0, 0);
654-
fcgi_header_to_array(&header, farray);
658+
if (writebuflen) { /* empty FCGI_STDIN not already sent? */
659+
fill_in_header(&header, FCGI_STDIN, request_id, 0, 0);
660+
fcgi_header_to_array(&header, farray);
655661

656-
vec[0].iov_base = farray;
657-
vec[0].iov_len = sizeof(farray);
662+
vec[0].iov_base = farray;
663+
vec[0].iov_len = sizeof(farray);
658664

659-
rv = send_data(conn, vec, 1, &len, 1);
665+
rv = send_data(conn, vec, 1, &len, 1);
666+
}
660667
}
661668
}
662669

0 commit comments

Comments
 (0)