@ -76,6 +76,8 @@ int af_alg_register_type(const struct af_alg_type *type)
goto unlock ;
type - > ops - > owner = THIS_MODULE ;
if ( type - > ops_nokey )
type - > ops_nokey - > owner = THIS_MODULE ;
node - > type = type ;
list_add ( & node - > list , & alg_types ) ;
err = 0 ;
@ -267,6 +269,7 @@ int af_alg_accept(struct sock *sk, struct socket *newsock)
const struct af_alg_type * type ;
struct sock * sk2 ;
int err ;
bool nokey ;
lock_sock ( sk ) ;
type = ask - > type ;
@ -285,12 +288,17 @@ int af_alg_accept(struct sock *sk, struct socket *newsock)
security_sk_clone ( sk , sk2 ) ;
err = type - > accept ( ask - > private , sk2 ) ;
nokey = err = = - ENOKEY ;
if ( nokey & & type - > accept_nokey )
err = type - > accept_nokey ( ask - > private , sk2 ) ;
if ( err )
goto unlock ;
sk2 - > sk_family = PF_ALG ;
if ( ! ask - > refcnt + + )
if ( nokey | | ! ask - > refcnt + + )
sock_hold ( sk ) ;
alg_sk ( sk2 ) - > parent = sk ;
alg_sk ( sk2 ) - > type = type ;
@ -298,6 +306,9 @@ int af_alg_accept(struct sock *sk, struct socket *newsock)
newsock - > ops = type - > ops ;
newsock - > state = SS_CONNECTED ;
if ( nokey )
newsock - > ops = type - > ops_nokey ;
err = 0 ;
unlock :