aboutsummaryrefslogtreecommitdiffstats
path: root/package/libs/libubox/patches/0003-blob-refactor-attr-parsing-into-separate-function.patch
blob: 81bffa587ade482f02b67f149613c0bcb22be1f2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
From af2a074160e32692b570f8a3562b4370d38f34e7 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Petr=20=C5=A0tetiar?= <ynezz@true.cz>
Date: Mon, 9 Dec 2019 13:53:27 +0100
Subject: blob: refactor attr parsing into separate function
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Making blob_parse easier to review.

Signed-off-by: Petr Štetiar <ynezz@true.cz>
---
 blob.c | 61 +++++++++++++++++++++++++++++++++-------------------------
 1 file changed, 35 insertions(+), 26 deletions(-)

--- a/blob.c
+++ b/blob.c
@@ -217,44 +217,53 @@ blob_check_type(const void *ptr, unsigne
 	return true;
 }
 
-int
-blob_parse(struct blob_attr *attr, struct blob_attr **data, const struct blob_attr_info *info, int max)
+static int
+blob_parse_attr(struct blob_attr *attr, struct blob_attr **data, const struct blob_attr_info *info, int max)
 {
-	struct blob_attr *pos;
 	int found = 0;
-	int rem;
+	int id = blob_id(attr);
+	size_t len = blob_len(attr);
 
-	memset(data, 0, sizeof(struct blob_attr *) * max);
-	blob_for_each_attr(pos, attr, rem) {
-		int id = blob_id(pos);
-		int len = blob_len(pos);
+	if (id >= max)
+		return 0;
 
-		if (id >= max)
-			continue;
+	if (info) {
+		int type = info[id].type;
 
-		if (info) {
-			int type = info[id].type;
+		if (type < BLOB_ATTR_LAST) {
+			if (!blob_check_type(blob_data(attr), len, type))
+				return 0;
+		}
 
-			if (type < BLOB_ATTR_LAST) {
-				if (!blob_check_type(blob_data(pos), len, type))
-					continue;
-			}
+		if (info[id].minlen && len < info[id].minlen)
+			return 0;
 
-			if (info[id].minlen && len < info[id].minlen)
-				continue;
+		if (info[id].maxlen && len > info[id].maxlen)
+			return 0;
 
-			if (info[id].maxlen && len > info[id].maxlen)
-				continue;
+		if (info[id].validate && !info[id].validate(&info[id], attr))
+			return 0;
+	}
 
-			if (info[id].validate && !info[id].validate(&info[id], pos))
-				continue;
-		}
+	if (!data[id])
+		found++;
 
-		if (!data[id])
-			found++;
+	data[id] = attr;
+	return found;
+}
 
-		data[id] = pos;
+int
+blob_parse(struct blob_attr *attr, struct blob_attr **data, const struct blob_attr_info *info, int max)
+{
+	struct blob_attr *pos;
+	int found = 0;
+	size_t rem;
+
+	memset(data, 0, sizeof(struct blob_attr *) * max);
+	blob_for_each_attr(pos, attr, rem) {
+		found += blob_parse_attr(pos, data, info, max);
 	}
+
 	return found;
 }