* 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;
return *sap;
sa = pool_alloc(pool_head_sockaddr);
+ if (sa && orig && len > 0)
+ memcpy(sa, orig, len);
if (sap)
*sap = sa;
return sa;
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,
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,
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)) {
else
return;
- if (!sockaddr_alloc(&srv_conn->src))
+ if (!sockaddr_alloc(&srv_conn->src, NULL, 0))
return;
switch (src->opts & CO_SRC_TPROXY_MASK) {
}
}
- 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;
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))
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))
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);
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;
/* 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;
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;
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;
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;
}