chiark / gitweb /
sd-rtnl: do not blindly enter containers in message_read()
authorTom Gundersen <teg@jklm.no>
Wed, 5 Mar 2014 10:47:38 +0000 (11:47 +0100)
committerTom Gundersen <teg@jklm.no>
Wed, 5 Mar 2014 10:52:32 +0000 (11:52 +0100)
We need a separate container_enter() function, which will be part of a largerg
API change. For now, just fix message_read().

src/libsystemd/sd-rtnl/rtnl-message.c
src/libsystemd/sd-rtnl/test-rtnl.c

index 95dccc2..41a6e4e 100644 (file)
@@ -778,7 +778,7 @@ int sd_rtnl_message_read(sd_rtnl_message *m, unsigned short *type, void **data)
         if (!RTA_OK(NEXT_RTA(m), remaining_size))
                 return 0;
 
-        /* if we read a container, enter it and return its type */
+        /* if we read a container, return its type, but do not enter it*/
         r = sd_rtnl_message_get_type(m, &rtm_type);
         if (r < 0)
                 return r;
@@ -790,14 +790,12 @@ int sd_rtnl_message_read(sd_rtnl_message *m, unsigned short *type, void **data)
               NEXT_RTA(m)->rta_type == IFLA_LINKINFO) ||
              (m->n_containers == 1 &&
               GET_CONTAINER(m, 0)->rta_type == IFLA_LINKINFO &&
-              NEXT_RTA(m)->rta_type == IFLA_INFO_DATA))) {
+              NEXT_RTA(m)->rta_type == IFLA_INFO_DATA)))
                 *data = NULL;
-                PUSH_CONTAINER(m, NEXT_RTA(m));
-                UPDATE_RTA(m, RTA_DATA(NEXT_RTA(m)));
-        } else {
+        else
                 *data = RTA_DATA(NEXT_RTA(m));
-                UPDATE_RTA(m, RTA_NEXT(NEXT_RTA(m), remaining_size));
-        }
+
+        UPDATE_RTA(m, RTA_NEXT(NEXT_RTA(m), remaining_size));
 
         return 1;
 }
index dd74e76..1016bb6 100644 (file)
@@ -302,6 +302,7 @@ static void test_container(void) {
         assert_se(sd_rtnl_message_read(m, &type, &data) >= 0);
         assert_se(type == IFLA_LINKINFO);
         assert_se(data == NULL);
+/*
         assert_se(sd_rtnl_message_read(m, &type, &data) >= 0);
         assert_se(type == IFLA_INFO_KIND);
         assert_se(streq("kind", (char *)data));
@@ -318,6 +319,7 @@ static void test_container(void) {
         assert_se(streq("kind", (char *)data));
         assert_se(sd_rtnl_message_read(m, &type, &data) == 0);
         assert_se(sd_rtnl_message_exit_container(m) >= 0);
+*/
         assert_se(sd_rtnl_message_exit_container(m) == -EINVAL);
 }