|
@@ -1932,10 +1932,10 @@ EXPORT_SYMBOL(xfrm_unregister_km);
|
|
|
int xfrm_state_register_afinfo(struct xfrm_state_afinfo *afinfo)
|
|
|
{
|
|
|
int err = 0;
|
|
|
- if (unlikely(afinfo == NULL))
|
|
|
- return -EINVAL;
|
|
|
- if (unlikely(afinfo->family >= NPROTO))
|
|
|
+
|
|
|
+ if (WARN_ON(afinfo->family >= NPROTO))
|
|
|
return -EAFNOSUPPORT;
|
|
|
+
|
|
|
spin_lock_bh(&xfrm_state_afinfo_lock);
|
|
|
if (unlikely(xfrm_state_afinfo[afinfo->family] != NULL))
|
|
|
err = -EEXIST;
|
|
@@ -1948,14 +1948,14 @@ EXPORT_SYMBOL(xfrm_state_register_afinfo);
|
|
|
|
|
|
int xfrm_state_unregister_afinfo(struct xfrm_state_afinfo *afinfo)
|
|
|
{
|
|
|
- int err = 0;
|
|
|
- if (unlikely(afinfo == NULL))
|
|
|
- return -EINVAL;
|
|
|
- if (unlikely(afinfo->family >= NPROTO))
|
|
|
+ int err = 0, family = afinfo->family;
|
|
|
+
|
|
|
+ if (WARN_ON(family >= NPROTO))
|
|
|
return -EAFNOSUPPORT;
|
|
|
+
|
|
|
spin_lock_bh(&xfrm_state_afinfo_lock);
|
|
|
if (likely(xfrm_state_afinfo[afinfo->family] != NULL)) {
|
|
|
- if (unlikely(xfrm_state_afinfo[afinfo->family] != afinfo))
|
|
|
+ if (rcu_access_pointer(xfrm_state_afinfo[family]) != afinfo)
|
|
|
err = -EINVAL;
|
|
|
else
|
|
|
RCU_INIT_POINTER(xfrm_state_afinfo[afinfo->family], NULL);
|