From c7936acf714c2d4ffc91249eed37af0664f7cc3f Mon Sep 17 00:00:00 2001 From: John Carter Date: Thu, 15 Feb 2018 19:38:42 +0100 Subject: [PATCH] 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 --- src/coap_io.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/coap_io.c b/src/coap_io.c index f4704bb6..ec247b30 100644 --- a/src/coap_io.c +++ b/src/coap_io.c @@ -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));