sfc: allocate a big enough SKB for loopback selftest packet
authorEdward Cree <ecree.xilinx@gmail.com>
Mon, 21 Aug 2023 18:01:53 +0000 (19:01 +0100)
committerJakub Kicinski <kuba@kernel.org>
Tue, 22 Aug 2023 18:09:53 +0000 (11:09 -0700)
Cited commits passed a size to alloc_skb that was only big enough for
 the actual packet contents, but the following skb_put + memcpy writes
 the whole struct efx_loopback_payload including leading and trailing
 padding bytes (which are then stripped off with skb_pull/skb_trim).
This could cause an skb_over_panic, although in practice we get saved
 by kmalloc_size_roundup.
Pass the entire size we use, instead of the size of the final packet.

Reported-by: Andy Moreton <andy.moreton@amd.com>
Fixes: cf60ed469629 ("sfc: use padding to fix alignment in loopback test")
Fixes: 30c24dd87f3f ("sfc: siena: use padding to fix alignment in loopback test")
Fixes: 1186c6b31ee1 ("sfc: falcon: use padding to fix alignment in loopback test")
Signed-off-by: Edward Cree <ecree.xilinx@gmail.com>
Reviewed-by: Simon Horman <horms@kernel.org>
Link: https://lore.kernel.org/r/20230821180153.18652-1-edward.cree@amd.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/ethernet/sfc/falcon/selftest.c
drivers/net/ethernet/sfc/selftest.c
drivers/net/ethernet/sfc/siena/selftest.c

index cf1d67b6d86db52eb2b0bc8bbd36591b85f0dabf..c3dc88e6c26cf93f77a5d0b78d08346259edc86a 100644 (file)
@@ -428,7 +428,7 @@ static int ef4_begin_loopback(struct ef4_tx_queue *tx_queue)
        for (i = 0; i < state->packet_count; i++) {
                /* Allocate an skb, holding an extra reference for
                 * transmit completion counting */
-               skb = alloc_skb(EF4_LOOPBACK_PAYLOAD_LEN, GFP_KERNEL);
+               skb = alloc_skb(sizeof(state->payload), GFP_KERNEL);
                if (!skb)
                        return -ENOMEM;
                state->skbs[i] = skb;
index 19a0b8584afbb8f3fca52d6adf06f61445d0579b..563c1e317ce99f68cff7f38f593ad929aa5bf756 100644 (file)
@@ -426,7 +426,7 @@ static int efx_begin_loopback(struct efx_tx_queue *tx_queue)
        for (i = 0; i < state->packet_count; i++) {
                /* Allocate an skb, holding an extra reference for
                 * transmit completion counting */
-               skb = alloc_skb(EFX_LOOPBACK_PAYLOAD_LEN, GFP_KERNEL);
+               skb = alloc_skb(sizeof(state->payload), GFP_KERNEL);
                if (!skb)
                        return -ENOMEM;
                state->skbs[i] = skb;
index b55fd33469727d2a568804e00aad063567574662..526da43d4b61716f3f5a6394566b2c9f4e3a67af 100644 (file)
@@ -426,7 +426,7 @@ static int efx_begin_loopback(struct efx_tx_queue *tx_queue)
        for (i = 0; i < state->packet_count; i++) {
                /* Allocate an skb, holding an extra reference for
                 * transmit completion counting */
-               skb = alloc_skb(EFX_LOOPBACK_PAYLOAD_LEN, GFP_KERNEL);
+               skb = alloc_skb(sizeof(state->payload), GFP_KERNEL);
                if (!skb)
                        return -ENOMEM;
                state->skbs[i] = skb;