openbsd-ports/net/dnsmasq/patches/patch-src_forward_c
jca 88c0b276c6 Update to dnsmasq-2.80, and fix IP_SENDSRCADDR usage
Among other interesting changes: DHCP rapid commit,
dnssec-check-unsigned is now on for people using dnssec, various bug
fixes.  From Brad (maintainer)

Also fix cmsg API usage that lead us to disable the use of
IP_SENDSRCADDR.  From me.
2019-01-17 10:14:33 +00:00

53 lines
2.1 KiB
Plaintext

$OpenBSD: patch-src_forward_c,v 1.2 2019/01/17 10:14:33 jca Exp $
Don't mix up msg_controllen and cmsg_len.
Don't ignore EINVAL unless on Linux.
Index: src/forward.c
--- src/forward.c.orig
+++ src/forward.c
@@ -68,12 +68,14 @@ int send_from(int fd, int nowild, char *packet, size_t
p.ipi_ifindex = 0;
p.ipi_spec_dst = source->addr.addr4;
memcpy(CMSG_DATA(cmptr), &p, sizeof(p));
- msg.msg_controllen = cmptr->cmsg_len = CMSG_LEN(sizeof(struct in_pktinfo));
+ msg.msg_controllen = CMSG_SPACE(sizeof(struct in_pktinfo));
+ cmptr->cmsg_len = CMSG_LEN(sizeof(struct in_pktinfo));
cmptr->cmsg_level = IPPROTO_IP;
cmptr->cmsg_type = IP_PKTINFO;
#elif defined(IP_SENDSRCADDR)
memcpy(CMSG_DATA(cmptr), &(source->addr.addr4), sizeof(source->addr.addr4));
- msg.msg_controllen = cmptr->cmsg_len = CMSG_LEN(sizeof(struct in_addr));
+ msg.msg_controllen = CMSG_SPACE(sizeof(struct in_addr));
+ cmptr->cmsg_len = CMSG_LEN(sizeof(struct in_addr));
cmptr->cmsg_level = IPPROTO_IP;
cmptr->cmsg_type = IP_SENDSRCADDR;
#endif
@@ -85,7 +87,8 @@ int send_from(int fd, int nowild, char *packet, size_t
p.ipi6_ifindex = iface; /* Need iface for IPv6 to handle link-local addrs */
p.ipi6_addr = source->addr.addr6;
memcpy(CMSG_DATA(cmptr), &p, sizeof(p));
- msg.msg_controllen = cmptr->cmsg_len = CMSG_LEN(sizeof(struct in6_pktinfo));
+ msg.msg_controllen = CMSG_SPACE(sizeof(struct in6_pktinfo));
+ cmptr->cmsg_len = CMSG_LEN(sizeof(struct in6_pktinfo));
cmptr->cmsg_type = daemon->v6pktinfo;
cmptr->cmsg_level = IPPROTO_IPV6;
}
@@ -96,10 +99,13 @@ int send_from(int fd, int nowild, char *packet, size_t
while (retry_send(sendmsg(fd, &msg, 0)));
- /* If interface is still in DAD, EINVAL results - ignore that. */
- if (errno != 0 && errno != EINVAL)
+ if (errno != 0)
{
- my_syslog(LOG_ERR, _("failed to send packet: %s"), strerror(errno));
+#ifdef __linux__
+ /* If interface is still in DAD, EINVAL results - ignore that. */
+ if (errno != EINVAL)
+#endif
+ my_syslog(LOG_ERR, _("failed to send packet: %s"), strerror(errno));
return 0;
}