mirror of
https://git.haproxy.org/git/haproxy.git/
synced 2025-09-21 13:51:26 +02:00
MEDIUM: socket: always properly use the sock_domain for requested families
Now we make sure to always look up the protocol's domain for an address family. Previously we would use it as-is, which prevented from properly using custom addresses (which is when they differ). This removes some hard-coded tests such as in log.c where UNIX vs UDP was explicitly checked for example. It requires a bit of care, however, so as to properly pass value 1 in the 3rd arg of the protocol_lookup() for DGRAM stuff. Maybe one day we'll change these for defines or enums to limit mistakes.
This commit is contained in:
parent
ba4a416c66
commit
d592ebdbeb
@ -31,6 +31,7 @@
|
|||||||
#include <haproxy/errors.h>
|
#include <haproxy/errors.h>
|
||||||
#include <haproxy/fd.h>
|
#include <haproxy/fd.h>
|
||||||
#include <haproxy/log.h>
|
#include <haproxy/log.h>
|
||||||
|
#include <haproxy/protocol.h>
|
||||||
#include <haproxy/sc_strm.h>
|
#include <haproxy/sc_strm.h>
|
||||||
#include <haproxy/stconn.h>
|
#include <haproxy/stconn.h>
|
||||||
#include <haproxy/stream.h>
|
#include <haproxy/stream.h>
|
||||||
@ -48,6 +49,7 @@ DECLARE_STATIC_POOL(dns_msg_buf, "dns_msg_buf", DNS_TCP_MSG_RING_MAX_SIZE);
|
|||||||
static int dns_connect_nameserver(struct dns_nameserver *ns)
|
static int dns_connect_nameserver(struct dns_nameserver *ns)
|
||||||
{
|
{
|
||||||
struct dgram_conn *dgram = &ns->dgram->conn;
|
struct dgram_conn *dgram = &ns->dgram->conn;
|
||||||
|
const struct protocol *proto;
|
||||||
int fd;
|
int fd;
|
||||||
|
|
||||||
/* Already connected */
|
/* Already connected */
|
||||||
@ -55,7 +57,9 @@ static int dns_connect_nameserver(struct dns_nameserver *ns)
|
|||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
/* Create an UDP socket and connect it on the nameserver's IP/Port */
|
/* Create an UDP socket and connect it on the nameserver's IP/Port */
|
||||||
if ((fd = socket(dgram->addr.to.ss_family, SOCK_DGRAM, IPPROTO_UDP)) == -1) {
|
proto = protocol_lookup(dgram->addr.to.ss_family, PROTO_TYPE_DGRAM, 1);
|
||||||
|
BUG_ON(!proto);
|
||||||
|
if ((fd = socket(proto->fam->sock_domain, proto->sock_type, proto->sock_prot)) == -1) {
|
||||||
send_log(NULL, LOG_WARNING,
|
send_log(NULL, LOG_WARNING,
|
||||||
"DNS : section '%s': can't create socket for nameserver '%s'.\n",
|
"DNS : section '%s': can't create socket for nameserver '%s'.\n",
|
||||||
ns->counters->pid, ns->id);
|
ns->counters->pid, ns->id);
|
||||||
|
11
src/log.c
11
src/log.c
@ -38,6 +38,7 @@
|
|||||||
#include <haproxy/lb_map.h>
|
#include <haproxy/lb_map.h>
|
||||||
#include <haproxy/lb_ss.h>
|
#include <haproxy/lb_ss.h>
|
||||||
#include <haproxy/log.h>
|
#include <haproxy/log.h>
|
||||||
|
#include <haproxy/protocol.h>
|
||||||
#include <haproxy/proxy.h>
|
#include <haproxy/proxy.h>
|
||||||
#include <haproxy/sample.h>
|
#include <haproxy/sample.h>
|
||||||
#include <haproxy/sc_strm.h>
|
#include <haproxy/sc_strm.h>
|
||||||
@ -2670,6 +2671,7 @@ static inline void __do_send_log(struct log_target *target, struct log_header hd
|
|||||||
};
|
};
|
||||||
static THREAD_LOCAL int logfdunix = -1; /* syslog to AF_UNIX socket */
|
static THREAD_LOCAL int logfdunix = -1; /* syslog to AF_UNIX socket */
|
||||||
static THREAD_LOCAL int logfdinet = -1; /* syslog to AF_INET socket */
|
static THREAD_LOCAL int logfdinet = -1; /* syslog to AF_INET socket */
|
||||||
|
const struct protocol *proto;
|
||||||
int *plogfd;
|
int *plogfd;
|
||||||
int sent;
|
int sent;
|
||||||
size_t nbelem;
|
size_t nbelem;
|
||||||
@ -2698,8 +2700,13 @@ static inline void __do_send_log(struct log_target *target, struct log_header hd
|
|||||||
|
|
||||||
if (plogfd && unlikely(*plogfd < 0)) {
|
if (plogfd && unlikely(*plogfd < 0)) {
|
||||||
/* socket not successfully initialized yet */
|
/* socket not successfully initialized yet */
|
||||||
if ((*plogfd = socket(target->addr->ss_family, SOCK_DGRAM,
|
|
||||||
(target->addr->ss_family == AF_UNIX) ? 0 : IPPROTO_UDP)) < 0) {
|
/* WT: this is not compliant with AF_CUST_* usage but we don't use that
|
||||||
|
* with DNS at the moment.
|
||||||
|
*/
|
||||||
|
proto = protocol_lookup(target->addr->ss_family, PROTO_TYPE_DGRAM, 1);
|
||||||
|
BUG_ON(!proto);
|
||||||
|
if ((*plogfd = socket(proto->fam->sock_domain, proto->sock_type, proto->sock_prot)) < 0) {
|
||||||
static char once;
|
static char once;
|
||||||
|
|
||||||
if (!once) {
|
if (!once) {
|
||||||
|
@ -2633,6 +2633,7 @@ static void resolvers_deinit(void)
|
|||||||
*/
|
*/
|
||||||
static int resolvers_finalize_config(void)
|
static int resolvers_finalize_config(void)
|
||||||
{
|
{
|
||||||
|
const struct protocol *proto;
|
||||||
struct resolvers *resolvers;
|
struct resolvers *resolvers;
|
||||||
struct proxy *px;
|
struct proxy *px;
|
||||||
int err_code = 0;
|
int err_code = 0;
|
||||||
@ -2650,7 +2651,9 @@ static int resolvers_finalize_config(void)
|
|||||||
|
|
||||||
if (ns->dgram) {
|
if (ns->dgram) {
|
||||||
/* Check nameserver info */
|
/* Check nameserver info */
|
||||||
if ((fd = socket(ns->dgram->conn.addr.to.ss_family, SOCK_DGRAM, IPPROTO_UDP)) == -1) {
|
proto = protocol_lookup(ns->dgram->conn.addr.to.ss_family, PROTO_TYPE_DGRAM, 1);
|
||||||
|
BUG_ON(!proto);
|
||||||
|
if ((fd = socket(proto->fam->sock_domain, proto->sock_type, proto->sock_prot)) == -1) {
|
||||||
if (!resolvers->conf.implicit) { /* emit a warning only if it was configured manually */
|
if (!resolvers->conf.implicit) { /* emit a warning only if it was configured manually */
|
||||||
ha_alert("resolvers '%s': can't create socket for nameserver '%s'.\n",
|
ha_alert("resolvers '%s': can't create socket for nameserver '%s'.\n",
|
||||||
resolvers->id, ns->id);
|
resolvers->id, ns->id);
|
||||||
|
@ -30,7 +30,7 @@
|
|||||||
#include <haproxy/listener.h>
|
#include <haproxy/listener.h>
|
||||||
#include <haproxy/log.h>
|
#include <haproxy/log.h>
|
||||||
#include <haproxy/namespace.h>
|
#include <haproxy/namespace.h>
|
||||||
#include <haproxy/protocol-t.h>
|
#include <haproxy/protocol.h>
|
||||||
#include <haproxy/proto_sockpair.h>
|
#include <haproxy/proto_sockpair.h>
|
||||||
#include <haproxy/sock.h>
|
#include <haproxy/sock.h>
|
||||||
#include <haproxy/sock_inet.h>
|
#include <haproxy/sock_inet.h>
|
||||||
@ -268,6 +268,7 @@ static int sock_handle_system_err(struct connection *conn, struct proxy *be)
|
|||||||
int sock_create_server_socket(struct connection *conn, struct proxy *be, int *stream_err)
|
int sock_create_server_socket(struct connection *conn, struct proxy *be, int *stream_err)
|
||||||
{
|
{
|
||||||
const struct netns_entry *ns = NULL;
|
const struct netns_entry *ns = NULL;
|
||||||
|
const struct protocol *proto;
|
||||||
int sock_fd;
|
int sock_fd;
|
||||||
|
|
||||||
#ifdef USE_NS
|
#ifdef USE_NS
|
||||||
@ -278,7 +279,9 @@ int sock_create_server_socket(struct connection *conn, struct proxy *be, int *st
|
|||||||
ns = __objt_server(conn->target)->netns;
|
ns = __objt_server(conn->target)->netns;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
sock_fd = my_socketat(ns, conn->dst->ss_family, SOCK_STREAM, 0);
|
proto = protocol_lookup(conn->dst->ss_family, PROTO_TYPE_STREAM, 0);
|
||||||
|
BUG_ON(!proto);
|
||||||
|
sock_fd = my_socketat(ns, proto->fam->sock_domain, SOCK_STREAM, 0);
|
||||||
|
|
||||||
/* at first, handle common to all proto families system limits and permission related errors */
|
/* at first, handle common to all proto families system limits and permission related errors */
|
||||||
if (sock_fd == -1) {
|
if (sock_fd == -1) {
|
||||||
|
@ -1941,6 +1941,7 @@ int addr_is_local(const struct netns_entry *ns,
|
|||||||
const struct sockaddr_storage *orig)
|
const struct sockaddr_storage *orig)
|
||||||
{
|
{
|
||||||
struct sockaddr_storage addr;
|
struct sockaddr_storage addr;
|
||||||
|
const struct proto_fam *fam;
|
||||||
int result;
|
int result;
|
||||||
int fd;
|
int fd;
|
||||||
|
|
||||||
@ -1950,7 +1951,10 @@ int addr_is_local(const struct netns_entry *ns,
|
|||||||
memcpy(&addr, orig, sizeof(addr));
|
memcpy(&addr, orig, sizeof(addr));
|
||||||
set_host_port(&addr, 0);
|
set_host_port(&addr, 0);
|
||||||
|
|
||||||
fd = my_socketat(ns, addr.ss_family, SOCK_DGRAM, IPPROTO_UDP);
|
fam = proto_fam_lookup(addr.ss_family);
|
||||||
|
BUG_ON(!fam);
|
||||||
|
|
||||||
|
fd = my_socketat(ns, fam->sock_domain, SOCK_DGRAM, IPPROTO_UDP);
|
||||||
if (fd < 0)
|
if (fd < 0)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user