make blob attribute checking available externally
This commit is contained in:
parent
ec593913f4
commit
f2b9272e0b
2 changed files with 27 additions and 13 deletions
39
blob.c
39
blob.c
|
@ -131,6 +131,28 @@ static const int blob_type_minlen[BLOB_ATTR_LAST] = {
|
||||||
[BLOB_ATTR_INT64] = sizeof(uint64_t),
|
[BLOB_ATTR_INT64] = sizeof(uint64_t),
|
||||||
};
|
};
|
||||||
|
|
||||||
|
bool
|
||||||
|
blob_check_type(void *ptr, int len, int type)
|
||||||
|
{
|
||||||
|
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] != 0)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
blob_parse(struct blob_attr *attr, struct blob_attr **data, const struct blob_attr_info *info, int max)
|
blob_parse(struct blob_attr *attr, struct blob_attr **data, const struct blob_attr_info *info, int max)
|
||||||
{
|
{
|
||||||
|
@ -142,26 +164,17 @@ blob_parse(struct blob_attr *attr, struct blob_attr **data, const struct blob_at
|
||||||
blob_for_each_attr(pos, attr, rem) {
|
blob_for_each_attr(pos, attr, rem) {
|
||||||
int id = blob_id(pos);
|
int id = blob_id(pos);
|
||||||
int len = blob_len(pos);
|
int len = blob_len(pos);
|
||||||
char *pdata;
|
|
||||||
|
|
||||||
if (id >= max)
|
if (id >= max)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (info) {
|
if (info) {
|
||||||
int type = info[id].type;
|
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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pdata = blob_data(pos);
|
if (type < BLOB_ATTR_LAST) {
|
||||||
if (type == BLOB_ATTR_STRING && pdata[len] != 0)
|
if (!blob_check_type(blob_data(pos), len, type))
|
||||||
continue;
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
if (info[id].minlen && len < info[id].minlen)
|
if (info[id].minlen && len < info[id].minlen)
|
||||||
continue;
|
continue;
|
||||||
|
|
1
blob.h
1
blob.h
|
@ -218,6 +218,7 @@ extern struct blob_attr *blob_new(struct blob_buf *buf, int id, int payload);
|
||||||
extern void *blob_nest_start(struct blob_buf *buf, int id);
|
extern void *blob_nest_start(struct blob_buf *buf, int id);
|
||||||
extern void blob_nest_end(struct blob_buf *buf, void *cookie);
|
extern void blob_nest_end(struct blob_buf *buf, void *cookie);
|
||||||
extern struct blob_attr *blob_put(struct blob_buf *buf, int id, const void *ptr, int len);
|
extern struct blob_attr *blob_put(struct blob_buf *buf, int id, const void *ptr, int len);
|
||||||
|
extern bool blob_check_type(void *ptr, int len, int type);
|
||||||
extern int blob_parse(struct blob_attr *attr, struct blob_attr **data, const struct blob_attr_info *info, int max);
|
extern int blob_parse(struct blob_attr *attr, struct blob_attr **data, const struct blob_attr_info *info, int max);
|
||||||
|
|
||||||
static inline struct blob_attr *
|
static inline struct blob_attr *
|
||||||
|
|
Loading…
Add table
Reference in a new issue