[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;
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);
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))
struct blob_attr *attr;
struct blobmsg_hdr *hdr;
int attrlen, namelen;
+ char *pad_start, *pad_end;
if (!name)
name = "";
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;
}
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));
}