Re: [PATCH][SMACK] convert smack rule list to linux list

Tetsuo Handa
2009-02-22T13:14:04Z

Paul, would you review this locking?

> static DEFINE_MUTEX(smack_known_lock);
>
> /**
> * smk_import_entry - import a label, return the list entry
> * @string: a text string that might be a Smack label
> * @len: the maximum size, or zero if it is NULL terminated.
> *
> * Returns a pointer to the entry in the label list that
> * matches the passed string, adding it if necessary.
> */
> struct smack_known *smk_import_entry(const char *string, int len)
> {
> struct smack_known *skp;
> char smack[SMK_LABELLEN];
> int found;
> int i;
>
> if (len <= 0 || len > SMK_MAXLEN)
> len = SMK_MAXLEN;
>
> for (i = 0, found = 0; i < SMK_LABELLEN; i++) {
> if (found)
> smack[i] = '\0';
> else if (i >= len || string[i] > '~' || string[i] <= ' ' ||
> string[i] == '/') {
> smack[i] = '\0';
> found = 1;
> } else
> smack[i] = string[i];
> }
>
> if (smack[0] == '\0')
> return NULL;
>
> mutex_lock(&smack_known_lock);
>
> for (skp = smack_known; skp != NULL; skp = skp->smk_next)
> if (strncmp(skp->smk_known, smack, SMK_MAXLEN) == 0)
> break;
>
> if (skp == NULL) {
> skp = kzalloc(sizeof(struct smack_known), GFP_KERNEL);
> if (skp != NULL) {
> skp->smk_next = smack_known;
> strncpy(skp->smk_known, smack, SMK_MAXLEN);
> skp->smk_secid = smack_next_secid++;
> skp->smk_cipso = NULL;
> spin_lock_init(&skp->smk_cipsolock);
> /*
> * Make sure that the entry is actually
> * filled before putting it on the list.
> */
> smp_mb();
> smack_known = skp;
> }
> }
>
> mutex_unlock(&smack_known_lock);
>
> return skp;
> }
>
> /**
> * smack_from_secid - find the Smack label associated with a secid
> * @secid: an integer that might be associated with a Smack label
> *
> * Returns a pointer to the appropraite Smack label if there is one,
> * otherwise a pointer to the invalid Smack label.
> */
> char *smack_from_secid(const u32 secid)
> {
> struct smack_known *skp;
>
> for (skp = smack_known; skp != NULL; skp = skp->smk_next)
> if (skp->smk_secid == secid)
> return skp->smk_known;
>
> /*
> * If we got this far someone asked for the translation
> * of a secid that is not on the list.
> */
> return smack_known_invalid.smk_known;
> }

I think this is a case called "dependency ordering".
This function needs rcu_dereference(), doesn't it?

Regards.