diff options
author | Yu Watanabe <watanabe.yu+github@gmail.com> | 2021-12-09 04:30:54 +0900 |
---|---|---|
committer | Zbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl> | 2021-12-09 09:10:51 +0100 |
commit | ab8a8a4e7721270196f9c7984223fcff41754780 (patch) | |
tree | 884302f6abe08f4dc6fab178bc0e6ed10e73602f /src/libsystemd-network/sd-dhcp-client.c | |
parent | d2d602f4b4c1614c35000dd6a5c351c482902ee4 (diff) | |
download | systemd-ab8a8a4e7721270196f9c7984223fcff41754780.tar.gz |
libsystemd-network: ignore -ENETDOWN or friends in recv()
And this makes most errors in io events ignored.
Diffstat (limited to 'src/libsystemd-network/sd-dhcp-client.c')
-rw-r--r-- | src/libsystemd-network/sd-dhcp-client.c | 41 |
1 files changed, 23 insertions, 18 deletions
diff --git a/src/libsystemd-network/sd-dhcp-client.c b/src/libsystemd-network/sd-dhcp-client.c index 14cbde133f..16574d28c7 100644 --- a/src/libsystemd-network/sd-dhcp-client.c +++ b/src/libsystemd-network/sd-dhcp-client.c @@ -1930,13 +1930,13 @@ static int client_receive_message_udp( assert(client); buflen = next_datagram_size_fd(fd); - if (buflen == -ENETDOWN) - /* the link is down. Don't return an error or the I/O event - source will be disconnected and we won't be able to receive - packets again when the link comes back. */ + if (buflen < 0) { + if (ERRNO_IS_TRANSIENT(buflen) || ERRNO_IS_DISCONNECT(buflen)) + return 0; + + log_dhcp_client_errno(client, buflen, "Failed to determine datagram size to read, ignoring: %m"); return 0; - if (buflen < 0) - return buflen; + } message = malloc0(buflen); if (!message) @@ -1944,12 +1944,11 @@ static int client_receive_message_udp( len = recv(fd, message, buflen, 0); if (len < 0) { - /* see comment above for why we shouldn't error out on ENETDOWN. */ - if (ERRNO_IS_TRANSIENT(errno) || errno == ENETDOWN) + if (ERRNO_IS_TRANSIENT(errno) || ERRNO_IS_DISCONNECT(errno)) return 0; - return log_dhcp_client_errno(client, errno, - "Could not receive message from UDP socket: %m"); + log_dhcp_client_errno(client, errno, "Could not receive message from UDP socket, ignoring: %m"); + return 0; } if ((size_t) len < sizeof(DHCPMessage)) { log_dhcp_client(client, "Too small to be a DHCP message: ignoring"); @@ -1995,7 +1994,8 @@ static int client_receive_message_udp( return 0; } - return client_handle_message(client, message, len); + (void) client_handle_message(client, message, len); + return 0; } static int client_receive_message_raw( @@ -2023,10 +2023,13 @@ static int client_receive_message_raw( assert(client); buflen = next_datagram_size_fd(fd); - if (buflen == -ENETDOWN) + if (buflen < 0) { + if (ERRNO_IS_TRANSIENT(buflen) || ERRNO_IS_DISCONNECT(buflen)) + return 0; + + log_dhcp_client_errno(client, buflen, "Failed to determine datagram size to read, ignoring: %m"); return 0; - if (buflen < 0) - return buflen; + } packet = malloc0(buflen); if (!packet) @@ -2036,10 +2039,11 @@ static int client_receive_message_raw( len = recvmsg_safe(fd, &msg, 0); if (len < 0) { - if (ERRNO_IS_TRANSIENT(len) || len == -ENETDOWN) + if (ERRNO_IS_TRANSIENT(len) || ERRNO_IS_DISCONNECT(len)) return 0; - return log_dhcp_client_errno(client, len, - "Could not receive message from raw socket: %m"); + + log_dhcp_client_errno(client, len, "Could not receive message from raw socket, ignoring: %m"); + return 0; } if ((size_t) len < sizeof(DHCPPacket)) return 0; @@ -2056,7 +2060,8 @@ static int client_receive_message_raw( len -= DHCP_IP_UDP_SIZE; - return client_handle_message(client, &packet->dhcp, len); + (void) client_handle_message(client, &packet->dhcp, len); + return 0; } int sd_dhcp_client_send_renew(sd_dhcp_client *client) { |