| .. | .. |
|---|
| 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) |
|---|