diff options
author | John Crispin <john@phrozen.org> | 2018-07-25 11:30:05 +0300 |
---|---|---|
committer | John Crispin <john@phrozen.org> | 2018-07-25 11:30:05 +0300 |
commit | c83a84afbef2b24f960ddeda0b5e2ab01fba6981 (patch) | |
tree | 8487605c8493ee29efac3ff61f63e0b20ca43f01 | |
parent | 3c1b33b7d57ad8b8aeeab8babd48625b86532e0b (diff) |
fix segfault when passed blobmsg attr is NULL
Signed-off-by: John Crispin <john@phrozen.org>
-rw-r--r-- | blobmsg.c | 2 | ||||
-rw-r--r-- | blobmsg.h | 13 |
2 files changed, 13 insertions, 2 deletions
@@ -135,6 +135,8 @@ int blobmsg_parse(const struct blobmsg_policy *policy, int policy_len, int i; memset(tb, 0, policy_len * sizeof(*tb)); + if (!data || !len) + return -EINVAL; pslen = alloca(policy_len); for (i = 0; i < policy_len; i++) { if (!policy[i].name) @@ -71,8 +71,14 @@ static inline int blobmsg_type(const struct blob_attr *attr) static inline void *blobmsg_data(const struct blob_attr *attr) { - struct blobmsg_hdr *hdr = (struct blobmsg_hdr *) blob_data(attr); - char *data = (char *) blob_data(attr); + struct blobmsg_hdr *hdr; + char *data; + + if (!attr) + return NULL; + + hdr = (struct blobmsg_hdr *) blob_data(attr); + data = (char *) blob_data(attr); if (blob_is_extended(attr)) data += blobmsg_hdrlen(be16_to_cpu(hdr->namelen)); @@ -84,6 +90,9 @@ static inline int blobmsg_data_len(const struct blob_attr *attr) { uint8_t *start, *end; + if (!attr) + return 0; + start = (uint8_t *) blob_data(attr); end = (uint8_t *) blobmsg_data(attr); |