From: David Herrmann Date: Tue, 23 Jun 2015 10:10:38 +0000 (+0200) Subject: sd-netlink: don't treat NULL as root type-system X-Git-Tag: v226.4~1^2~251 X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=commitdiff_plain;h=2f80599e296658b1322d9dca08adee57fde8a8e3;ds=sidebyside sd-netlink: don't treat NULL as root type-system Explicitly export the root type-system to the type-system callers. This avoids treating NULL as root, which for one really looks backwards (NULL is usually a leaf, not root), and secondly prevents us from properly debugging calling into non-nested types. Also rename the root to "type_system_root". Once we support more than rtnl, well will have to revisit that, anyway. --- diff --git a/src/libsystemd/sd-netlink/netlink-message.c b/src/libsystemd/sd-netlink/netlink-message.c index bfbc0e6c9..3f8bf0182 100644 --- a/src/libsystemd/sd-netlink/netlink-message.c +++ b/src/libsystemd/sd-netlink/netlink-message.c @@ -68,7 +68,7 @@ int message_new(sd_netlink *rtnl, sd_netlink_message **ret, uint16_t type) { size_t size; int r; - r = type_system_get_type(NULL, &nl_type, type); + r = type_system_get_type(&type_system_root, &nl_type, type); if (r < 0) return r; @@ -872,7 +872,7 @@ int sd_netlink_message_rewind(sd_netlink_message *m) { assert(m->hdr); - r = type_system_get_type(NULL, &nl_type, m->hdr->nlmsg_type); + r = type_system_get_type(&type_system_root, &nl_type, m->hdr->nlmsg_type); if (r < 0) return r; diff --git a/src/libsystemd/sd-netlink/netlink-types.c b/src/libsystemd/sd-netlink/netlink-types.c index d22194ad7..40548dcbc 100644 --- a/src/libsystemd/sd-netlink/netlink-types.c +++ b/src/libsystemd/sd-netlink/netlink-types.c @@ -476,7 +476,7 @@ static const NLType rtnl_types[RTM_MAX + 1] = { [RTM_GETNEIGH] = { .type = NETLINK_TYPE_NESTED, .type_system = &rtnl_neigh_type_system, .size = sizeof(struct ndmsg) }, }; -const NLTypeSystem rtnl_type_system = { +const NLTypeSystem type_system_root = { .count = ELEMENTSOF(rtnl_types), .types = rtnl_types, }; @@ -518,10 +518,7 @@ int type_system_get_type(const NLTypeSystem *type_system, const NLType **ret, ui const NLType *nl_type; assert(ret); - - if (!type_system) - type_system = &rtnl_type_system; - + assert(type_system); assert(type_system->types); if (type >= type_system->count) diff --git a/src/libsystemd/sd-netlink/netlink-types.h b/src/libsystemd/sd-netlink/netlink-types.h index d64229546..b1ef7af42 100644 --- a/src/libsystemd/sd-netlink/netlink-types.h +++ b/src/libsystemd/sd-netlink/netlink-types.h @@ -52,6 +52,8 @@ struct NLTypeSystemUnion { const NLTypeSystem *type_systems; }; +extern const NLTypeSystem type_system_root; + uint16_t type_get_type(const NLType *type); size_t type_get_size(const NLType *type); void type_get_type_system(const NLType *type, const NLTypeSystem **ret);