From e3635edc885e066491dd4db9688862149a538ab6 Mon Sep 17 00:00:00 2001 From: Willy Tarreau Date: Sat, 24 Nov 2012 11:23:04 +0100 Subject: [PATCH] BUG/MEDIUM: connection: local_send_proxy must wait for connection to establish The conn_local_send_proxy() function has to retrieve the local and remote addresses, but the getpeername() and getsockname() functions may fail until the connection is established. So now we catch this error and poll for write when this happens. --- src/connection.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/connection.c b/src/connection.c index 38d4ca628..d882bb74d 100644 --- a/src/connection.c +++ b/src/connection.c @@ -531,14 +531,16 @@ int conn_local_send_proxy(struct connection *conn, unsigned int flag) if (conn->flags & CO_FL_SOCK_WR_SH) goto out_error; - /* The target server expects a PROXY line to be sent first. */ + /* The target server expects a PROXY line to be sent first. Retrieving + * local or remote addresses may fail until the connection is established. + */ conn_get_from_addr(conn); if (!(conn->flags & CO_FL_ADDR_FROM_SET)) - goto out_error; + goto out_wait; conn_get_to_addr(conn); if (!(conn->flags & CO_FL_ADDR_TO_SET)) - goto out_error; + goto out_wait; trash.len = make_proxy_line(trash.str, trash.size, &conn->addr.from, &conn->addr.to); if (!trash.len)