Remove duplicate address family from listener

Since address already contain family, remove separate family from
listener. Use now family from address itself.
This commit is contained in:
Petr Menšík
2019-07-15 17:16:44 +02:00
committed by Simon Kelley
parent 49bdf1ead9
commit 1c1b925052
4 changed files with 30 additions and 29 deletions

View File

@@ -572,7 +572,7 @@ struct irec {
}; };
struct listener { struct listener {
int fd, tcpfd, tftpfd, family, used; int fd, tcpfd, tftpfd, used;
union mysockaddr addr; union mysockaddr addr;
struct irec *iface; /* only sometimes valid for non-wildcard */ struct irec *iface; /* only sometimes valid for non-wildcard */
struct listener *next; struct listener *next;

View File

@@ -1284,8 +1284,9 @@ void receive_query(struct listener *listen, time_t now)
CMSG_SPACE(sizeof(struct sockaddr_dl))]; CMSG_SPACE(sizeof(struct sockaddr_dl))];
#endif #endif
} control_u; } control_u;
int family = listen->addr.sa.sa_family;
/* Can always get recvd interface for IPv6 */ /* Can always get recvd interface for IPv6 */
int check_dst = !option_bool(OPT_NOWILD) || listen->family == AF_INET6; int check_dst = !option_bool(OPT_NOWILD) || family == AF_INET6;
/* packet buffer overwritten */ /* packet buffer overwritten */
daemon->srv_save = NULL; daemon->srv_save = NULL;
@@ -1297,7 +1298,7 @@ void receive_query(struct listener *listen, time_t now)
{ {
auth_dns = listen->iface->dns_auth; auth_dns = listen->iface->dns_auth;
if (listen->family == AF_INET) if (family == AF_INET)
{ {
dst_addr_4 = dst_addr.addr4 = listen->iface->addr.in.sin_addr; dst_addr_4 = dst_addr.addr4 = listen->iface->addr.in.sin_addr;
netmask = listen->iface->netmask; netmask = listen->iface->netmask;
@@ -1327,9 +1328,9 @@ void receive_query(struct listener *listen, time_t now)
information disclosure. */ information disclosure. */
memset(daemon->packet + n, 0, daemon->edns_pktsz - n); memset(daemon->packet + n, 0, daemon->edns_pktsz - n);
source_addr.sa.sa_family = listen->family; source_addr.sa.sa_family = family;
if (listen->family == AF_INET) if (family == AF_INET)
{ {
/* Source-port == 0 is an error, we can't send back to that. /* Source-port == 0 is an error, we can't send back to that.
http://www.ietf.org/mail-archive/web/dnsop/current/msg11441.html */ http://www.ietf.org/mail-archive/web/dnsop/current/msg11441.html */
@@ -1349,7 +1350,7 @@ void receive_query(struct listener *listen, time_t now)
{ {
struct addrlist *addr; struct addrlist *addr;
if (listen->family == AF_INET6) if (family == AF_INET6)
{ {
for (addr = daemon->interface_addrs; addr; addr = addr->next) for (addr = daemon->interface_addrs; addr; addr = addr->next)
if ((addr->flags & ADDRLIST_IPV6) && if ((addr->flags & ADDRLIST_IPV6) &&
@@ -1387,7 +1388,7 @@ void receive_query(struct listener *listen, time_t now)
return; return;
#if defined(HAVE_LINUX_NETWORK) #if defined(HAVE_LINUX_NETWORK)
if (listen->family == AF_INET) if (family == AF_INET)
for (cmptr = CMSG_FIRSTHDR(&msg); cmptr; cmptr = CMSG_NXTHDR(&msg, cmptr)) for (cmptr = CMSG_FIRSTHDR(&msg); cmptr; cmptr = CMSG_NXTHDR(&msg, cmptr))
if (cmptr->cmsg_level == IPPROTO_IP && cmptr->cmsg_type == IP_PKTINFO) if (cmptr->cmsg_level == IPPROTO_IP && cmptr->cmsg_type == IP_PKTINFO)
{ {
@@ -1400,7 +1401,7 @@ void receive_query(struct listener *listen, time_t now)
if_index = p.p->ipi_ifindex; if_index = p.p->ipi_ifindex;
} }
#elif defined(IP_RECVDSTADDR) && defined(IP_RECVIF) #elif defined(IP_RECVDSTADDR) && defined(IP_RECVIF)
if (listen->family == AF_INET) if (family == AF_INET)
{ {
for (cmptr = CMSG_FIRSTHDR(&msg); cmptr; cmptr = CMSG_NXTHDR(&msg, cmptr)) for (cmptr = CMSG_FIRSTHDR(&msg); cmptr; cmptr = CMSG_NXTHDR(&msg, cmptr))
{ {
@@ -1425,7 +1426,7 @@ void receive_query(struct listener *listen, time_t now)
} }
#endif #endif
if (listen->family == AF_INET6) if (family == AF_INET6)
{ {
for (cmptr = CMSG_FIRSTHDR(&msg); cmptr; cmptr = CMSG_NXTHDR(&msg, cmptr)) for (cmptr = CMSG_FIRSTHDR(&msg); cmptr; cmptr = CMSG_NXTHDR(&msg, cmptr))
if (cmptr->cmsg_level == IPPROTO_IPV6 && cmptr->cmsg_type == daemon->v6pktinfo) if (cmptr->cmsg_level == IPPROTO_IPV6 && cmptr->cmsg_type == daemon->v6pktinfo)
@@ -1446,16 +1447,16 @@ void receive_query(struct listener *listen, time_t now)
if (!indextoname(listen->fd, if_index, ifr.ifr_name)) if (!indextoname(listen->fd, if_index, ifr.ifr_name))
return; return;
if (!iface_check(listen->family, &dst_addr, ifr.ifr_name, &auth_dns)) if (!iface_check(family, &dst_addr, ifr.ifr_name, &auth_dns))
{ {
if (!option_bool(OPT_CLEVERBIND)) if (!option_bool(OPT_CLEVERBIND))
enumerate_interfaces(0); enumerate_interfaces(0);
if (!loopback_exception(listen->fd, listen->family, &dst_addr, ifr.ifr_name) && if (!loopback_exception(listen->fd, family, &dst_addr, ifr.ifr_name) &&
!label_exception(if_index, listen->family, &dst_addr)) !label_exception(if_index, family, &dst_addr))
return; return;
} }
if (listen->family == AF_INET && option_bool(OPT_LOCALISE)) if (family == AF_INET && option_bool(OPT_LOCALISE))
{ {
struct irec *iface; struct irec *iface;
@@ -1500,7 +1501,7 @@ void receive_query(struct listener *listen, time_t now)
#endif #endif
char *types = querystr(auth_dns ? "auth" : "query", type); char *types = querystr(auth_dns ? "auth" : "query", type);
if (listen->family == AF_INET) if (family == AF_INET)
log_query(F_QUERY | F_IPV4 | F_FORWARD, daemon->namebuff, log_query(F_QUERY | F_IPV4 | F_FORWARD, daemon->namebuff,
(union all_addr *)&source_addr.in.sin_addr, types); (union all_addr *)&source_addr.in.sin_addr, types);
else else

View File

@@ -964,7 +964,6 @@ static struct listener *create_listeners(union mysockaddr *addr, int do_tftp, in
{ {
l = safe_malloc(sizeof(struct listener)); l = safe_malloc(sizeof(struct listener));
l->next = NULL; l->next = NULL;
l->family = addr->sa.sa_family;
l->fd = fd; l->fd = fd;
l->tcpfd = tcpfd; l->tcpfd = tcpfd;
l->tftpfd = tftpfd; l->tftpfd = tftpfd;

View File

@@ -61,8 +61,9 @@ void tftp_request(struct listener *listen, time_t now)
char *prefix = daemon->tftp_prefix; char *prefix = daemon->tftp_prefix;
struct tftp_prefix *pref; struct tftp_prefix *pref;
union all_addr addra; union all_addr addra;
int family = listen->addr.sa.sa_family;
/* Can always get recvd interface for IPv6 */ /* Can always get recvd interface for IPv6 */
int check_dest = !option_bool(OPT_NOWILD) || listen->family == AF_INET6; int check_dest = !option_bool(OPT_NOWILD) || family == AF_INET6;
union { union {
struct cmsghdr align; /* this ensures alignment */ struct cmsghdr align; /* this ensures alignment */
char control6[CMSG_SPACE(sizeof(struct in6_pktinfo))]; char control6[CMSG_SPACE(sizeof(struct in6_pktinfo))];
@@ -121,10 +122,10 @@ void tftp_request(struct listener *listen, time_t now)
if (msg.msg_controllen < sizeof(struct cmsghdr)) if (msg.msg_controllen < sizeof(struct cmsghdr))
return; return;
addr.sa.sa_family = listen->family; addr.sa.sa_family = family;
#if defined(HAVE_LINUX_NETWORK) #if defined(HAVE_LINUX_NETWORK)
if (listen->family == AF_INET) if (family == AF_INET)
for (cmptr = CMSG_FIRSTHDR(&msg); cmptr; cmptr = CMSG_NXTHDR(&msg, cmptr)) for (cmptr = CMSG_FIRSTHDR(&msg); cmptr; cmptr = CMSG_NXTHDR(&msg, cmptr))
if (cmptr->cmsg_level == IPPROTO_IP && cmptr->cmsg_type == IP_PKTINFO) if (cmptr->cmsg_level == IPPROTO_IP && cmptr->cmsg_type == IP_PKTINFO)
{ {
@@ -138,7 +139,7 @@ void tftp_request(struct listener *listen, time_t now)
} }
#elif defined(HAVE_SOLARIS_NETWORK) #elif defined(HAVE_SOLARIS_NETWORK)
if (listen->family == AF_INET) if (family == AF_INET)
for (cmptr = CMSG_FIRSTHDR(&msg); cmptr; cmptr = CMSG_NXTHDR(&msg, cmptr)) for (cmptr = CMSG_FIRSTHDR(&msg); cmptr; cmptr = CMSG_NXTHDR(&msg, cmptr))
{ {
union { union {
@@ -154,7 +155,7 @@ void tftp_request(struct listener *listen, time_t now)
} }
#elif defined(IP_RECVDSTADDR) && defined(IP_RECVIF) #elif defined(IP_RECVDSTADDR) && defined(IP_RECVIF)
if (listen->family == AF_INET) if (family == AF_INET)
for (cmptr = CMSG_FIRSTHDR(&msg); cmptr; cmptr = CMSG_NXTHDR(&msg, cmptr)) for (cmptr = CMSG_FIRSTHDR(&msg); cmptr; cmptr = CMSG_NXTHDR(&msg, cmptr))
{ {
union { union {
@@ -171,7 +172,7 @@ void tftp_request(struct listener *listen, time_t now)
#endif #endif
if (listen->family == AF_INET6) if (family == AF_INET6)
{ {
for (cmptr = CMSG_FIRSTHDR(&msg); cmptr; cmptr = CMSG_NXTHDR(&msg, cmptr)) for (cmptr = CMSG_FIRSTHDR(&msg); cmptr; cmptr = CMSG_NXTHDR(&msg, cmptr))
if (cmptr->cmsg_level == IPPROTO_IPV6 && cmptr->cmsg_type == daemon->v6pktinfo) if (cmptr->cmsg_level == IPPROTO_IPV6 && cmptr->cmsg_type == daemon->v6pktinfo)
@@ -194,7 +195,7 @@ void tftp_request(struct listener *listen, time_t now)
addra.addr4 = addr.in.sin_addr; addra.addr4 = addr.in.sin_addr;
if (listen->family == AF_INET6) if (family == AF_INET6)
addra.addr6 = addr.in6.sin6_addr; addra.addr6 = addr.in6.sin6_addr;
if (daemon->tftp_interfaces) if (daemon->tftp_interfaces)
@@ -210,12 +211,12 @@ void tftp_request(struct listener *listen, time_t now)
else else
{ {
/* Do the same as DHCP */ /* Do the same as DHCP */
if (!iface_check(listen->family, &addra, name, NULL)) if (!iface_check(family, &addra, name, NULL))
{ {
if (!option_bool(OPT_CLEVERBIND)) if (!option_bool(OPT_CLEVERBIND))
enumerate_interfaces(0); enumerate_interfaces(0);
if (!loopback_exception(listen->tftpfd, listen->family, &addra, name) && if (!loopback_exception(listen->tftpfd, family, &addra, name) &&
!label_exception(if_index, listen->family, &addra)) !label_exception(if_index, family, &addra))
return; return;
} }
@@ -281,7 +282,7 @@ void tftp_request(struct listener *listen, time_t now)
prefix = pref->prefix; prefix = pref->prefix;
} }
if (listen->family == AF_INET) if (family == AF_INET)
{ {
addr.in.sin_port = htons(port); addr.in.sin_port = htons(port);
#ifdef HAVE_SOCKADDR_SA_LEN #ifdef HAVE_SOCKADDR_SA_LEN
@@ -304,7 +305,7 @@ void tftp_request(struct listener *listen, time_t now)
if (option_bool(OPT_SINGLE_PORT)) if (option_bool(OPT_SINGLE_PORT))
transfer->sockfd = listen->tftpfd; transfer->sockfd = listen->tftpfd;
else if ((transfer->sockfd = socket(listen->family, SOCK_DGRAM, 0)) == -1) else if ((transfer->sockfd = socket(family, SOCK_DGRAM, 0)) == -1)
{ {
free(transfer); free(transfer);
return; return;
@@ -337,7 +338,7 @@ void tftp_request(struct listener *listen, time_t now)
{ {
if (++port <= daemon->end_tftp_port) if (++port <= daemon->end_tftp_port)
{ {
if (listen->family == AF_INET) if (family == AF_INET)
addr.in.sin_port = htons(port); addr.in.sin_port = htons(port);
else else
addr.in6.sin6_port = htons(port); addr.in6.sin6_port = htons(port);
@@ -375,7 +376,7 @@ void tftp_request(struct listener *listen, time_t now)
if ((opt = next(&p, end)) && !option_bool(OPT_TFTP_NOBLOCK)) if ((opt = next(&p, end)) && !option_bool(OPT_TFTP_NOBLOCK))
{ {
/* 32 bytes for IP, UDP and TFTP headers, 52 bytes for IPv6 */ /* 32 bytes for IP, UDP and TFTP headers, 52 bytes for IPv6 */
int overhead = (listen->family == AF_INET) ? 32 : 52; int overhead = (family == AF_INET) ? 32 : 52;
transfer->blocksize = atoi(opt); transfer->blocksize = atoi(opt);
if (transfer->blocksize < 1) if (transfer->blocksize < 1)
transfer->blocksize = 1; transfer->blocksize = 1;