]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
MINOR: connection: make sockaddr_alloc() take the address to be copied
authorWilly Tarreau <w@1wt.eu>
Thu, 15 Oct 2020 05:32:10 +0000 (07:32 +0200)
committerWilly Tarreau <w@1wt.eu>
Thu, 15 Oct 2020 19:47:56 +0000 (21:47 +0200)
Roughly half of the calls to sockadr_alloc() are made to copy an already
known address. Let's optionally pass it in argument so that the function
can handle the copy at the same time, this slightly simplifies its usage.

include/haproxy/connection.h
src/backend.c
src/connection.c
src/hlua.c
src/http_ana.c
src/peers.c
src/session.c
src/sink.c
src/tcpcheck.c

index b99df4d002abbe69f13512cbde7d3a0221aa7d34..b735a6e2fd030f6a73dd44f6e77bae3db0b41a5d 100644 (file)
@@ -357,9 +357,11 @@ static inline void conn_set_private(struct connection *conn)
  * returns it. If <sap> is NULL, the address is always allocated and returned.
  * if <sap> is non-null, an address will only be allocated if it points to a
  * non-null pointer. In this case the allocated address will be assigned there.
- * In both situations the new pointer is returned.
+ * If <orig> is non-null and <len> positive, the address in <sa> will be copied
+ * into the allocated address. In both situations the new pointer is returned.
  */
