projects
/
project
/
libubox.git
/ commitdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
| commitdiff |
tree
raw
|
patch
|
inline
| side by side (parent:
ec59391
)
make blob attribute checking available externally
author
Felix Fietkau
<nbd@openwrt.org>
Mon, 31 Jan 2011 02:46:37 +0000
(
03:46
+0100)
committer
Felix Fietkau
<nbd@openwrt.org>
Mon, 31 Jan 2011 02:46:37 +0000
(
03:46
+0100)
blob.c
patch
|
blob
|
history
blob.h
patch
|
blob
|
history
diff --git
a/blob.c
b/blob.c
index
3bd69fa
..
cafd74c
100644
(file)
--- a/
blob.c
+++ b/
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
blob_parse(struct blob_attr *attr, struct blob_attr **data, const struct blob_attr_info *info, int max)
{
int
blob_parse(struct blob_attr *attr, struct blob_attr **data, const struct blob_attr_info *info, int max)
{
@@
-142,27
+164,18
@@
blob_parse(struct blob_attr *attr, struct blob_attr **data, const struct blob_at
blob_for_each_attr(pos, attr, rem) {
int id = blob_id(pos);
int len = blob_len(pos);
blob_for_each_attr(pos, attr, rem) {
int id = blob_id(pos);
int len = blob_len(pos);
- char *pdata;
if (id >= max)
continue;
if (info) {
int type = info[id].type;
if (id >= max)
continue;
if (info) {
int type = info[id].type;
+
if (type < BLOB_ATTR_LAST) {
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;
}
}
- pdata = blob_data(pos);
- if (type == BLOB_ATTR_STRING && pdata[len] != 0)
- continue;
-
if (info[id].minlen && len < info[id].minlen)
continue;
if (info[id].minlen && len < info[id].minlen)
continue;
diff --git
a/blob.h
b/blob.h
index
a7afdcb
..
7d7509c
100644
(file)
--- a/
blob.h
+++ b/
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_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 void *blob_nest_start(struct blob_buf *buf, int id);
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 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);
static inline struct blob_attr *
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 *