From: Zbigniew Jędrzejewski-Szmek Date: Fri, 24 Apr 2020 05:45:07 +0000 (+0200) Subject: Merge pull request #15570 from poettering/cmsg-find X-Git-Tag: v246-rc1~496 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=11f93798663009d3a83b60ce899c778d9c1f5180;p=thirdparty%2Fsystemd.git Merge pull request #15570 from poettering/cmsg-find CMSG_FIND_DATA() and cmsg_find() work --- 11f93798663009d3a83b60ce899c778d9c1f5180 diff --cc src/libsystemd-network/sd-dhcp-client.c index 31416c9f43f,c23df7b436a..0cff6c4f33d --- a/src/libsystemd-network/sd-dhcp-client.c +++ b/src/libsystemd-network/sd-dhcp-client.c @@@ -1927,25 -1927,21 +1927,21 @@@ static int client_receive_message_raw iov = IOVEC_MAKE(packet, buflen); - len = recvmsg(fd, &msg, 0); - if (len < 0) { - if (IN_SET(errno, EAGAIN, EINTR, ENETDOWN)) - return 0; - - return log_dhcp_client_errno(client, errno, + len = recvmsg_safe(fd, &msg, 0); + if (IN_SET(len, -EAGAIN, -EINTR, -ENETDOWN)) + return 0; + if (len < 0) + return log_dhcp_client_errno(client, len, "Could not receive message from raw socket: %m"); - } else if ((size_t)len < sizeof(DHCPPacket)) + + if ((size_t) len < sizeof(DHCPPacket)) return 0; - CMSG_FOREACH(cmsg, &msg) - if (cmsg->cmsg_level == SOL_PACKET && - cmsg->cmsg_type == PACKET_AUXDATA && - cmsg->cmsg_len == CMSG_LEN(sizeof(struct tpacket_auxdata))) { - struct tpacket_auxdata *aux = (struct tpacket_auxdata*)CMSG_DATA(cmsg); - - checksum = !(aux->tp_status & TP_STATUS_CSUMNOTREADY); - break; - } + cmsg = cmsg_find(&msg, SOL_PACKET, PACKET_AUXDATA, CMSG_LEN(sizeof(struct tpacket_auxdata))); + if (cmsg) { + struct tpacket_auxdata *aux = (struct tpacket_auxdata*) CMSG_DATA(cmsg); + checksum = !(aux->tp_status & TP_STATUS_CSUMNOTREADY); + } r = dhcp_packet_verify_headers(packet, len, checksum, client->port); if (r < 0)