[systemd-devel] [PATCH] libsystemd doesn't handle properly empty messages from kernel

Alin Rauta alin.rauta at intel.com
Wed Mar 18 05:06:19 PDT 2015


---
 src/libsystemd/sd-rtnl/rtnl-message.c |  4 +++-
 src/libsystemd/sd-rtnl/rtnl-types.c   |  1 +
 src/libsystemd/sd-rtnl/sd-rtnl.c      | 14 ++++++++++++++
 3 files changed, 18 insertions(+), 1 deletion(-)

diff --git a/src/libsystemd/sd-rtnl/rtnl-message.c b/src/libsystemd/sd-rtnl/rtnl-message.c
index 5a71900..c938471 100644
--- a/src/libsystemd/sd-rtnl/rtnl-message.c
+++ b/src/libsystemd/sd-rtnl/rtnl-message.c
@@ -1554,7 +1554,9 @@ int socket_read_message(sd_rtnl *rtnl) {
                         /* finished reading multi-part message */
                         done = true;
 
-                        continue;
+                        /* if first is not defined, put NLMSG_DONE into the receive queue. */
+                        if (first)
+                                continue;
                 }
 
                 /* check that we support this message type */
diff --git a/src/libsystemd/sd-rtnl/rtnl-types.c b/src/libsystemd/sd-rtnl/rtnl-types.c
index e21c898..bf7278f 100644
--- a/src/libsystemd/sd-rtnl/rtnl-types.c
+++ b/src/libsystemd/sd-rtnl/rtnl-types.c
@@ -411,6 +411,7 @@ static const NLTypeSystem rtnl_neigh_type_system = {
 };
 
 static const NLType rtnl_types[RTM_MAX + 1] = {
+        [NLMSG_DONE]   = { .type = NLA_META, .size = 0 },
         [NLMSG_ERROR]  = { .type = NLA_META, .size = sizeof(struct nlmsgerr) },
         [RTM_NEWLINK]  = { .type = NLA_NESTED, .type_system = &rtnl_link_type_system, .size = sizeof(struct ifinfomsg) },
         [RTM_DELLINK]  = { .type = NLA_NESTED, .type_system = &rtnl_link_type_system, .size = sizeof(struct ifinfomsg) },
diff --git a/src/libsystemd/sd-rtnl/sd-rtnl.c b/src/libsystemd/sd-rtnl/sd-rtnl.c
index 50162c3..abec6f7 100644
--- a/src/libsystemd/sd-rtnl/sd-rtnl.c
+++ b/src/libsystemd/sd-rtnl/sd-rtnl.c
@@ -726,6 +726,8 @@ int sd_rtnl_call(sd_rtnl *rtnl,
                         received_serial = rtnl_message_get_serial(incoming);
 
                         if (received_serial == serial) {
+                                uint16_t type;
+
                                 /* found a match, remove from rqueue and return it */
                                 memmove(rtnl->rqueue + i,rtnl->rqueue + i + 1,
                                         sizeof(sd_rtnl_message*) * (rtnl->rqueue_size - i - 1));
@@ -737,6 +739,18 @@ int sd_rtnl_call(sd_rtnl *rtnl,
                                         return r;
                                 }
 
+                                r = sd_rtnl_message_get_type(incoming, &type);
+                                if (r < 0) {
+                                        sd_rtnl_message_unref(incoming);
+                                        return r;
+                                }
+
+                                if (type == NLMSG_DONE) {
+                                        log_debug("Got empty message");
+                                        sd_rtnl_message_unref(incoming);
+                                        return 1;
+                                }
+
                                 if (ret) {
                                         *ret = incoming;
                                 } else
-- 
1.9.3



More information about the systemd-devel mailing list