return 0;
}
+void
+blob_buf_free(struct blob_buf *buf)
+{
+ free(buf->buf);
+ buf->buf = NULL;
+ buf->buflen = 0;
+}
+
struct blob_attr *
blob_new(struct blob_buf *buf, int id, int payload)
{
[BLOB_ATTR_INT64] = sizeof(uint64_t),
};
+bool
+blob_check_type(const void *ptr, int len, int type)
+{
+ const char *data = ptr;
+
+ if (type >= BLOB_ATTR_LAST)
+ return false;
+
+ if (type >= BLOB_ATTR_INT8 && type <= BLOB_ATTR_INT64) {
+ if (len != blob_type_minlen[type])
+ return false;
+ } else {
+ if (len < blob_type_minlen[type])
+ return false;
+ }
+
+ if (type == BLOB_ATTR_STRING && data[len - 1] != 0)
+ return false;
+
+ return true;
+}
+
int
blob_parse(struct blob_attr *attr, struct blob_attr **data, const struct blob_attr_info *info, int max)
{
if (info) {
int type = info[id].type;
+
if (type < BLOB_ATTR_LAST) {
- if (type >= BLOB_ATTR_INT8 && type <= BLOB_ATTR_INT64) {
- if (len != blob_type_minlen[type])
- continue;
- } else {
- if (len < blob_type_minlen[type])
- continue;
- }
+ if (!blob_check_type(blob_data(pos), len, type))
+ continue;
}
if (info[id].minlen && len < info[id].minlen)