From: Greg Hazel Date: Mon, 12 Feb 2018 00:28:58 +0000 (-0800) Subject: Fix evhttp_connection_get_addr() fox incomming http connections X-Git-Tag: release-2.1.9-beta^2~118 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=4215c003f11768c4be544939740e81a90f4e3039;p=libevent Fix evhttp_connection_get_addr() fox incomming http connections Install conn_address of the bufferevent on incomping http connections (even though this is kind of subsytem violation, so let's fix it in a simplest way and thinkg about long-term solution). Fixes: #510 Closes: #595 (pick) (cherry picked from commit 367cd9e5c2b8e3f9b8dbed40bfe8a0ed79285c36) --- diff --git a/bufferevent-internal.h b/bufferevent-internal.h index f79e74d3..c3f6b60b 100644 --- a/bufferevent-internal.h +++ b/bufferevent-internal.h @@ -444,6 +444,15 @@ EVENT2_EXPORT_SYMBOL const struct sockaddr* bufferevent_socket_get_conn_address_(struct bufferevent *bev); +EVENT2_EXPORT_SYMBOL +void +bufferevent_socket_set_conn_address_fd_(struct bufferevent *bev, int fd); + +EVENT2_EXPORT_SYMBOL +void +bufferevent_socket_set_conn_address_(struct bufferevent *bev, struct sockaddr *addr, size_t addrlen); + + /** Internal use: We have just successfully read data into an inbuf, so * reset the read timeout (if any). */ #define BEV_RESET_GENERIC_READ_TIMEOUT(bev) \ diff --git a/bufferevent_sock.c b/bufferevent_sock.c index 8c78c045..c878aa95 100644 --- a/bufferevent_sock.c +++ b/bufferevent_sock.c @@ -104,19 +104,26 @@ bufferevent_socket_get_conn_address_(struct bufferevent *bev) return (struct sockaddr *)&bev_p->conn_address; } -static void -bufferevent_socket_set_conn_address_fd(struct bufferevent_private *bev_p, int fd) + +void +bufferevent_socket_set_conn_address_fd_(struct bufferevent *bev, int fd) { + struct bufferevent_private *bev_p = + EVUTIL_UPCAST(bev, struct bufferevent_private, bev); + socklen_t len = sizeof(bev_p->conn_address); struct sockaddr *addr = (struct sockaddr *)&bev_p->conn_address; if (addr->sa_family != AF_UNSPEC) getpeername(fd, addr, &len); } -static void -bufferevent_socket_set_conn_address(struct bufferevent_private *bev_p, + +void +bufferevent_socket_set_conn_address_(struct bufferevent *bev, struct sockaddr *addr, size_t addrlen) { + struct bufferevent_private *bev_p = + EVUTIL_UPCAST(bev, struct bufferevent_private, bev); EVUTIL_ASSERT(addrlen <= sizeof(bev_p->conn_address)); memcpy(&bev_p->conn_address, addr, addrlen); } @@ -264,7 +271,7 @@ bufferevent_writecb(evutil_socket_t fd, short event, void *arg) goto done; } else { connected = 1; - bufferevent_socket_set_conn_address_fd(bufev_p, fd); + bufferevent_socket_set_conn_address_fd_(bufev, fd); #ifdef _WIN32 if (BEV_IS_ASYNC(bufev)) { event_del(&bufev->ev_write); @@ -483,7 +490,7 @@ bufferevent_connect_getaddrinfo_cb(int result, struct evutil_addrinfo *ai, } /* XXX use the other addrinfos? */ - bufferevent_socket_set_conn_address(bev_p, ai->ai_addr, (int)ai->ai_addrlen); + bufferevent_socket_set_conn_address_(bev, ai->ai_addr, (int)ai->ai_addrlen); r = bufferevent_socket_connect(bev, ai->ai_addr, (int)ai->ai_addrlen); if (r < 0) bufferevent_run_eventcb_(bev, BEV_EVENT_ERROR, 0); diff --git a/http.c b/http.c index 8541fdc1..c79e710c 100644 --- a/http.c +++ b/http.c @@ -4213,6 +4213,7 @@ evhttp_get_request_connection( bufferevent_enable(evcon->bufev, EV_READ); bufferevent_disable(evcon->bufev, EV_WRITE); bufferevent_setfd(evcon->bufev, fd); + bufferevent_socket_set_conn_address_(evcon->bufev, sa, salen); return (evcon); }