From d5322e187d6f3d1fa843507012b93328bad98ff3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adrien=20Gallou=C3=ABt?= Date: Sat, 28 Dec 2019 22:05:27 +0000 Subject: [PATCH] Use EAFNOSUPPORT when necessary MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Adrien Gallouët --- mud.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/mud.c b/mud.c index 0046c58..0d14baf 100644 --- a/mud.c +++ b/mud.c @@ -401,10 +401,10 @@ mud_send_path(struct mud *mud, struct mud_path *path, uint64_t now, CMSG_SPACE(sizeof(int)); struct cmsghdr *cmsg = CMSG_FIRSTHDR(&msg); + cmsg->cmsg_level = IPPROTO_IP; cmsg->cmsg_type = MUD_PKTINFO; cmsg->cmsg_len = CMSG_LEN(MUD_PKTINFO_SIZE); - memcpy(MUD_PKTINFO_DST(CMSG_DATA(cmsg)), &((struct sockaddr_in *)&path->local_addr)->sin_addr, sizeof(struct in_addr)); @@ -415,20 +415,18 @@ mud_send_path(struct mud *mud, struct mud_path *path, uint64_t now, cmsg->cmsg_level = IPPROTO_IP; cmsg->cmsg_type = IP_TOS; cmsg->cmsg_len = CMSG_LEN(sizeof(int)); - memcpy(CMSG_DATA(cmsg), &mud->tc, sizeof(int)); - } - if (path->addr.ss_family == AF_INET6) { + } else if (path->addr.ss_family == AF_INET6) { msg.msg_namelen = sizeof(struct sockaddr_in6); msg.msg_controllen = CMSG_SPACE(sizeof(struct in6_pktinfo)) + CMSG_SPACE(sizeof(int)); struct cmsghdr *cmsg = CMSG_FIRSTHDR(&msg); + cmsg->cmsg_level = IPPROTO_IPV6; cmsg->cmsg_type = IPV6_PKTINFO; cmsg->cmsg_len = CMSG_LEN(sizeof(struct in6_pktinfo)); - memcpy(&((struct in6_pktinfo *)CMSG_DATA(cmsg))->ipi6_addr, &((struct sockaddr_in6 *)&path->local_addr)->sin6_addr, sizeof(struct in6_addr)); @@ -439,8 +437,10 @@ mud_send_path(struct mud *mud, struct mud_path *path, uint64_t now, cmsg->cmsg_level = IPPROTO_IPV6; cmsg->cmsg_type = IPV6_TCLASS; cmsg->cmsg_len = CMSG_LEN(sizeof(int)); - memcpy(CMSG_DATA(cmsg), &mud->tc, sizeof(int)); + } else { + errno = EAFNOSUPPORT; + return -1; } ssize_t ret = sendmsg(mud->fd, &msg, flags); @@ -658,7 +658,7 @@ mud_ss_from_sa(struct sockaddr_storage *ss, struct sockaddr *sa) mud_unmapv4(ss); break; default: - errno = EINVAL; + errno = EAFNOSUPPORT; return -1; } @@ -1097,7 +1097,7 @@ mud_send_msg(struct mud *mud, struct mud_path *path, uint64_t now, memcpy(msg->addr.port, &((struct sockaddr_in6 *)&path->addr)->sin6_port, 2); } else { - errno = EINVAL; + errno = EAFNOSUPPORT; return -1; }