chiark / gitweb /
sd-netlink: avoid casting size_t into int
[elogind.git] / src / libsystemd / sd-netlink / netlink-message.c
index e39e4c646c5cded12b41078afb6453a61704a92b..a41d7f96704ea18b87026fefb6376d5b6bcd5b25 100644 (file)
@@ -72,9 +72,6 @@ int message_new(sd_netlink *rtnl, sd_netlink_message **ret, uint16_t type) {
         if (r < 0)
                 return r;
 
-        if (type_get_type(nl_type) != NETLINK_TYPE_NESTED)
-                return -EINVAL;
-
         r = message_new_empty(rtnl, &m);
         if (r < 0)
                 return r;
@@ -88,7 +85,8 @@ int message_new(sd_netlink *rtnl, sd_netlink_message **ret, uint16_t type) {
 
         m->hdr->nlmsg_flags = NLM_F_REQUEST | NLM_F_ACK;
 
-        type_get_type_system(nl_type, &m->container_type_system[0]);
+        if (type_get_type(nl_type) == NETLINK_TYPE_NESTED)
+                type_get_type_system(nl_type, &m->container_type_system[0]);
         m->hdr->nlmsg_len = size;
         m->hdr->nlmsg_type = type;
 
@@ -755,7 +753,7 @@ int sd_netlink_message_enter_container(sd_netlink_message *m, unsigned short typ
         r = rtnl_message_parse(m,
                                &m->rta_offset_tb[m->n_containers],
                                &m->rta_tb_size[m->n_containers],
-                               type_system_get_count(type_system),
+                               type_system_get_max(type_system),
                                container,
                                size);
         if (r < 0) {
@@ -813,17 +811,17 @@ int sd_netlink_message_get_errno(sd_netlink_message *m) {
 int rtnl_message_parse(sd_netlink_message *m,
                        size_t **rta_offset_tb,
                        unsigned short *rta_tb_size,
-                       int count,
+                       int max,
                        struct rtattr *rta,
                        unsigned int rt_len) {
         unsigned short type;
         size_t *tb;
 
-        tb = new0(size_t, count);
+        tb = new0(size_t, max + 1);
         if(!tb)
                 return -ENOMEM;
 
-        *rta_tb_size = count;
+        *rta_tb_size = max + 1;
 
         for (; RTA_OK(rta, rt_len); rta = RTA_NEXT(rta, rt_len)) {
                 type = RTA_TYPE(rta);
@@ -831,7 +829,7 @@ int rtnl_message_parse(sd_netlink_message *m,
                 /* if the kernel is newer than the headers we used
                    when building, we ignore out-of-range attributes
                  */
-                if (type >= count)
+                if (type > max)
                         continue;
 
                 if (tb[type])
@@ -891,7 +889,7 @@ int sd_netlink_message_rewind(sd_netlink_message *m) {
                 r = rtnl_message_parse(m,
                                        &m->rta_offset_tb[m->n_containers],
                                        &m->rta_tb_size[m->n_containers],
-                                       type_system_get_count(type_system),
+                                       type_system_get_max(type_system),
                                        (struct rtattr*)((uint8_t*)NLMSG_DATA(m->hdr) + NLMSG_ALIGN(size)),
                                        NLMSG_PAYLOAD(m->hdr, size));
                 if (r < 0)