OSDN Git Service

r8152: fix accessing unset transport header
authorHayes Wang <hayeswang@realtek.com>
Wed, 13 Jul 2022 03:31:11 +0000 (11:31 +0800)
committerDavid S. Miller <davem@davemloft.net>
Wed, 13 Jul 2022 13:52:49 +0000 (14:52 +0100)
A warning is triggered by commit 66e4c8d95008 ("net: warn if transport
header was not set"). The warning is harmless, because the value from
skb_transport_offset() is only used for skb_is_gso() is true or the
skb->ip_summed is equal to CHECKSUM_PARTIAL.

Fixes: 66e4c8d95008 ("net: warn if transport header was not set")
Signed-off-by: Hayes Wang <hayeswang@realtek.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/usb/r8152.c

index 7389d6e..b082819 100644 (file)
@@ -2156,7 +2156,7 @@ static inline void rtl_rx_vlan_tag(struct rx_desc *desc, struct sk_buff *skb)
 }
 
 static int r8152_tx_csum(struct r8152 *tp, struct tx_desc *desc,
-                        struct sk_buff *skb, u32 len, u32 transport_offset)
+                        struct sk_buff *skb, u32 len)
 {
        u32 mss = skb_shinfo(skb)->gso_size;
        u32 opts1, opts2 = 0;
@@ -2167,6 +2167,8 @@ static int r8152_tx_csum(struct r8152 *tp, struct tx_desc *desc,
        opts1 = len | TX_FS | TX_LS;
 
        if (mss) {
+               u32 transport_offset = (u32)skb_transport_offset(skb);
+
                if (transport_offset > GTTCPHO_MAX) {
                        netif_warn(tp, tx_err, tp->netdev,
                                   "Invalid transport offset 0x%x for TSO\n",
@@ -2197,6 +2199,7 @@ static int r8152_tx_csum(struct r8152 *tp, struct tx_desc *desc,
                opts1 |= transport_offset << GTTCPHO_SHIFT;
                opts2 |= min(mss, MSS_MAX) << MSS_SHIFT;
        } else if (skb->ip_summed == CHECKSUM_PARTIAL) {
+               u32 transport_offset = (u32)skb_transport_offset(skb);
                u8 ip_protocol;
 
                if (transport_offset > TCPHO_MAX) {
@@ -2260,7 +2263,6 @@ static int r8152_tx_agg_fill(struct r8152 *tp, struct tx_agg *agg)
                struct tx_desc *tx_desc;
                struct sk_buff *skb;
                unsigned int len;
-               u32 offset;
 
                skb = __skb_dequeue(&skb_head);
                if (!skb)
@@ -2276,9 +2278,7 @@ static int r8152_tx_agg_fill(struct r8152 *tp, struct tx_agg *agg)
                tx_data = tx_agg_align(tx_data);
                tx_desc = (struct tx_desc *)tx_data;
 
-               offset = (u32)skb_transport_offset(skb);
-
-               if (r8152_tx_csum(tp, tx_desc, skb, skb->len, offset)) {
+               if (r8152_tx_csum(tp, tx_desc, skb, skb->len)) {
                        r8152_csum_workaround(tp, skb, &skb_head);
                        continue;
                }
@@ -2759,9 +2759,9 @@ rtl8152_features_check(struct sk_buff *skb, struct net_device *dev,
 {
        u32 mss = skb_shinfo(skb)->gso_size;
        int max_offset = mss ? GTTCPHO_MAX : TCPHO_MAX;
-       int offset = skb_transport_offset(skb);
 
-       if ((mss || skb->ip_summed == CHECKSUM_PARTIAL) && offset > max_offset)
+       if ((mss || skb->ip_summed == CHECKSUM_PARTIAL) &&
+           skb_transport_offset(skb) > max_offset)
                features &= ~(NETIF_F_CSUM_MASK | NETIF_F_GSO_MASK);
        else if ((skb->len + sizeof(struct tx_desc)) > agg_buf_sz)
                features &= ~NETIF_F_GSO_MASK;