On 9/22/23 10:50, Kees Cook wrote:
In the pathological case of building sky2 with 16k PAGE_SIZE, the
frag_addr[] array would never be used, so the original code was correct
that size should be 0. But the compiler now gets upset with 0 size arrays
in places where it hasn't eliminated the code that might access such an
array (it can't figure out that in this case an rx skb with fragments
would never be created). To keep the compiler happy, make sure there is
at least 1 frag_addr in struct rx_ring_info:

    In file included from include/linux/skbuff.h:28,
                     from include/net/net_namespace.h:43,
                     from include/linux/netdevice.h:38,
                     from drivers/net/ethernet/marvell/sky2.c:18:
    drivers/net/ethernet/marvell/sky2.c: In function 'sky2_rx_unmap_skb':
    include/linux/dma-mapping.h:416:36: warning: array subscript i is outside 
array bounds of 'dma_addr_t[0]' {aka 'long long unsigned int[]'} 
[-Warray-bounds=]
      416 | #define dma_unmap_page(d, a, s, r) dma_unmap_page_attrs(d, a, s, r, 
0)
          |                                    
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    drivers/net/ethernet/marvell/sky2.c:1257:17: note: in expansion of macro 
'dma_unmap_page'
     1257 |                 dma_unmap_page(&pdev->dev, re->frag_addr[i],
          |                 ^~~~~~~~~~~~~~
    In file included from drivers/net/ethernet/marvell/sky2.c:41:
    drivers/net/ethernet/marvell/sky2.h:2198:25: note: while referencing 
'frag_addr'
     2198 |         dma_addr_t      frag_addr[ETH_JUMBO_MTU >> PAGE_SHIFT];
          |                         ^~~~~~~~~

With CONFIG_PAGE_SIZE_16KB=y, PAGE_SHIFT == 14, so:

   #define ETH_JUMBO_MTU   9000

causes "ETH_JUMBO_MTU >> PAGE_SHIFT" to be 0. Use "?: 1" to solve this build 
warning.

Cc: Mirko Lindner <[email protected]>
Cc: Stephen Hemminger <[email protected]>
Cc: "David S. Miller" <[email protected]>
Cc: Eric Dumazet <[email protected]>
Cc: Jakub Kicinski <[email protected]>
Cc: Paolo Abeni <[email protected]>
Cc: [email protected]
Reported-by: kernel test robot <[email protected]>
Closes: 
https://lore.kernel.org/oe-kbuild-all/[email protected]/
Reviewed-by: Alexander Lobakin <[email protected]>
Signed-off-by: Kees Cook <[email protected]>

Reviewed-by: Gustavo A. R. Silva <[email protected]>

Thanks
--
Gustavo

---
v2 - improve commit message, add Ack
v1 - https://lore.kernel.org/netdev/[email protected]/
---
  drivers/net/ethernet/marvell/sky2.h | 2 +-
  1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/net/ethernet/marvell/sky2.h 
b/drivers/net/ethernet/marvell/sky2.h
index ddec1627f1a7..8d0bacf4e49c 100644
--- a/drivers/net/ethernet/marvell/sky2.h
+++ b/drivers/net/ethernet/marvell/sky2.h
@@ -2195,7 +2195,7 @@ struct rx_ring_info {
        struct sk_buff  *skb;
        dma_addr_t      data_addr;
        DEFINE_DMA_UNMAP_LEN(data_size);
-       dma_addr_t      frag_addr[ETH_JUMBO_MTU >> PAGE_SHIFT];
+       dma_addr_t      frag_addr[ETH_JUMBO_MTU >> PAGE_SHIFT ?: 1];
  };
enum flow_control {

Reply via email to