diff options
Diffstat (limited to 'net/sctp/auth.c')
| -rw-r--r-- | net/sctp/auth.c | 18 | 
1 files changed, 14 insertions, 4 deletions
diff --git a/net/sctp/auth.c b/net/sctp/auth.c index db6b7373d16c..34964145514e 100644 --- a/net/sctp/auth.c +++ b/net/sctp/auth.c @@ -863,12 +863,17 @@ int sctp_auth_set_key(struct sctp_endpoint *ep,  	}  	list_del_init(&shkey->key_list); -	sctp_auth_shkey_release(shkey);  	list_add(&cur_key->key_list, sh_keys); -	if (asoc && asoc->active_key_id == auth_key->sca_keynumber) -		sctp_auth_asoc_init_active_key(asoc, GFP_KERNEL); +	if (asoc && asoc->active_key_id == auth_key->sca_keynumber && +	    sctp_auth_asoc_init_active_key(asoc, GFP_KERNEL)) { +		list_del_init(&cur_key->key_list); +		sctp_auth_shkey_release(cur_key); +		list_add(&shkey->key_list, sh_keys); +		return -ENOMEM; +	} +	sctp_auth_shkey_release(shkey);  	return 0;  } @@ -902,8 +907,13 @@ int sctp_auth_set_active_key(struct sctp_endpoint *ep,  		return -EINVAL;  	if (asoc) { +		__u16  active_key_id = asoc->active_key_id; +  		asoc->active_key_id = key_id; -		sctp_auth_asoc_init_active_key(asoc, GFP_KERNEL); +		if (sctp_auth_asoc_init_active_key(asoc, GFP_KERNEL)) { +			asoc->active_key_id = active_key_id; +			return -ENOMEM; +		}  	} else  		ep->active_key_id = key_id;  |