-static inline struct sockaddr_storage *sockaddr_alloc(struct sockaddr_storage **sap)
+static inline struct sockaddr_storage *
+sockaddr_alloc(struct sockaddr_storage **sap, const struct sockaddr_storage *orig, socklen_t len)
 {
        struct sockaddr_storage *sa;
 
@@ -367,6 +369,8 @@ static inline struct sockaddr_storage *sockaddr_alloc(struct sockaddr_storage **
                return *sap;
 
        sa = pool_alloc(pool_head_sockaddr);
+       if (sa && orig && len > 0)
+               memcpy(sa, orig, len);
        if (sap)
                *sap = sa;
        return sa;
@@ -535,7 +539,7 @@ static inline int conn_get_src(struct connection *conn)
        if (!conn_ctrl_ready(conn) || !conn->ctrl->fam->get_src)
                return 0;
 
-       if (!sockaddr_alloc(&conn->src))
+       if (!sockaddr_alloc(&conn->src, NULL, 0))
                return 0;
 
        if (conn->ctrl->fam->get_src(conn->handle.fd, (struct sockaddr *)conn->src,
@@ -558,7 +562,7 @@ static inline int conn_get_dst(struct connection *conn)
        if (!conn_ctrl_ready(conn) || !conn->ctrl->fam->get_dst)
                return 0;
 
-       if (!sockaddr_alloc(&conn->dst))
+       if (!sockaddr_alloc(&conn->dst, NULL, 0))
                return 0;
 
        if (conn->ctrl->fam->get_dst(conn->handle.fd, (struct sockaddr *)conn->dst,
index 99f179d5d2c03d7acaed9528af8457cbdf42389e..789becee25dab00eedea110a59a6f12e07dec2bb 100644 (file)
@@ -845,7 +845,7 @@ int assign_server_address(struct stream *s)
 
        DPRINTF(stderr,"assign_server_address : s=%p\n",s);
 
-       if (!sockaddr_alloc(&s->target_addr))
+       if (!sockaddr_alloc(&s->target_addr, NULL, 0))
                return SRV_STATUS_INTERNAL;
 
        if ((s->flags & SF_DIRECT) || (s->be->lbprm.algo & BE_LB_KIND)) {
@@ -1056,7 +1056,7 @@ static void assign_tproxy_address(struct stream *s)
        else
                return;
 
-       if (!sockaddr_alloc(&srv_conn->src))
+       if (!sockaddr_alloc(&srv_conn->src, NULL, 0))
                return;
 
        switch (src->opts & CO_SRC_TPROXY_MASK) {
@@ -1411,7 +1411,7 @@ int connect_server(struct stream *s)
                }
        }
 
-       if (!srv_conn || !sockaddr_alloc(&srv_conn->dst)) {
+       if (!srv_conn || !sockaddr_alloc(&srv_conn->dst, 0, 0)) {
                if (srv_conn)
                        conn_free(srv_conn);
                return SF_ERR_RESOURCE;
index 1274112d8b0c413db499d8f92c0b0004dbc23dc4..dc54b9d63e371e475fff79f6f663ec6eb8bd36d6 100644 (file)
@@ -501,7 +501,7 @@ int conn_recv_proxy(struct connection *conn, int flag)
        if (!conn_ctrl_ready(conn))
                goto fail;
 
-       if (!sockaddr_alloc(&conn->src) || !sockaddr_alloc(&conn->dst))
+       if (!sockaddr_alloc(&conn->src, NULL, 0) || !sockaddr_alloc(&conn->dst, NULL, 0))
                goto fail;
 
        if (!fd_recv_ready(conn->handle.fd))
@@ -871,7 +871,7 @@ int conn_recv_netscaler_cip(struct connection *conn, int flag)
        if (!conn_ctrl_ready(conn))
                goto fail;
 
-       if (!sockaddr_alloc(&conn->src) || !sockaddr_alloc(&conn->dst))
+       if (!sockaddr_alloc(&conn->src, NULL, 0) || !sockaddr_alloc(&conn->dst, NULL, 0))
                goto fail;
 
        if (!fd_recv_ready(conn->handle.fd))
index e7cac654757592efef1724948b6bc1d20b762ebf..9616a75186cb4463b5d24da1182c2525d6583390 100644 (file)
@@ -2564,11 +2564,10 @@ __LJMP static int hlua_socket_connect(struct lua_State *L)
        si = appctx->owner;
        s = si_strm(si);
 
-       if (!sockaddr_alloc(&s->target_addr)) {
+       if (!sockaddr_alloc(&s->target_addr, addr, sizeof(*addr))) {
                xref_unlock(&socket->xref, peer);
                WILL_LJMP(luaL_error(L, "connect: internal error"));
        }
-       *s->target_addr = *addr;
        s->flags |= SF_ADDR_SET;
 
        hlua = hlua_gethlua(L);
index 142a0bf91fe73aa15b7007f0eed3216c0dc8a883..870682ff9848c247d503c9b7c955090206994aa0 100644 (file)
@@ -754,7 +754,7 @@ int http_process_request(struct stream *s, struct channel *req, int an_bit)
                struct htx_sl *sl;
                struct ist uri, path;
 
-               if (!sockaddr_alloc(&s->target_addr)) {
+               if (!sockaddr_alloc(&s->target_addr, NULL, 0)) {
                        if (!(s->flags & SF_ERR_MASK))
                                s->flags |= SF_ERR_RESOURCE;
                        goto return_int_err;
index 1b05dbd84423edb0ffadd0d60f3ab03575c7e1f6..18df3cd82eb0816f6b4ae4a915f3613a07095550 100644 (file)
@@ -2574,9 +2574,8 @@ static struct appctx *peer_session_create(struct peers *peers, struct peer *peer
 
        /* initiate an outgoing connection */
        s->target = peer_session_target(peer, s);
-       if (!sockaddr_alloc(&s->target_addr))
+       if (!sockaddr_alloc(&s->target_addr, &peer->addr, sizeof(peer->addr)))
                goto out_free_strm;
-       *s->target_addr = peer->addr;
        s->flags = SF_ASSIGNED|SF_ADDR_SET;
        s->si[1].flags |= SI_FL_NOLINGER;
 
index da271cf87ff133d01f874c3da2e8e83e29c0763e..f6e4fe43859f008cc2fe4df718cd03232583a5b3 100644 (file)
@@ -147,11 +147,10 @@ int session_accept_fd(struct listener *l, int cfd, struct sockaddr_storage *addr
        if (unlikely((cli_conn = conn_new(&l->obj_type)) == NULL))
                goto out_close;
 
-       if (!sockaddr_alloc(&cli_conn->src))
+       if (!sockaddr_alloc(&cli_conn->src, addr, sizeof(*addr)))
                goto out_free_conn;
 
        cli_conn->handle.fd = cfd;
-       *cli_conn->src = *addr;
        cli_conn->flags |= CO_FL_ADDR_FROM_SET;
        cli_conn->proxy_netns = l->rx.settings->netns;
 
index 64bac61743746c2ba9ee926c37cf2fa42620148f..b87ea288c8a3a3b0fc4eeb1e511da21d80c65be9 100644 (file)
@@ -649,9 +649,8 @@ static struct appctx *sink_forward_session_create(struct sink *sink, struct sink
 
 
        s->target = &sft->srv->obj_type;
-       if (!sockaddr_alloc(&s->target_addr))
+       if (!sockaddr_alloc(&s->target_addr, &sft->srv->addr, sizeof(sft->srv->addr)))
                goto out_free_strm;
-       *s->target_addr = sft->srv->addr;
        s->flags = SF_ASSIGNED|SF_ADDR_SET;
        s->si[1].flags |= SI_FL_NOLINGER;
 
index b9ef3802bd0ac441d5765be4411a6d7b9d18e525..3142e78680a942bd5a5fc04c2b572af0c587cd39 100644 (file)
@@ -1028,7 +1028,7 @@ enum tcpcheck_eval_ret tcpcheck_eval_connect(struct check *check, struct tcpchec
        check->wait_list.events = 0;
 
        /* no client address */
-       if (!sockaddr_alloc(&conn->dst)) {
+       if (!sockaddr_alloc(&conn->dst, NULL, 0)) {
                status = SF_ERR_RESOURCE;
                goto fail_check;
        }