blobmsg: constify and add more validation
authorFelix Fietkau <nbd@openwrt.org>
Mon, 31 Jan 2011 02:51:06 +0000 (03:51 +0100)
committerFelix Fietkau <nbd@openwrt.org>
Mon, 31 Jan 2011 02:51:06 +0000 (03:51 +0100)
blobmsg.c
blobmsg.h

index 742a93bf62cc0993a8064143addc30ab504a9fe4..3e9c7743ac0a14229063e278cff08053fe165933 100644 (file)
--- a/blobmsg.c
+++ b/blobmsg.c
@@ -21,7 +21,7 @@ struct strbuf {
        char *buf;
 };
 
-static bool blobmsg_puts(struct strbuf *s, char *c, int len)
+static bool blobmsg_puts(struct strbuf *s, const char *c, int len)
 {
        if (len <= 0)
                return true;
@@ -37,9 +37,9 @@ static bool blobmsg_puts(struct strbuf *s, char *c, int len)
        return true;
 }
 
-static void blobmsg_format_string(struct strbuf *s, char *str)
+static void blobmsg_format_string(struct strbuf *s, const char *str)
 {
-       char *p, *last = str, *end = str + strlen(str);
+       const char *p, *last = str, *end = str + strlen(str);
        char buf[8] = "\\u00";
 
        blobmsg_puts(s, "\"", 1);
@@ -175,9 +175,19 @@ char *blobmsg_format_json(struct blob_attr *attr, bool list)
        return s.buf;
 }
 
+static const int blob_type[__BLOBMSG_TYPE_LAST] = {
+       [BLOBMSG_TYPE_INT8] = BLOB_ATTR_INT8,
+       [BLOBMSG_TYPE_INT16] = BLOB_ATTR_INT16,
+       [BLOBMSG_TYPE_INT32] = BLOB_ATTR_INT32,
+       [BLOBMSG_TYPE_INT64] = BLOB_ATTR_INT64,
+       [BLOBMSG_TYPE_STRING] = BLOB_ATTR_STRING,
+};
+
 bool blobmsg_check_attr(const struct blob_attr *attr, bool name)
 {
        const struct blobmsg_hdr *hdr;
+       const char *data;
+       int id, len;
 
        if (blob_len(attr) < sizeof(struct blobmsg_hdr))
                return false;
@@ -192,7 +202,17 @@ bool blobmsg_check_attr(const struct blob_attr *attr, bool name)
        if (hdr->name[hdr->namelen] != 0)
                return false;
 
-       return true;
+       id = blob_id(attr);
+       len = blobmsg_data_len(attr);
+       data = blobmsg_data(attr);
+
+       if (!id || id > BLOBMSG_TYPE_LAST)
+               return false;
+
+       if (!blob_type[id])
+               return true;
+
+       return blob_check_type(data, len, blob_type[id]);
 }
 
 int blobmsg_parse(const struct blobmsg_policy *policy, int policy_len,
index 7c63dbf51898687a6c597439f846bb1c9275ae69..e9782355918041a49a1eb2cee06e1ee1e3d6637b 100644 (file)
--- a/blobmsg.h
+++ b/blobmsg.h
@@ -49,19 +49,19 @@ static inline int blobmsg_hdrlen(int namelen)
        return BLOBMSG_PADDING(sizeof(struct blobmsg_hdr) + namelen + 1);
 }
 
-static inline char *blobmsg_name(struct blob_attr *attr)
+static inline const char *blobmsg_name(const struct blob_attr *attr)
 {
        struct blobmsg_hdr *hdr = blob_data(attr);
-       return (char *) hdr->name;
+       return (const char *) hdr->name;
 }
 
-static inline void *blobmsg_data(struct blob_attr *attr)
+static inline void *blobmsg_data(const struct blob_attr *attr)
 {
        struct blobmsg_hdr *hdr = blob_data(attr);
        return (char *) hdr + blobmsg_hdrlen(hdr->namelen);
 }
 
-static inline int blobmsg_data_len(struct blob_attr *attr)
+static inline int blobmsg_data_len(const struct blob_attr *attr)
 {
        uint8_t *start, *end;