chiark
/
gitweb
/
~ianmdlvl
/
elogind.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
sd-rtnl: add a bit more debugging in case a message is dropped
[elogind.git]
/
src
/
libsystemd
/
sd-rtnl
/
rtnl-message.c
diff --git
a/src/libsystemd/sd-rtnl/rtnl-message.c
b/src/libsystemd/sd-rtnl/rtnl-message.c
index 22ee4c50425b1e25aed07db85508eb63cf16826b..e5c72e765361b52edf395310195716b452234378 100644
(file)
--- 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;
int r;
void *attr_data;
+ assert_return(m, -EINVAL);
+
r = message_attribute_has_type(m, type, NLA_STRING);
if (r < 0)
return r;
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;
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;
}
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;
int r;
void *attr_data;
+ assert_return(m, -EINVAL);
+
r = message_attribute_has_type(m, type, NLA_U8);
if (r < 0)
return r;
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;
else if ((size_t) r < sizeof(uint8_t))
return -EIO;
- *data = *(uint8_t *) attr_data;
+ if (data)
+ *data = *(uint8_t *) attr_data;
return 0;
}
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;
int r;
void *attr_data;
+ assert_return(m, -EINVAL);
+
r = message_attribute_has_type(m, type, NLA_U16);
if (r < 0)
return r;
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;
else if ((size_t) r < sizeof(uint16_t))
return -EIO;
- *data = *(uint16_t *) attr_data;
+ if (data)
+ *data = *(uint16_t *) attr_data;
return 0;
}
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;
int r;
void *attr_data;
+ assert_return(m, -EINVAL);
+
r = message_attribute_has_type(m, type, NLA_U32);
if (r < 0)
return r;
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;
else if ((size_t)r < sizeof(uint32_t))
return -EIO;
- *data = *(uint32_t *) attr_data;
+ if (data)
+ *data = *(uint32_t *) attr_data;
return 0;
}
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;
int r;
void *attr_data;
+ assert_return(m, -EINVAL);
+
r = message_attribute_has_type(m, type, NLA_ETHER_ADDR);
if (r < 0)
return r;
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;
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;
}
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;
int r;
void *attr_data;
+ assert_return(m, -EINVAL);
+
r = message_attribute_has_type(m, type, NLA_CACHE_INFO);
if (r < 0)
return r;
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;
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;
}
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;
int r;
void *attr_data;
+ assert_return(m, -EINVAL);
+
r = message_attribute_has_type(m, type, NLA_IN_ADDR);
if (r < 0)
return r;
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;
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;
}
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;
int r;
void *attr_data;
+ assert_return(m, -EINVAL);
+
r = message_attribute_has_type(m, type, NLA_IN_ADDR);
if (r < 0)
return r;
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;
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;
}
return 0;
}
@@
-1282,8
+1306,10
@@
int socket_read_message(sd_rtnl *rtnl) {
}
/* check that the size matches the message type */
}
/* check that the size matches the message type */
- if (new_msg->nlmsg_len < NLMSG_LENGTH(nl_type->size))
+ if (new_msg->nlmsg_len < NLMSG_LENGTH(nl_type->size)) {
+ log_debug("sd-rtnl: message larger than expected, dropping");
continue;
continue;
+ }
r = message_new_empty(rtnl, &m);
if (r < 0)
r = message_new_empty(rtnl, &m);
if (r < 0)