X-Git-Url: http://git.archive.openwrt.org/?a=blobdiff_plain;f=blobmsg.c;h=8a40bf87cc52d1b7f4b0a5961d716b051022f1af;hb=fc20c7a0314afa07f4f873f1a2f1f0095bf8e519;hp=3079dcacb24a135e01c3b1bfed7e0d500779cfed;hpb=1d3e4ccb6ae544dfc75227434c42b1ee74b86d4f;p=project%2Flibubox.git diff --git a/blobmsg.c b/blobmsg.c index 3079dca..8a40bf8 100644 --- a/blobmsg.c +++ b/blobmsg.c @@ -23,6 +23,12 @@ static const int blob_type[__BLOBMSG_TYPE_LAST] = { [BLOBMSG_TYPE_STRING] = BLOB_ATTR_STRING, }; +static uint16_t +blobmsg_namelen(const struct blobmsg_hdr *hdr) +{ + return be16_to_cpu(hdr->namelen); +} + bool blobmsg_check_attr(const struct blob_attr *attr, bool name) { const struct blobmsg_hdr *hdr; @@ -36,10 +42,10 @@ bool blobmsg_check_attr(const struct blob_attr *attr, bool name) if (!hdr->namelen && name) return false; - if (hdr->namelen > blob_len(attr) - sizeof(struct blobmsg_hdr)) + if (blobmsg_namelen(hdr) > blob_len(attr) - sizeof(struct blobmsg_hdr)) return false; - if (hdr->name[hdr->namelen] != 0) + if (hdr->name[blobmsg_namelen(hdr)] != 0) return false; id = blob_id(attr); @@ -82,7 +88,7 @@ int blobmsg_parse(const struct blobmsg_policy *policy, int policy_len, blob_id(attr) != policy[i].type) continue; - if (hdr->namelen != pslen[i]) + if (blobmsg_namelen(hdr) != pslen[i]) continue; if (!blobmsg_check_attr(attr, true)) @@ -108,6 +114,7 @@ blobmsg_new(struct blob_buf *buf, int type, const char *name, int payload_len, v struct blob_attr *attr; struct blobmsg_hdr *hdr; int attrlen, namelen; + char *pad_start, *pad_end; if (!name) name = ""; @@ -119,9 +126,12 @@ blobmsg_new(struct blob_buf *buf, int type, const char *name, int payload_len, v return NULL; hdr = blob_data(attr); - hdr->namelen = namelen; + hdr->namelen = cpu_to_be16(namelen); strcpy((char *) hdr->name, (const char *)name); - *data = blobmsg_data(attr); + pad_end = *data = blobmsg_data(attr); + pad_start = (char *) &hdr->name[namelen]; + if (pad_start < pad_end) + memset(pad_start, 0, pad_end - pad_start); return attr; } @@ -178,6 +188,8 @@ blobmsg_add_string_buffer(struct blob_buf *buf) attrlen = blob_raw_len(attr) + len; blob_set_raw_len(attr, attrlen); + blob_fill_pad(attr); + blob_set_raw_len(buf->head, blob_raw_len(buf->head) + blob_pad_len(attr)); }