mirror of
https://github.com/NLnetLabs/unbound.git
synced 2025-12-20 23:00:56 -05:00
- Fix uninitialized memory passed in padding bytes of cmsg to sendmsg.
This commit is contained in:
parent
c4566aa5d3
commit
8756ad63dd
2 changed files with 21 additions and 0 deletions
|
|
@ -1,6 +1,7 @@
|
||||||
18 August 2023: Wouter
|
18 August 2023: Wouter
|
||||||
- Fix for iter_dec_attempts that could cause a hang, part of
|
- Fix for iter_dec_attempts that could cause a hang, part of
|
||||||
capsforid and qname minimisation, depending on the settings.
|
capsforid and qname minimisation, depending on the settings.
|
||||||
|
- Fix uninitialized memory passed in padding bytes of cmsg to sendmsg.
|
||||||
|
|
||||||
17 August 2023: Wouter
|
17 August 2023: Wouter
|
||||||
- Merge PR #762: Downstream DNS Server Cookies a la RFC7873 and
|
- Merge PR #762: Downstream DNS Server Cookies a la RFC7873 and
|
||||||
|
|
|
||||||
|
|
@ -592,6 +592,11 @@ comm_point_send_udp_msg_if(struct comm_point *c, sldns_buffer* packet,
|
||||||
cmsg_data = CMSG_DATA(cmsg);
|
cmsg_data = CMSG_DATA(cmsg);
|
||||||
((struct in_pktinfo *) cmsg_data)->ipi_ifindex = 0;
|
((struct in_pktinfo *) cmsg_data)->ipi_ifindex = 0;
|
||||||
cmsg->cmsg_len = CMSG_LEN(sizeof(struct in_pktinfo));
|
cmsg->cmsg_len = CMSG_LEN(sizeof(struct in_pktinfo));
|
||||||
|
/* zero the padding bytes inserted by the CMSG_LEN */
|
||||||
|
if(sizeof(struct in_pktinfo) < cmsg->cmsg_len)
|
||||||
|
memset(((uint8_t*)(CMSG_DATA(cmsg))) +
|
||||||
|
sizeof(struct in_pktinfo), 0, cmsg->cmsg_len
|
||||||
|
- sizeof(struct in_pktinfo));
|
||||||
#elif defined(IP_SENDSRCADDR)
|
#elif defined(IP_SENDSRCADDR)
|
||||||
msg.msg_controllen = CMSG_SPACE(sizeof(struct in_addr));
|
msg.msg_controllen = CMSG_SPACE(sizeof(struct in_addr));
|
||||||
log_assert(msg.msg_controllen <= sizeof(control.buf));
|
log_assert(msg.msg_controllen <= sizeof(control.buf));
|
||||||
|
|
@ -600,6 +605,11 @@ comm_point_send_udp_msg_if(struct comm_point *c, sldns_buffer* packet,
|
||||||
memmove(CMSG_DATA(cmsg), &r->pktinfo.v4addr,
|
memmove(CMSG_DATA(cmsg), &r->pktinfo.v4addr,
|
||||||
sizeof(struct in_addr));
|
sizeof(struct in_addr));
|
||||||
cmsg->cmsg_len = CMSG_LEN(sizeof(struct in_addr));
|
cmsg->cmsg_len = CMSG_LEN(sizeof(struct in_addr));
|
||||||
|
/* zero the padding bytes inserted by the CMSG_LEN */
|
||||||
|
if(sizeof(struct in_addr) < cmsg->cmsg_len)
|
||||||
|
memset(((uint8_t*)(CMSG_DATA(cmsg))) +
|
||||||
|
sizeof(struct in_addr), 0, cmsg->cmsg_len
|
||||||
|
- sizeof(struct in_addr));
|
||||||
#else
|
#else
|
||||||
verbose(VERB_ALGO, "no IP_PKTINFO or IP_SENDSRCADDR");
|
verbose(VERB_ALGO, "no IP_PKTINFO or IP_SENDSRCADDR");
|
||||||
msg.msg_control = NULL;
|
msg.msg_control = NULL;
|
||||||
|
|
@ -616,6 +626,11 @@ comm_point_send_udp_msg_if(struct comm_point *c, sldns_buffer* packet,
|
||||||
cmsg_data = CMSG_DATA(cmsg);
|
cmsg_data = CMSG_DATA(cmsg);
|
||||||
((struct in6_pktinfo *) cmsg_data)->ipi6_ifindex = 0;
|
((struct in6_pktinfo *) cmsg_data)->ipi6_ifindex = 0;
|
||||||
cmsg->cmsg_len = CMSG_LEN(sizeof(struct in6_pktinfo));
|
cmsg->cmsg_len = CMSG_LEN(sizeof(struct in6_pktinfo));
|
||||||
|
/* zero the padding bytes inserted by the CMSG_LEN */
|
||||||
|
if(sizeof(struct in6_pktinfo) < cmsg->cmsg_len)
|
||||||
|
memset(((uint8_t*)(CMSG_DATA(cmsg))) +
|
||||||
|
sizeof(struct in6_pktinfo), 0, cmsg->cmsg_len
|
||||||
|
- sizeof(struct in6_pktinfo));
|
||||||
} else {
|
} else {
|
||||||
/* try to pass all 0 to use default route */
|
/* try to pass all 0 to use default route */
|
||||||
msg.msg_controllen = CMSG_SPACE(sizeof(struct in6_pktinfo));
|
msg.msg_controllen = CMSG_SPACE(sizeof(struct in6_pktinfo));
|
||||||
|
|
@ -624,6 +639,11 @@ comm_point_send_udp_msg_if(struct comm_point *c, sldns_buffer* packet,
|
||||||
cmsg->cmsg_type = IPV6_PKTINFO;
|
cmsg->cmsg_type = IPV6_PKTINFO;
|
||||||
memset(CMSG_DATA(cmsg), 0, sizeof(struct in6_pktinfo));
|
memset(CMSG_DATA(cmsg), 0, sizeof(struct in6_pktinfo));
|
||||||
cmsg->cmsg_len = CMSG_LEN(sizeof(struct in6_pktinfo));
|
cmsg->cmsg_len = CMSG_LEN(sizeof(struct in6_pktinfo));
|
||||||
|
/* zero the padding bytes inserted by the CMSG_LEN */
|
||||||
|
if(sizeof(struct in6_pktinfo) < cmsg->cmsg_len)
|
||||||
|
memset(((uint8_t*)(CMSG_DATA(cmsg))) +
|
||||||
|
sizeof(struct in6_pktinfo), 0, cmsg->cmsg_len
|
||||||
|
- sizeof(struct in6_pktinfo));
|
||||||
}
|
}
|
||||||
#endif /* S_SPLINT_S */
|
#endif /* S_SPLINT_S */
|
||||||
if(verbosity >= VERB_ALGO && r->srctype != 0)
|
if(verbosity >= VERB_ALGO && r->srctype != 0)
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue