From 73ae2b7dade339c8a258dcf4fa2b302e238117e1 Mon Sep 17 00:00:00 2001 From: Tom Gundersen Date: Tue, 2 Dec 2014 00:59:02 +0100 Subject: [PATCH] sd-rtnl: message - allow checking for attributes without reading out their contents --- src/libsystemd/sd-rtnl/rtnl-message.c | 40 +++++++++++++++++++++------ 1 file changed, 32 insertions(+), 8 deletions(-) diff --git a/src/libsystemd/sd-rtnl/rtnl-message.c b/src/libsystemd/sd-rtnl/rtnl-message.c index 22ee4c504..e7238d530 100644 --- a/src/libsystemd/sd-rtnl/rtnl-message.c +++ b/src/libsystemd/sd-rtnl/rtnl-message.c @@ -830,6 +830,8 @@ int sd_rtnl_message_read_string(sd_rtnl_message *m, unsigned short type, const c int r; void *attr_data; + assert_return(m, -EINVAL); + r = message_attribute_has_type(m, type, NLA_STRING); if (r < 0) return r; @@ -840,7 +842,8 @@ int sd_rtnl_message_read_string(sd_rtnl_message *m, unsigned short type, const c else if (strnlen(attr_data, r) >= (size_t) r) return -EIO; - *data = (const char *) attr_data; + if (data) + *data = (const char *) attr_data; return 0; } @@ -849,6 +852,8 @@ int sd_rtnl_message_read_u8(sd_rtnl_message *m, unsigned short type, uint8_t *da int r; void *attr_data; + assert_return(m, -EINVAL); + r = message_attribute_has_type(m, type, NLA_U8); if (r < 0) return r; @@ -859,7 +864,8 @@ int sd_rtnl_message_read_u8(sd_rtnl_message *m, unsigned short type, uint8_t *da else if ((size_t) r < sizeof(uint8_t)) return -EIO; - *data = *(uint8_t *) attr_data; + if (data) + *data = *(uint8_t *) attr_data; return 0; } @@ -868,6 +874,8 @@ int sd_rtnl_message_read_u16(sd_rtnl_message *m, unsigned short type, uint16_t * int r; void *attr_data; + assert_return(m, -EINVAL); + r = message_attribute_has_type(m, type, NLA_U16); if (r < 0) return r; @@ -878,7 +886,8 @@ int sd_rtnl_message_read_u16(sd_rtnl_message *m, unsigned short type, uint16_t * else if ((size_t) r < sizeof(uint16_t)) return -EIO; - *data = *(uint16_t *) attr_data; + if (data) + *data = *(uint16_t *) attr_data; return 0; } @@ -887,6 +896,8 @@ int sd_rtnl_message_read_u32(sd_rtnl_message *m, unsigned short type, uint32_t * int r; void *attr_data; + assert_return(m, -EINVAL); + r = message_attribute_has_type(m, type, NLA_U32); if (r < 0) return r; @@ -897,7 +908,8 @@ int sd_rtnl_message_read_u32(sd_rtnl_message *m, unsigned short type, uint32_t * else if ((size_t)r < sizeof(uint32_t)) return -EIO; - *data = *(uint32_t *) attr_data; + if (data) + *data = *(uint32_t *) attr_data; return 0; } @@ -906,6 +918,8 @@ int sd_rtnl_message_read_ether_addr(sd_rtnl_message *m, unsigned short type, str int r; void *attr_data; + assert_return(m, -EINVAL); + r = message_attribute_has_type(m, type, NLA_ETHER_ADDR); if (r < 0) return r; @@ -916,7 +930,8 @@ int sd_rtnl_message_read_ether_addr(sd_rtnl_message *m, unsigned short type, str else if ((size_t)r < sizeof(struct ether_addr)) return -EIO; - memcpy(data, attr_data, sizeof(struct ether_addr)); + if (data) + memcpy(data, attr_data, sizeof(struct ether_addr)); return 0; } @@ -925,6 +940,8 @@ int sd_rtnl_message_read_cache_info(sd_rtnl_message *m, unsigned short type, str int r; void *attr_data; + assert_return(m, -EINVAL); + r = message_attribute_has_type(m, type, NLA_CACHE_INFO); if (r < 0) return r; @@ -935,7 +952,8 @@ int sd_rtnl_message_read_cache_info(sd_rtnl_message *m, unsigned short type, str else if ((size_t)r < sizeof(struct ifa_cacheinfo)) return -EIO; - memcpy(info, attr_data, sizeof(struct ifa_cacheinfo)); + if (info) + memcpy(info, attr_data, sizeof(struct ifa_cacheinfo)); return 0; } @@ -944,6 +962,8 @@ int sd_rtnl_message_read_in_addr(sd_rtnl_message *m, unsigned short type, struct int r; void *attr_data; + assert_return(m, -EINVAL); + r = message_attribute_has_type(m, type, NLA_IN_ADDR); if (r < 0) return r; @@ -954,7 +974,8 @@ int sd_rtnl_message_read_in_addr(sd_rtnl_message *m, unsigned short type, struct else if ((size_t)r < sizeof(struct in_addr)) return -EIO; - memcpy(data, attr_data, sizeof(struct in_addr)); + if (data) + memcpy(data, attr_data, sizeof(struct in_addr)); return 0; } @@ -963,6 +984,8 @@ int sd_rtnl_message_read_in6_addr(sd_rtnl_message *m, unsigned short type, struc int r; void *attr_data; + assert_return(m, -EINVAL); + r = message_attribute_has_type(m, type, NLA_IN_ADDR); if (r < 0) return r; @@ -973,7 +996,8 @@ int sd_rtnl_message_read_in6_addr(sd_rtnl_message *m, unsigned short type, struc else if ((size_t)r < sizeof(struct in6_addr)) return -EIO; - memcpy(data, attr_data, sizeof(struct in6_addr)); + if (data) + memcpy(data, attr_data, sizeof(struct in6_addr)); return 0; } -- 2.30.2