if (!conn_ctrl_ready(conn) || !conn->ctrl->get_src)
return 0;
+ if (!sockaddr_alloc(&conn->src))
+ return 0;
+
if (conn->ctrl->get_src(conn->handle.fd, (struct sockaddr *)conn->src,
sizeof(*conn->src),
obj_type(conn->target) != OBJ_TYPE_LISTENER) == -1)
if (!conn_ctrl_ready(conn) || !conn->ctrl->get_dst)
return 0;
+ if (!sockaddr_alloc(&conn->dst))
+ return 0;
+
if (conn->ctrl->get_dst(conn->handle.fd, (struct sockaddr *)conn->dst,
sizeof(*conn->dst),
obj_type(conn->target) != OBJ_TYPE_LISTENER) == -1)
DPRINTF(stderr,"assign_server_address : s=%p\n",s);
- /* FIXME WTA: an address allocation will soon be needed here */
+ if (!sockaddr_alloc(&srv_conn->dst))
+ return SRV_STATUS_INTERNAL;
if ((s->flags & SF_DIRECT) || (s->be->lbprm.algo & BE_LB_KIND)) {
/* A server is necessarily known for this stream */
else
return;
- /* FIXME WTA: an address allocation will soon be needed here for src */
+ if (!sockaddr_alloc(&srv_conn->src))
+ return;
switch (src->opts & CO_SRC_TPROXY_MASK) {
case CO_SRC_TPROXY_ADDR:
/* Maybe there were an older connection we were waiting on */
check->wait_list.events = 0;
- /* FIXME WTA: we'll have to dynamically allocate the dst address here */
+ if (!sockaddr_alloc(&conn->dst))
+ return SF_ERR_RESOURCE;
+
if (is_addr(&check->addr)) {
/* we'll connect to the check addr specified on the server */
*conn->dst = check->addr;
}
/* no client address */
- /* FIXME WTA: we'll have to dynamically allocate the src address here
- * before clearing it, or better release it and make it null.
- */
- clear_addr(conn->src);
conn_prepare(conn, proto, check->xprt);
if (conn_install_mux(conn, &mux_pt_ops, cs, s->proxy, NULL) < 0)
conn->target = s ? &s->obj_type : &proxy->obj_type;
/* no client address */
- /* FIXME WTA: we'll have to dynamically allocate the src address here
- * before clearing it, or better release it and make it null.
- */
- clear_addr(conn->src);
- /* FIXME WTA: we'll have to dynamically allocate the dst address here */
+ if (!sockaddr_alloc(&conn->dst)) {
+ ret = SF_ERR_RESOURCE;
+ goto fail_check;
+ }
+
if (is_addr(&check->addr)) {
/* we'll connect to the check addr specified on the server */
*conn->dst = check->addr;
if (!conn_ctrl_ready(conn))
goto fail;
+ if (!sockaddr_alloc(&conn->src) || !sockaddr_alloc(&conn->dst))
+ goto fail;
+
if (!fd_recv_ready(conn->handle.fd))
goto not_ready;
WILL_LJMP(luaL_error(L, "connect: port ranges not supported : address '%s'", ip));
}
- /* FIXME WTA: dst address allocation needed here! */
+ if (!sockaddr_alloc(&conn->dst)) {
+ xref_unlock(&socket->xref, peer);
+ WILL_LJMP(luaL_error(L, "connect: internal error"));
+ }
+
memcpy(conn->dst, addr, sizeof(struct sockaddr_storage));
/* Set port. */
struct ist uri, path;
/* Note that for now we don't reuse existing proxy connections */
- if (unlikely((conn = cs_conn(si_alloc_cs(&s->si[1], NULL))) == NULL)) {
+ if (unlikely((conn = cs_conn(si_alloc_cs(&s->si[1], NULL))) == NULL ||
+ !sockaddr_alloc(&conn->dst))) {
txn->req.err_state = txn->req.msg_state;
txn->req.msg_state = HTTP_MSG_ERROR;
txn->status = 500;
uri = htx_sl_req_uri(sl);
path = http_get_path(uri);
- /* FIXME WTA: below we'll need to dynamically allocate the dst address */
if (url2sa(uri.ptr, uri.len - path.len, conn->dst, NULL) == -1)
goto return_bad_req;
conn->target = s->target = peer_session_target(peer, s);
- /* FIXME WTA: a sockaddr allocation will be needed here */
+ if (!sockaddr_alloc(&conn->dst))
+ goto out_free_cs;
+
memcpy(conn->dst, &peer->addr, sizeof(*conn->dst));
conn_prepare(conn, peer->proto, peer_xprt(peer));
if (unlikely((cli_conn = conn_new()) == NULL))
goto out_close;
+ if (!sockaddr_alloc(&cli_conn->src))
+ goto out_free_conn;
+
cli_conn->handle.fd = cfd;
- /* FIXME WTA: an allocation will be needed here. Better steal the original address on success */
*cli_conn->src = *addr;
cli_conn->flags |= CO_FL_ADDR_FROM_SET;
cli_conn->target = &l->obj_type;