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
diff options
context:
space:
mode:
-rw-r--r--blobmsg.c20
-rw-r--r--blobmsg.h9
2 files changed, 23 insertions, 6 deletions
diff --git a/blobmsg.c b/blobmsg.c
index f317152..a2c2c5d 100644
--- a/blobmsg.c
+++ b/blobmsg.c
@@ -62,11 +62,12 @@ bool blobmsg_check_attr(const struct blob_attr *attr, bool name)
return blob_check_type(data, len, blob_type[id]);
}
-bool blobmsg_check_attr_list(const struct blob_attr *attr, int type)
+int blobmsg_check_array(const struct blob_attr *attr, int type)
{
struct blob_attr *cur;
bool name;
int rem;
+ int size = 0;
switch (blobmsg_type(attr)) {
case BLOBMSG_TYPE_TABLE:
@@ -76,18 +77,25 @@ bool blobmsg_check_attr_list(const struct blob_attr *attr, int type)
name = false;
break;
default:
- return false;
+ return -1;
}
blobmsg_for_each_attr(cur, attr, rem) {
- if (blobmsg_type(cur) != type)
- return false;
+ if (type != BLOBMSG_TYPE_UNSPEC && blobmsg_type(cur) != type)
+ return -1;
if (!blobmsg_check_attr(cur, name))
- return false;
+ return -1;
+
+ size++;
}
- return true;
+ return size;
+}
+
+bool blobmsg_check_attr_list(const struct blob_attr *attr, int type)
+{
+ return blobmsg_check_array(attr, type) >= 0;
}
int blobmsg_parse_array(const struct blobmsg_policy *policy, int policy_len,
diff --git a/blobmsg.h b/blobmsg.h
index d8f1045..082980a 100644
--- a/blobmsg.h
+++ b/blobmsg.h
@@ -90,6 +90,15 @@ static inline int blobmsg_len(const struct blob_attr *attr)
bool blobmsg_check_attr(const struct blob_attr *attr, bool name);
bool blobmsg_check_attr_list(const struct blob_attr *attr, int type);
+
+/*
+ * blobmsg_check_array: validate array/table and return size
+ *
+ * Checks if all elements of an array or table are valid and have
+ * the specified type. Returns the number of elements in the array
+ */
+int blobmsg_check_array(const struct blob_attr *attr, int type);
+
int blobmsg_parse(const struct blobmsg_policy *policy, int policy_len,
struct blob_attr **tb, void *data, unsigned int len);
int blobmsg_parse_array(const struct blobmsg_policy *policy, int policy_len,