Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.openwrt.org/project/libubox.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/blob.c
diff options
context:
space:
mode:
authorFelix Fietkau <nbd@openwrt.org>2011-01-31 05:46:37 +0300
committerFelix Fietkau <nbd@openwrt.org>2011-01-31 05:46:37 +0300
commitf2b9272e0b427545e34b27ba4be4a5b1bbc6ad69 (patch)
tree5235965dc5a50052eea83e39ba4a2c1c8e153334 /blob.c
parentec593913f4a5ee31d4a295708ba91beb0d439ffe (diff)
make blob attribute checking available externally
Diffstat (limited to 'blob.c')
-rw-r--r--blob.c37
1 files changed, 25 insertions, 12 deletions
diff --git a/blob.c b/blob.c
index 3bd69fa..cafd74c 100644
--- 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),
};
+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)
{
@@ -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);
- char *pdata;
if (id >= max)
continue;
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;
}
- pdata = blob_data(pos);
- if (type == BLOB_ATTR_STRING && pdata[len] != 0)
- continue;
-
if (info[id].minlen && len < info[id].minlen)
continue;