]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
sd-network: unify packet processing logic a bit
authorLennart Poettering <lennart@poettering.net>
Mon, 23 May 2016 13:56:01 +0000 (15:56 +0200)
committerLennart Poettering <lennart@poettering.net>
Thu, 26 May 2016 13:34:41 +0000 (15:34 +0200)
Let's always check for errno being EAGAIN/EINTR the same way, and always log if
we receive weirdly short packets.

src/libsystemd-network/dhcp-internal.h
src/libsystemd-network/sd-dhcp-client.c
src/libsystemd-network/sd-dhcp6-client.c
src/libsystemd-network/sd-ipv4acd.c
src/libsystemd-network/sd-ndisc.c

index 4662b0d8474ecd6b377458946551ec881958bc30..99f690897df9f11894fe87d31cfaa6db0d885bfc 100644 (file)
@@ -65,4 +65,5 @@ int dhcp_packet_verify_headers(DHCPPacket *packet, size_t len, bool checksum);
 #define DHCP_CLIENT_DONT_DESTROY(client) \
         _cleanup_(sd_dhcp_client_unrefp) _unused_ sd_dhcp_client *_dont_destroy_##client = sd_dhcp_client_ref(client)
 
-#define log_dhcp_client(client, fmt, ...) log_internal(LOG_DEBUG, 0, __FILE__, __LINE__, __func__, "DHCP CLIENT (0x%x): " fmt, client->xid, ##__VA_ARGS__)
+#define log_dhcp_client_errno(client, error, fmt, ...) log_internal(LOG_DEBUG, error, __FILE__, __LINE__, __func__, "DHCP CLIENT (0x%x): " fmt, client->xid, ##__VA_ARGS__)
+#define log_dhcp_client(client, fmt, ...) log_dhcp_client_errno(client, 0, fmt, ##__VA_ARGS__)
index ad79c6cc2cbac76f9ffab8a744bb902dcf1d40f4..f0ad9efbc635a423dca1a78cc0683c180cf7f9ba 100644 (file)
@@ -1645,9 +1645,9 @@ static int client_receive_message_udp(
                 if (errno == EAGAIN || errno == EINTR)
                         return 0;
 
-                log_dhcp_client(client, "Could not receive message from UDP socket: %m");
-                return -errno;
-        } else if ((size_t)len < sizeof(DHCPMessage)) {
+                return log_dhcp_client_errno(client, errno, "Could not receive message from UDP socket: %m");
+        }
+        if ((size_t) len < sizeof(DHCPMessage)) {
                 log_dhcp_client(client, "Too small to be a DHCP message: ignoring");
                 return 0;
         }
index 05972e01c938ff75ceaf3a681021ccfe83ee7136..7dead2483678b60098a0df2cb0488efeeb74f4d2 100644 (file)
@@ -898,7 +898,12 @@ static int client_receive_advertise(sd_dhcp6_client *client, DHCP6Message *adver
         return r;
 }
 
-static int client_receive_message(sd_event_source *s, int fd, uint32_t revents, void *userdata) {
+static int client_receive_message(
+                sd_event_source *s,
+                int fd, uint32_t
+                revents,
+                void *userdata) {
+
         sd_dhcp6_client *client = userdata;
         DHCP6_CLIENT_DONT_DESTROY(client);
         _cleanup_free_ DHCP6Message *message = NULL;
@@ -924,8 +929,11 @@ static int client_receive_message(sd_event_source *s, int fd, uint32_t revents,
 
                 return log_dhcp6_client_errno(client, errno, "Could not receive message from UDP socket: %m");
 
-        } else if ((size_t)len < sizeof(DHCP6Message))
+        }
+        if ((size_t) len < sizeof(DHCP6Message)) {
+                log_dhcp6_client(client, "Too small to be DHCP6 message: ignoring");
                 return 0;
+        }
 
         switch(message->type) {
         case DHCP6_SOLICIT:
index c1f43c824bb30a6b085a21f830b4b899ed0789a9..3c9fa85198506ee1edac2f1ea9679fc2e5d0af8f 100644 (file)
@@ -366,6 +366,9 @@ static int ipv4acd_on_packet(
 
         n = recv(fd, &packet, sizeof(struct ether_arp), 0);
         if (n < 0) {
+                if (errno == EAGAIN || errno == EINTR)
+                        return 0;
+
                 r = log_ipv4acd_debug_errno(ll, errno, "Failed to read ARP packet: %m");
                 goto out;
         }
index fb4ef556730d75ba140ec763a96a2a266b596db9..8d18707de14575fa47e2382d3d70079f3d845c9b 100644 (file)
@@ -517,9 +517,13 @@ static int ndisc_router_advertisment_recv(sd_event_source *s, int fd, uint32_t r
 
                 log_ndisc(nd, "Could not receive message from ICMPv6 socket: %m");
                 return -errno;
-        } else if ((size_t)len < sizeof(struct nd_router_advert)) {
+        }
+        if ((size_t) len < sizeof(struct nd_router_advert)) {
+                log_ndisc(nd, "Too small to be a router advertisement: ignoring");
                 return 0;
-        } else if (msg.msg_namelen == 0)
+        }
+
+        if (msg.msg_namelen == 0)
                 gw = NULL; /* only happens when running the test-suite over a socketpair */
         else if (msg.msg_namelen != sizeof(sa.in6)) {
                 log_ndisc(nd, "Received invalid source address size from ICMPv6 socket: %zu bytes", (size_t)msg.msg_namelen);