hc
2023-12-11 d2ccde1c8e90d38cee87a1b0309ad2827f3fd30d
kernel/security/tomoyo/group.c
....@@ -75,11 +75,13 @@
7575 {
7676 struct tomoyo_group *group = tomoyo_get_group(param, type);
7777 int error = -EINVAL;
78
+
7879 if (!group)
7980 return -ENOMEM;
8081 param->list = &group->member_list;
8182 if (type == TOMOYO_PATH_GROUP) {
8283 struct tomoyo_path_group e = { };
84
+
8385 e.member_name = tomoyo_get_name(tomoyo_read_token(param));
8486 if (!e.member_name) {
8587 error = -ENOMEM;
....@@ -90,6 +92,7 @@
9092 tomoyo_put_name(e.member_name);
9193 } else if (type == TOMOYO_NUMBER_GROUP) {
9294 struct tomoyo_number_group e = { };
95
+
9396 if (param->data[0] == '@' ||
9497 !tomoyo_parse_number_union(param, &e.number))
9598 goto out;
....@@ -129,7 +132,9 @@
129132 const struct tomoyo_group *group)
130133 {
131134 struct tomoyo_path_group *member;
132
- list_for_each_entry_rcu(member, &group->member_list, head.list) {
135
+
136
+ list_for_each_entry_rcu(member, &group->member_list, head.list,
137
+ srcu_read_lock_held(&tomoyo_ss)) {
133138 if (member->head.is_deleted)
134139 continue;
135140 if (!tomoyo_path_matches_pattern(pathname, member->member_name))
....@@ -156,7 +161,9 @@
156161 {
157162 struct tomoyo_number_group *member;
158163 bool matched = false;
159
- list_for_each_entry_rcu(member, &group->member_list, head.list) {
164
+
165
+ list_for_each_entry_rcu(member, &group->member_list, head.list,
166
+ srcu_read_lock_held(&tomoyo_ss)) {
160167 if (member->head.is_deleted)
161168 continue;
162169 if (min > member->number.values[1] ||
....@@ -186,7 +193,8 @@
186193 bool matched = false;
187194 const u8 size = is_ipv6 ? 16 : 4;
188195
189
- list_for_each_entry_rcu(member, &group->member_list, head.list) {
196
+ list_for_each_entry_rcu(member, &group->member_list, head.list,
197
+ srcu_read_lock_held(&tomoyo_ss)) {
190198 if (member->head.is_deleted)
191199 continue;
192200 if (member->address.is_ipv6 != is_ipv6)