Revert "net/tls: avoid NULL-deref on resync during device removal"
authorJakub Kicinski <jakub.kicinski@netronome.com>
Tue, 4 Jun 2019 19:00:11 +0000 (12:00 -0700)
committerDavid S. Miller <davem@davemloft.net>
Tue, 4 Jun 2019 20:34:37 +0000 (13:34 -0700)
This reverts commit 38030d7cb77963ba84cdbe034806e2b81245339f.
Unfortunately the RX resync may get called from soft IRQ,
so we can't take the rwsem to protect from the device
disappearing.

Signed-off-by: Jakub Kicinski <jakub.kicinski@netronome.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/tls/tls_device.c

index b95c408..49b3a2f 100644 (file)
@@ -553,8 +553,8 @@ void tls_device_write_space(struct sock *sk, struct tls_context *ctx)
 void handle_device_resync(struct sock *sk, u32 seq, u64 rcd_sn)
 {
        struct tls_context *tls_ctx = tls_get_ctx(sk);
+       struct net_device *netdev = tls_ctx->netdev;
        struct tls_offload_context_rx *rx_ctx;
-       struct net_device *netdev;
        u32 is_req_pending;
        s64 resync_req;
        u32 req_seq;
@@ -568,15 +568,10 @@ void handle_device_resync(struct sock *sk, u32 seq, u64 rcd_sn)
        is_req_pending = resync_req;
 
        if (unlikely(is_req_pending) && req_seq == seq &&
-           atomic64_try_cmpxchg(&rx_ctx->resync_req, &resync_req, 0)) {
-               seq += TLS_HEADER_SIZE - 1;
-               down_read(&device_offload_lock);
-               netdev = tls_ctx->netdev;
-               if (netdev)
-                       netdev->tlsdev_ops->tls_dev_resync_rx(netdev, sk, seq,
-                                                             rcd_sn);
-               up_read(&device_offload_lock);
-       }
+           atomic64_try_cmpxchg(&rx_ctx->resync_req, &resync_req, 0))
+               netdev->tlsdev_ops->tls_dev_resync_rx(netdev, sk,
+                                                     seq + TLS_HEADER_SIZE - 1,
+                                                     rcd_sn);
 }
 
 static int tls_device_reencrypt(struct sock *sk, struct sk_buff *skb)