diff options
Diffstat (limited to 'net/kcm/kcmsock.c')
| -rw-r--r-- | net/kcm/kcmsock.c | 15 | 
1 files changed, 7 insertions, 8 deletions
diff --git a/net/kcm/kcmsock.c b/net/kcm/kcmsock.c index 71899e5a5a11..1215c863e1c4 100644 --- a/net/kcm/kcmsock.c +++ b/net/kcm/kcmsock.c @@ -1412,12 +1412,6 @@ static int kcm_attach(struct socket *sock, struct socket *csock,  	psock->sk = csk;  	psock->bpf_prog = prog; -	err = strp_init(&psock->strp, csk, &cb); -	if (err) { -		kmem_cache_free(kcm_psockp, psock); -		goto out; -	} -  	write_lock_bh(&csk->sk_callback_lock);  	/* Check if sk_user_data is already by KCM or someone else. @@ -1425,13 +1419,18 @@ static int kcm_attach(struct socket *sock, struct socket *csock,  	 */  	if (csk->sk_user_data) {  		write_unlock_bh(&csk->sk_callback_lock); -		strp_stop(&psock->strp); -		strp_done(&psock->strp);  		kmem_cache_free(kcm_psockp, psock);  		err = -EALREADY;  		goto out;  	} +	err = strp_init(&psock->strp, csk, &cb); +	if (err) { +		write_unlock_bh(&csk->sk_callback_lock); +		kmem_cache_free(kcm_psockp, psock); +		goto out; +	} +  	psock->save_data_ready = csk->sk_data_ready;  	psock->save_write_space = csk->sk_write_space;  	psock->save_state_change = csk->sk_state_change;  |