.. | .. |
---|
75 | 75 | { |
---|
76 | 76 | struct tomoyo_group *group = tomoyo_get_group(param, type); |
---|
77 | 77 | int error = -EINVAL; |
---|
| 78 | + |
---|
78 | 79 | if (!group) |
---|
79 | 80 | return -ENOMEM; |
---|
80 | 81 | param->list = &group->member_list; |
---|
81 | 82 | if (type == TOMOYO_PATH_GROUP) { |
---|
82 | 83 | struct tomoyo_path_group e = { }; |
---|
| 84 | + |
---|
83 | 85 | e.member_name = tomoyo_get_name(tomoyo_read_token(param)); |
---|
84 | 86 | if (!e.member_name) { |
---|
85 | 87 | error = -ENOMEM; |
---|
.. | .. |
---|
90 | 92 | tomoyo_put_name(e.member_name); |
---|
91 | 93 | } else if (type == TOMOYO_NUMBER_GROUP) { |
---|
92 | 94 | struct tomoyo_number_group e = { }; |
---|
| 95 | + |
---|
93 | 96 | if (param->data[0] == '@' || |
---|
94 | 97 | !tomoyo_parse_number_union(param, &e.number)) |
---|
95 | 98 | goto out; |
---|
.. | .. |
---|
129 | 132 | const struct tomoyo_group *group) |
---|
130 | 133 | { |
---|
131 | 134 | 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)) { |
---|
133 | 138 | if (member->head.is_deleted) |
---|
134 | 139 | continue; |
---|
135 | 140 | if (!tomoyo_path_matches_pattern(pathname, member->member_name)) |
---|
.. | .. |
---|
156 | 161 | { |
---|
157 | 162 | struct tomoyo_number_group *member; |
---|
158 | 163 | 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)) { |
---|
160 | 167 | if (member->head.is_deleted) |
---|
161 | 168 | continue; |
---|
162 | 169 | if (min > member->number.values[1] || |
---|
.. | .. |
---|
186 | 193 | bool matched = false; |
---|
187 | 194 | const u8 size = is_ipv6 ? 16 : 4; |
---|
188 | 195 | |
---|
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)) { |
---|
190 | 198 | if (member->head.is_deleted) |
---|
191 | 199 | continue; |
---|
192 | 200 | if (member->address.is_ipv6 != is_ipv6) |
---|