diff --git a/net/tipc/crypto.c b/net/tipc/crypto.c index b5aa0a835bced57c7e8b76da44b06c1263ceef52..86dbc4ddc1dc736f8cb3f8eee4ef6c1827336cc3 100644 --- a/net/tipc/crypto.c +++ b/net/tipc/crypto.c @@ -821,12 +821,20 @@ static int tipc_aead_encrypt(struct tipc_aead *aead, struct sk_buff *skb, goto exit; } + /* Get net to avoid freed tipc_crypto when delete namespace */ + if (!maybe_get_net(aead->crypto->net)) { + tipc_bearer_put(b); + rc = -ENODEV; + goto exit; + } + /* Now, do encrypt */ rc = crypto_aead_encrypt(req); if (rc == -EINPROGRESS || rc == -EBUSY) return rc; tipc_bearer_put(b); + put_net(aead->crypto->net); exit: kfree(ctx); @@ -864,6 +872,7 @@ static void tipc_aead_encrypt_done(struct crypto_async_request *base, int err) kfree(tx_ctx); tipc_bearer_put(b); tipc_aead_put(aead); + put_net(net); } /**