On Fri, 14 Jul 2006, [EMAIL PROTECTED] wrote:

> +int cipso_v4_doi_add(struct cipso_v4_doi *doi_def)
> +{
> +     if (doi_def == NULL || doi_def->doi == CIPSO_V4_DOI_UNKNOWN)
> +             return -EINVAL;
> +
> +     doi_def->valid = 1;
> +     INIT_RCU_HEAD(&doi_def->rcu);
> +     INIT_LIST_HEAD(&doi_def->dom_list);
> +
> +     rcu_read_lock();
> +     if (cipso_v4_doi_search(doi_def->doi) != NULL) {
> +             rcu_read_unlock();
> +             return -EEXIST;
> +     }
> +     spin_lock(&cipso_v4_doi_list_lock);
> +     list_add_tail_rcu(&doi_def->list, &cipso_v4_doi_list);
> +     spin_unlock(&cipso_v4_doi_list_lock);
> +     rcu_read_unlock();
> +
> +     return 0;
> +}

This is racy in that you can end up with duplicate entries in the list 
between rcu_read_lock() and spin_lock().

You need to perform the search a second time under the spin_lock() as a 
slow path to verify that an entry wasn't added, before adding a new one.


- James
James Morris
<[EMAIL PROTECTED]>
-
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to