calls r:wsupgrade() can cause a child process crash.
[Edward Lu <Chaosed0 gmail.com>]
+ *) mod_proxy_connect/wstunnel: If both client and backend sides get readable
+ at the same time, don't ignore errors while forwarding from the first side
+ if none occurs next on the other side. [Yann Ylavic]
+
*) mod_lua: After a r:wsupgrade(), mod_lua was not properly
responding to a websockets PING but instead invoking the specified
script. PR57524. [Edward Lu <Chaosed0 gmail.com>]
/* r->sent_bodyct = 1;*/
while (1) { /* Infinite loop until error (one side closes the connection) */
- if ((rv = apr_pollset_poll(pollset, -1, &pollcnt, &signalled))
- != APR_SUCCESS) {
+ rv = apr_pollset_poll(pollset, -1, &pollcnt, &signalled);
+ if (rv != APR_SUCCESS) {
if (APR_STATUS_IS_EINTR(rv)) {
continue;
}
ap_log_rerror(APLOG_MARK, APLOG_DEBUG, 0, r, APLOGNO(01025)
"sock was readable");
#endif
- rv = proxy_connect_transfer(r, backconn, c, bb, "sock");
+ rv |= proxy_connect_transfer(r, backconn, c, bb, "sock");
}
else if (pollevent & APR_POLLERR) {
- rv = APR_EPIPE;
+ rv |= APR_EPIPE;
backconn->aborted = 1;
ap_log_rerror(APLOG_MARK, APLOG_NOTICE, 0, r, APLOGNO(01026)
"err on backconn");
ap_log_rerror(APLOG_MARK, APLOG_DEBUG, 0, r, APLOGNO(01027)
"client was readable");
#endif
- rv = proxy_connect_transfer(r, c, backconn, bb, "client");
+ rv |= proxy_connect_transfer(r, c, backconn, bb, "client");
}
else if (pollevent & APR_POLLERR) {
- rv = APR_EPIPE;
+ rv |= APR_EPIPE;
c->aborted = 1;
ap_log_rerror(APLOG_MARK, APLOG_NOTICE, 0, r, APLOGNO(02827)
"err on client");
}
}
else {
- rv = APR_EBADF;
+ rv |= APR_EBADF;
ap_log_rerror(APLOG_MARK, APLOG_INFO, 0, r, APLOGNO(01028)
"unknown socket in pollset");
}
apr_bucket_brigade *bb = baton->bb;
while(1) {
- if ((rv = apr_pollset_poll(pollset, timeout, &pollcnt, &signalled))
- != APR_SUCCESS) {
+ rv = apr_pollset_poll(pollset, timeout, &pollcnt, &signalled);
+ if (rv != APR_SUCCESS) {
if (APR_STATUS_IS_EINTR(rv)) {
continue;
}
if (pollevent & (APR_POLLIN | APR_POLLHUP)) {
ap_log_rerror(APLOG_MARK, APLOG_TRACE1, 0, r, APLOGNO(02446)
"sock was readable");
- rv = proxy_wstunnel_transfer(r, backconn, c, bb, "sock");
+ rv |= proxy_wstunnel_transfer(r, backconn, c, bb, "sock");
}
else if (pollevent & APR_POLLERR) {
- rv = APR_EPIPE;
+ rv |= APR_EPIPE;
backconn->aborted = 1;
ap_log_rerror(APLOG_MARK, APLOG_NOTICE, 0, r, APLOGNO(02447)
"error on backconn");
}
else {
- rv = APR_EGENERAL;
+ rv |= APR_EGENERAL;
ap_log_rerror(APLOG_MARK, APLOG_NOTICE, 0, r, APLOGNO(02605)
"unknown event on backconn %d", pollevent);
}
if (pollevent & (APR_POLLIN | APR_POLLHUP)) {
ap_log_rerror(APLOG_MARK, APLOG_TRACE1, 0, r, APLOGNO(02448)
"client was readable");
- rv = proxy_wstunnel_transfer(r, c, backconn, bb, "client");
+ rv |= proxy_wstunnel_transfer(r, c, backconn, bb, "client");
}
else if (pollevent & APR_POLLERR) {
- rv = APR_EPIPE;
+ rv |= APR_EPIPE;
c->aborted = 1;
ap_log_rerror(APLOG_MARK, APLOG_TRACE1, 0, r, APLOGNO(02607)
"error on client conn");
}
else {
- rv = APR_EGENERAL;
+ rv |= APR_EGENERAL;
ap_log_rerror(APLOG_MARK, APLOG_NOTICE, 0, r, APLOGNO(02606)
"unknown event on client conn %d", pollevent);
}
}
else {
- rv = APR_EBADF;
+ rv |= APR_EBADF;
ap_log_rerror(APLOG_MARK, APLOG_INFO, 0, r, APLOGNO(02449)
"unknown socket in pollset");
}