fix segfault when passed blobmsg attr is NULL
authorJohn Crispin <john@phrozen.org>
Wed, 25 Jul 2018 08:30:05 +0000 (10:30 +0200)
committerJohn Crispin <john@phrozen.org>
Wed, 25 Jul 2018 08:30:05 +0000 (10:30 +0200)
Signed-off-by: John Crispin <john@phrozen.org>
blobmsg.c
blobmsg.h

index c2bb7179fb66c15afd468e36e23426c927ea0f46..8019c45b83edff22263cd550497f67d4c0bc49ed 100644 (file)
--- a/blobmsg.c
+++ b/blobmsg.c
@@ -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)
index 797729870fbd449b057315dedf54b07032fe4fca..b06ef597d8c6d836d9eecb9227e6825576ada13e 100644 (file)
--- a/blobmsg.h
+++ b/blobmsg.h
@@ -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);