]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
rxrpc: Fix rxkad crypto unalignment handling
authorDavid Howells <dhowells@redhat.com>
Wed, 22 Apr 2026 16:14:31 +0000 (17:14 +0100)
committerJakub Kicinski <kuba@kernel.org>
Thu, 23 Apr 2026 19:40:52 +0000 (12:40 -0700)
Fix handling of a packet with a misaligned crypto length.  Also handle
non-ENOMEM errors from decryption by aborting.  Further, remove the
WARN_ON_ONCE() so that it can't be remotely triggered (a trace line can
still be emitted).

Fixes: f93af41b9f5f ("rxrpc: Fix missing error checks for rxkad encryption/decryption failure")
Closes: https://sashiko.dev/#/patchset/20260408121252.2249051-1-dhowells%40redhat.com
Signed-off-by: David Howells <dhowells@redhat.com>
cc: Marc Dionne <marc.dionne@auristor.com>
cc: Jeffrey Altman <jaltman@auristor.com>
cc: Simon Horman <horms@kernel.org>
cc: linux-afs@lists.infradead.org
cc: stable@kernel.org
Link: https://patch.msgid.link/20260422161438.2593376-3-dhowells@redhat.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
include/trace/events/rxrpc.h
net/rxrpc/rxkad.c

index 578b8038b21178479f81d0013e1ae9e4a99f9d45..5820d7e41ea09a00279e9904a8d43b32e64d2cba 100644 (file)
@@ -37,6 +37,7 @@
        EM(rxkad_abort_1_short_encdata,         "rxkad1-short-encdata") \
        EM(rxkad_abort_1_short_header,          "rxkad1-short-hdr")     \
        EM(rxkad_abort_2_short_check,           "rxkad2-short-check")   \
+       EM(rxkad_abort_2_crypto_unaligned,      "rxkad2-crypto-unaligned") \
        EM(rxkad_abort_2_short_data,            "rxkad2-short-data")    \
        EM(rxkad_abort_2_short_header,          "rxkad2-short-hdr")     \
        EM(rxkad_abort_2_short_len,             "rxkad2-short-len")     \
index 5a720222854fac82838e1cf30e55fb265beb22a8..cba7935977f0ba063c82db9f4889c1527f548255 100644 (file)
@@ -510,6 +510,9 @@ static int rxkad_verify_packet_2(struct rxrpc_call *call, struct sk_buff *skb,
                return rxrpc_abort_eproto(call, skb, RXKADSEALEDINCON,
                                          rxkad_abort_2_short_header);
 
+       /* Don't let the crypto algo see a misaligned length. */
+       sp->len = round_down(sp->len, 8);
+
        /* Decrypt the skbuff in-place.  TODO: We really want to decrypt
         * directly into the target buffer.
         */
@@ -543,8 +546,10 @@ static int rxkad_verify_packet_2(struct rxrpc_call *call, struct sk_buff *skb,
        if (sg != _sg)
                kfree(sg);
        if (ret < 0) {
-               WARN_ON_ONCE(ret != -ENOMEM);
-               return ret;
+               if (ret == -ENOMEM)
+                       return ret;
+               return rxrpc_abort_eproto(call, skb, RXKADSEALEDINCON,
+                                         rxkad_abort_2_crypto_unaligned);
        }
 
        /* Extract the decrypted packet length */