diff options
author | Ondrej Zajicek <santiago@crfreenet.org> | 2014-06-26 13:30:27 +0200 |
---|---|---|
committer | Ondrej Zajicek <santiago@crfreenet.org> | 2014-06-26 13:30:27 +0200 |
commit | 8945f73d946a9323daf8dfc1bf5b3884cf6d7664 (patch) | |
tree | 8d1e073804f69d9fe7ca683c4a22dae7bc6be77a /sysdep/linux/sysio.h | |
parent | 9d5960cfa5b4c15ddd48dbab599f864a6aa1e025 (diff) |
Ensures that msg_controllen includes last padding.
Although RFC 3542 allows both cases, Theo de Raadt thinks
he knows better, and msg_controllen without last padding
fails on OpenBSD.
Thanks to Job Snijders for the bugreport.
Diffstat (limited to 'sysdep/linux/sysio.h')
-rw-r--r-- | sysdep/linux/sysio.h | 4 |
1 files changed, 3 insertions, 1 deletions
diff --git a/sysdep/linux/sysio.h b/sysdep/linux/sysio.h index 5fd75c90..c1561cbf 100644 --- a/sysdep/linux/sysio.h +++ b/sysdep/linux/sysio.h @@ -154,6 +154,7 @@ sk_prepare_cmsgs4(sock *s, struct msghdr *msg, void *cbuf, size_t cbuflen) { struct cmsghdr *cm; struct in_pktinfo *pi; + int controllen = 0; msg->msg_control = cbuf; msg->msg_controllen = cbuflen; @@ -162,13 +163,14 @@ sk_prepare_cmsgs4(sock *s, struct msghdr *msg, void *cbuf, size_t cbuflen) cm->cmsg_level = SOL_IP; cm->cmsg_type = IP_PKTINFO; cm->cmsg_len = CMSG_LEN(sizeof(*pi)); + controllen += CMSG_SPACE(sizeof(*pi)); pi = (struct in_pktinfo *) CMSG_DATA(cm); pi->ipi_ifindex = s->iface ? s->iface->index : 0; pi->ipi_spec_dst = ipa_to_in4(s->saddr); pi->ipi_addr = ipa_to_in4(IPA_NONE); - msg->msg_controllen = cm->cmsg_len; + msg->msg_controllen = controllen; } |