|
@@ -3066,6 +3066,8 @@ static struct smack_known *smack_from_secattr(struct netlbl_lsm_secattr *sap,
|
|
|
{
|
|
|
struct smack_known *skp;
|
|
|
int found = 0;
|
|
|
+ int acat;
|
|
|
+ int kcat;
|
|
|
|
|
|
if ((sap->flags & NETLBL_SECATTR_MLS_LVL) != 0) {
|
|
|
/*
|
|
@@ -3082,12 +3084,28 @@ static struct smack_known *smack_from_secattr(struct netlbl_lsm_secattr *sap,
|
|
|
list_for_each_entry(skp, &smack_known_list, list) {
|
|
|
if (sap->attr.mls.lvl != skp->smk_netlabel.attr.mls.lvl)
|
|
|
continue;
|
|
|
- if (memcmp(sap->attr.mls.cat,
|
|
|
- skp->smk_netlabel.attr.mls.cat,
|
|
|
- SMK_CIPSOLEN) != 0)
|
|
|
- continue;
|
|
|
- found = 1;
|
|
|
- break;
|
|
|
+ /*
|
|
|
+ * Compare the catsets. Use the netlbl APIs.
|
|
|
+ */
|
|
|
+ if ((sap->flags & NETLBL_SECATTR_MLS_CAT) == 0) {
|
|
|
+ if ((skp->smk_netlabel.flags &
|
|
|
+ NETLBL_SECATTR_MLS_CAT) == 0)
|
|
|
+ found = 1;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ for (acat = -1, kcat = -1; acat == kcat; ) {
|
|
|
+ acat = netlbl_secattr_catmap_walk(
|
|
|
+ sap->attr.mls.cat, acat + 1);
|
|
|
+ kcat = netlbl_secattr_catmap_walk(
|
|
|
+ skp->smk_netlabel.attr.mls.cat,
|
|
|
+ kcat + 1);
|
|
|
+ if (acat < 0 || kcat < 0)
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ if (acat == kcat) {
|
|
|
+ found = 1;
|
|
|
+ break;
|
|
|
+ }
|
|
|
}
|
|
|
rcu_read_unlock();
|
|
|
|