PROXY protocol header was not tolerant to signals, so it might cause a
connection to report an error if a signal comes in at the exact same
moment the send is done.
This is 1.5-specific and does not need any backport.
/* we have to send the whole trash. If the data layer has a
* pending write, we'll also set MSG_MORE.
*/
- ret = send(conn->t.sock.fd, trash.str, trash.len, (conn->flags & CO_FL_DATA_WR_ENA) ? MSG_MORE : 0);
-
- if (ret == 0)
- goto out_wait;
+ do {
+ ret = send(conn->t.sock.fd, trash.str, trash.len, (conn->flags & CO_FL_DATA_WR_ENA) ? MSG_MORE : 0);
- if (ret < 0) {
- if (errno == EAGAIN || errno == ENOTCONN)
+ if (ret == 0)
goto out_wait;
- goto out_error;
- }
+
+ if (ret < 0) {
+ if (errno == EAGAIN || errno == ENOTCONN)
+ goto out_wait;
+ if (errno == EINTR)
+ continue;
+ goto out_error;
+ }
+ } while (0);
if (ret != trash.len)
goto out_error;
* connection, in which case the connection is validated only once
* we've sent the whole proxy line. Otherwise we use connect().
*/
- if (si->send_proxy_ofs) {
+ while (si->send_proxy_ofs) {
int ret;
/* The target server expects a PROXY line to be sent first.
if (ret < 0) {
if (errno == EAGAIN || errno == ENOTCONN)
goto out_wait;
+ if (errno == EINTR)
+ continue;
goto out_error;
}
goto out_wait;
/* OK we've sent the whole line, we're connected */
+ break;
}
/* The connection is ready now, simply return and let the connection