| 226 | } |
| 227 | |
| 228 | static int |
| 229 | ugidfw_rulecheck(struct mac_bsdextended_rule *rule, |
| 230 | struct ucred *cred, struct vnode *vp, struct vattr *vap, int acc_mode) |
| 231 | { |
| 232 | int mac_granted, match, priv_granted; |
| 233 | int i; |
| 234 | |
| 235 | /* |
| 236 | * Is there a subject match? |
| 237 | */ |
| 238 | mtx_assert(&ugidfw_mtx, MA_OWNED); |
| 239 | if (rule->mbr_subject.mbs_flags & MBS_UID_DEFINED) { |
| 240 | match = ((cred->cr_uid <= rule->mbr_subject.mbs_uid_max && |
| 241 | cred->cr_uid >= rule->mbr_subject.mbs_uid_min) || |
| 242 | (cred->cr_ruid <= rule->mbr_subject.mbs_uid_max && |
| 243 | cred->cr_ruid >= rule->mbr_subject.mbs_uid_min) || |
| 244 | (cred->cr_svuid <= rule->mbr_subject.mbs_uid_max && |
| 245 | cred->cr_svuid >= rule->mbr_subject.mbs_uid_min)); |
| 246 | if (rule->mbr_subject.mbs_neg & MBS_UID_DEFINED) |
| 247 | match = !match; |
| 248 | if (!match) |
| 249 | return (0); |
| 250 | } |
| 251 | |
| 252 | if (rule->mbr_subject.mbs_flags & MBS_GID_DEFINED) { |
| 253 | match = ((cred->cr_rgid <= rule->mbr_subject.mbs_gid_max && |
| 254 | cred->cr_rgid >= rule->mbr_subject.mbs_gid_min) || |
| 255 | (cred->cr_svgid <= rule->mbr_subject.mbs_gid_max && |
| 256 | cred->cr_svgid >= rule->mbr_subject.mbs_gid_min)); |
| 257 | if (!match) { |
| 258 | for (i = 0; i < cred->cr_ngroups; i++) { |
| 259 | if (cred->cr_groups[i] |
| 260 | <= rule->mbr_subject.mbs_gid_max && |
| 261 | cred->cr_groups[i] |
| 262 | >= rule->mbr_subject.mbs_gid_min) { |
| 263 | match = 1; |
| 264 | break; |
| 265 | } |
| 266 | } |
| 267 | } |
| 268 | if (rule->mbr_subject.mbs_neg & MBS_GID_DEFINED) |
| 269 | match = !match; |
| 270 | if (!match) |
| 271 | return (0); |
| 272 | } |
| 273 | |
| 274 | if (rule->mbr_subject.mbs_flags & MBS_PRISON_DEFINED) { |
| 275 | match = |
| 276 | (cred->cr_prison->pr_id == rule->mbr_subject.mbs_prison); |
| 277 | if (rule->mbr_subject.mbs_neg & MBS_PRISON_DEFINED) |
| 278 | match = !match; |
| 279 | if (!match) |
| 280 | return (0); |
| 281 | } |
| 282 | |
| 283 | /* |
| 284 | * Is there an object match? |
| 285 | */ |
no test coverage detected