coap_io.c: fix apparently uninitialized buffer in syscall param

Valgrind reports Syscall param  sendmsg(msg.msg_control) points to
uninitialised byte(s) due alignment padding in the CMSG macros
leaving uninitialized gaps in struct sent to the sendmsg system call.

This issue was reported including this patch on the libcoap-developers
mailing list [1].

[1] https://sourceforge.net/p/libcoap/mailman/message/36141279/

Signed-off-by: Olaf Bergmann <bergmann@tzi.org>
This commit is contained in:
John Carter authored and Olaf Bergmann committed 2018-02-15 19:38:42 +01:00
1 parent c46de196e5
commit c7936acf71
1 file changed
+2 -3
+2 -3
View File
@@ -700,6 +700,8 @@ coap_network_send(coap_socket_t *sock, const coap_session_t *session, const uint
iov[0].iov_base = (uint8_t*)data;
iov[0].iov_len = (iov_len_t)datalen;
memset( buf, 0, sizeof(buf));
memset(&mhdr, 0, sizeof(struct msghdr));
mhdr.msg_name = (void *)&session->remote_addr.addr;
mhdr.msg_namelen = session->remote_addr.size;
@@ -723,7 +725,6 @@ coap_network_send(coap_socket_t *sock, const coap_session_t *session, const uint
cmsg->cmsg_len = CMSG_LEN(sizeof(struct in_pktinfo));
pktinfo = (struct in_pktinfo *)CMSG_DATA(cmsg);
memset(pktinfo, 0, sizeof(struct in_pktinfo));
pktinfo->ipi_ifindex = session->ifindex;
memcpy(&pktinfo->ipi_spec_dst, session->local_addr.addr.sin6.sin6_addr.s6_addr + 12, sizeof(pktinfo->ipi_spec_dst));
@@ -738,7 +739,6 @@ coap_network_send(coap_socket_t *sock, const coap_session_t *session, const uint
cmsg->cmsg_len = CMSG_LEN(sizeof(struct in6_pktinfo));
pktinfo = (struct in6_pktinfo *)CMSG_DATA(cmsg);
memset(pktinfo, 0, sizeof(struct in6_pktinfo));
pktinfo->ipi6_ifindex = session->ifindex;
memcpy(&pktinfo->ipi6_addr, &session->local_addr.addr.sin6.sin6_addr, sizeof(pktinfo->ipi6_addr));
@@ -760,7 +760,6 @@ coap_network_send(coap_socket_t *sock, const coap_session_t *session, const uint
cmsg->cmsg_len = CMSG_LEN(sizeof(struct in_pktinfo));
pktinfo = (struct in_pktinfo *)CMSG_DATA(cmsg);
memset(pktinfo, 0, sizeof(struct in_pktinfo));
pktinfo->ipi_ifindex = session->ifindex;
memcpy(&pktinfo->ipi_spec_dst, &session->local_addr.addr.sin.sin_addr, sizeof(pktinfo->ipi_spec_dst));