tls: Fix tls_device receive
authorBoris Pismenny <borisp@mellanox.com>
Wed, 27 Feb 2019 15:38:06 +0000 (17:38 +0200)
committerDavid S. Miller <davem@davemloft.net>
Mon, 4 Mar 2019 06:10:16 +0000 (22:10 -0800)
Currently, the receive function fails to handle records already
decrypted by the device due to the commit mentioned below.

This commit advances the TLS record sequence number and prepares the context
to handle the next record.

Fixes: fedf201e1296 ("net: tls: Refactor control message handling on recv")
Signed-off-by: Boris Pismenny <borisp@mellanox.com>
Reviewed-by: Eran Ben Elisha <eranbe@mellanox.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/tls/tls_sw.c

index 68cd026fa57cd95c89296065a152946363b55e68..425351ac2a9b156aacf9234e566d7c5ba0dc5867 100644 (file)
@@ -1467,23 +1467,26 @@ static int decrypt_skb_update(struct sock *sk, struct sk_buff *skb,
        struct strp_msg *rxm = strp_msg(skb);
        int err = 0;
 
+       if (!ctx->decrypted) {
 #ifdef CONFIG_TLS_DEVICE
-       err = tls_device_decrypted(sk, skb);
-       if (err < 0)
-               return err;
+               err = tls_device_decrypted(sk, skb);
+               if (err < 0)
+                       return err;
 #endif
-       if (!ctx->decrypted) {
-               err = decrypt_internal(sk, skb, dest, NULL, chunk, zc, async);
-               if (err < 0) {
-                       if (err == -EINPROGRESS)
-                               tls_advance_record_sn(sk, &tls_ctx->rx,
-                                                     version);
+               /* Still not decrypted after tls_device */
+               if (!ctx->decrypted) {
+                       err = decrypt_internal(sk, skb, dest, NULL, chunk, zc,
+                                              async);
+                       if (err < 0) {
+                               if (err == -EINPROGRESS)
+                                       tls_advance_record_sn(sk, &tls_ctx->rx,
+                                                             version);
 
-                       return err;
+                               return err;
+                       }
                }
 
                rxm->full_len -= padding_length(ctx, tls_ctx, skb);
-
                rxm->offset += prot->prepend_size;
                rxm->full_len -= prot->overhead_size;
                tls_advance_record_sn(sk, &tls_ctx->rx, version);