void aa_compute_perms(struct aa_dfa *dfa, unsigned int state, struct aa_perms *perms) { perms->deny = 0; perms->kill = perms->stop = 0; perms->complain = perms->cond = 0; perms->hide = 0; perms->prompt = 0; perms->allow = dfa_user_allow(dfa, state); perms->audit = dfa_user_audit(dfa, state); perms->quiet = dfa_user_quiet(dfa, state); /* for v5 perm mapping in the policydb, the other set is used * to extend the general perm set */ perms->allow |= map_other(dfa_other_allow(dfa, state)); perms->audit |= map_other(dfa_other_audit(dfa, state)); perms->quiet |= map_other(dfa_other_quiet(dfa, state)); // perms->xindex = dfa_user_xindex(dfa, state); }
/** * compute_mnt_perms - compute mount permission associated with @state * @dfa: dfa to match against (NOT NULL) * @state: state match finished in * * Returns: mount permissions */ static struct aa_perms compute_mnt_perms(struct aa_dfa *dfa, unsigned int state) { struct aa_perms perms = { .allow = dfa_user_allow(dfa, state), .audit = dfa_user_audit(dfa, state), .quiet = dfa_user_quiet(dfa, state), .xindex = dfa_user_xindex(dfa, state), }; return perms; } static const char * const mnt_info_table[] = { "match succeeded", "failed mntpnt match", "failed srcname match", "failed type match", "failed flags match", "failed data match" }; /* * Returns 0 on success else element that match failed in, this is the * index into the mnt_info_table above */ static int do_match_mnt(struct aa_dfa *dfa, unsigned int start, const char *mntpnt, const char *devname, const char *type, unsigned long flags, void *data, bool binary, struct aa_perms *perms) { unsigned int state; AA_BUG(!dfa); AA_BUG(!perms); state = aa_dfa_match(dfa, start, mntpnt); state = aa_dfa_null_transition(dfa, state); if (!state) return 1; if (devname) state = aa_dfa_match(dfa, state, devname); state = aa_dfa_null_transition(dfa, state); if (!state) return 2; if (type) state = aa_dfa_match(dfa, state, type); state = aa_dfa_null_transition(dfa, state); if (!state) return 3; state = match_mnt_flags(dfa, state, flags); if (!state) return 4; *perms = compute_mnt_perms(dfa, state); if (perms->allow & AA_MAY_MOUNT) return 0; /* only match data if not binary and the DFA flags data is expected */ if (data && !binary && (perms->allow & AA_MNT_CONT_MATCH)) { state = aa_dfa_null_transition(dfa, state); if (!state) return 4; state = aa_dfa_match(dfa, state, data); if (!state) return 5; *perms = compute_mnt_perms(dfa, state); if (perms->allow & AA_MAY_MOUNT) return 0; } /* failed at end of flags match */ return 4; }