The cmsg macros expect a control message buffer to be aligned like
a struct cmsghdr. The current layout around those stack-allocated
buffers probably provides the required alignment (usually 4 bytes).
Use a union to enforce proper alignment, in case future changes modify
the stack layout.
Spotted when chasing an unrelated bug with Otto Moerbeek (@omoerbeek).
ssize_t sent;
struct msghdr msg;
struct iovec iov[1];
- char control[256];
+ union {
+ struct cmsghdr hdr;
+ char buf[256];
+ } control;
#ifndef S_SPLINT_S
struct cmsghdr *cmsg;
#endif /* S_SPLINT_S */
iov[0].iov_len = sldns_buffer_remaining(packet);
msg.msg_iov = iov;
msg.msg_iovlen = 1;
- msg.msg_control = control;
+ msg.msg_control = control.buf;
#ifndef S_SPLINT_S
- msg.msg_controllen = sizeof(control);
+ msg.msg_controllen = sizeof(control.buf);
#endif /* S_SPLINT_S */
msg.msg_flags = 0;
struct msghdr msg;
struct iovec iov[1];
ssize_t rcv;
- char ancil[256];
+ union {
+ struct cmsghdr hdr;
+ char buf[256];
+ } ancil;
int i;
#ifndef S_SPLINT_S
struct cmsghdr* cmsg;
iov[0].iov_len = sldns_buffer_remaining(rep.c->buffer);
msg.msg_iov = iov;
msg.msg_iovlen = 1;
- msg.msg_control = ancil;
+ msg.msg_control = ancil.buf;
#ifndef S_SPLINT_S
- msg.msg_controllen = sizeof(ancil);
+ msg.msg_controllen = sizeof(ancil.buf);
#endif /* S_SPLINT_S */
msg.msg_flags = 0;
rcv = recvmsg(fd, &msg, 0);