Blame SOURCES/CVE-2022-2964.patch

b88ab5
From ad4757373f2ade3e1b238c8967d1b5bf80654820 Mon Sep 17 00:00:00 2001
b88ab5
From: Yannick Cote <ycote@redhat.com>
b88ab5
Date: Wed, 7 Dec 2022 14:07:55 -0500
b88ab5
Subject: [KPATCH CVE-2022-2964] kpatch fixes for CVE-2022-2964
b88ab5
b88ab5
Kernels:
b88ab5
3.10.0-1160.66.1.el7
b88ab5
3.10.0-1160.71.1.el7
b88ab5
3.10.0-1160.76.1.el7
b88ab5
3.10.0-1160.80.1.el7
b88ab5
b88ab5
b88ab5
Kpatch-MR: https://gitlab.com/redhat/prdsc/rhel/src/kpatch/rhel-7/-/merge_requests/47
b88ab5
Approved-by: Joe Lawrence (@joe.lawrence)
b88ab5
Changes since last build:
b88ab5
arches: x86_64 ppc64le
b88ab5
ax88179_178a.o: changed function: ax88179_rx_fixup
b88ab5
ax88179_178a.o: changed function: ax88179_tx_fixup
b88ab5
---------------------------
b88ab5
b88ab5
Modifications: none
b88ab5
b88ab5
commit 6887c693d5b263d458cdae235b5ca4cb36d79466
b88ab5
Author: Jose Ignacio Tornos Martinez <jtornosm@redhat.com>
b88ab5
Date:   Thu Oct 6 18:32:21 2022 +0200
b88ab5
b88ab5
    net: usb: ax88179_178a: fix packet alignment padding
b88ab5
b88ab5
    Bugzilla: https://bugzilla.redhat.com/2120504
b88ab5
    CVE: CVE-2022-2964
b88ab5
b88ab5
    commit e869e7a17798d85829fa7d4f9bbe1eebd4b2d3f6
b88ab5
    Author: Jeremy Kerr <jk@ozlabs.org>
b88ab5
    Date:   Mon Jun 15 10:54:56 2020 +0800
b88ab5
b88ab5
        net: usb: ax88179_178a: fix packet alignment padding
b88ab5
b88ab5
        Using a AX88179 device (0b95:1790), I see two bytes of appended data on
b88ab5
        every RX packet. For example, this 48-byte ping, using 0xff as a
b88ab5
        payload byte:
b88ab5
b88ab5
          04:20:22.528472 IP 192.168.1.1 > 192.168.1.2: ICMP echo request, id 2447, seq 1, length 64
b88ab5
                0x0000:  000a cd35 ea50 000a cd35 ea4f 0800 4500
b88ab5
                0x0010:  0054 c116 4000 4001 f63e c0a8 0101 c0a8
b88ab5
                0x0020:  0102 0800 b633 098f 0001 87ea cd5e 0000
b88ab5
                0x0030:  0000 dcf2 0600 0000 0000 ffff ffff ffff
b88ab5
                0x0040:  ffff ffff ffff ffff ffff ffff ffff ffff
b88ab5
                0x0050:  ffff ffff ffff ffff ffff ffff ffff ffff
b88ab5
                0x0060:  ffff 961f
b88ab5
b88ab5
        Those last two bytes - 96 1f - aren't part of the original packet.
b88ab5
b88ab5
        In the ax88179 RX path, the usbnet rx_fixup function trims a 2-byte
b88ab5
        'alignment pseudo header' from the start of the packet, and sets the
b88ab5
        length from a per-packet field populated by hardware. It looks like that
b88ab5
        length field *includes* the 2-byte header; the current driver assumes
b88ab5
        that it's excluded.
b88ab5
b88ab5
        This change trims the 2-byte alignment header after we've set the packet
b88ab5
        length, so the resulting packet length is correct. While we're moving
b88ab5
        the comment around, this also fixes the spelling of 'pseudo'.
b88ab5
b88ab5
        Signed-off-by: Jeremy Kerr <jk@ozlabs.org>
b88ab5
        Signed-off-by: David S. Miller <davem@davemloft.net>
b88ab5
b88ab5
    Signed-off-by: Jose Ignacio Tornos Martinez <jtornosm@redhat.com>
b88ab5
b88ab5
commit cb4cf1dd8820ba776a91ebf5b88ad1c3d83a0dfb
b88ab5
Author: Jose Ignacio Tornos Martinez <jtornosm@redhat.com>
b88ab5
Date:   Thu Oct 6 18:32:21 2022 +0200
b88ab5
b88ab5
    ax88179_178a: Merge memcpy + le32_to_cpus to get_unaligned_le32
b88ab5
b88ab5
    Bugzilla: https://bugzilla.redhat.com/2120504
b88ab5
    CVE: CVE-2022-2964
b88ab5
b88ab5
    commit d1854d509d61d36af44f2130423bff8836e1592e
b88ab5
    Author: Chuhong Yuan <hslester96@gmail.com>
b88ab5
    Date:   Fri Jul 19 17:07:15 2019 +0800
b88ab5
b88ab5
        ax88179_178a: Merge memcpy + le32_to_cpus to get_unaligned_le32
b88ab5
b88ab5
        Merge the combo use of memcpy and le32_to_cpus.
b88ab5
        Use get_unaligned_le32 instead.
b88ab5
        This simplifies the code.
b88ab5
b88ab5
        Signed-off-by: Chuhong Yuan <hslester96@gmail.com>
b88ab5
        Signed-off-by: David S. Miller <davem@davemloft.net>
b88ab5
b88ab5
    Signed-off-by: Jose Ignacio Tornos Martinez <jtornosm@redhat.com>
b88ab5
b88ab5
commit 4e6ea26989123e731329323492d30f826aa28010
b88ab5
Author: Jose Ignacio Tornos Martinez <jtornosm@redhat.com>
b88ab5
Date:   Thu Oct 6 18:32:21 2022 +0200
b88ab5
b88ab5
    net: usb: Merge cpu_to_le32s + memcpy to put_unaligned_le32
b88ab5
b88ab5
    Bugzilla: https://bugzilla.redhat.com/2120504
b88ab5
    CVE: CVE-2022-2964
b88ab5
b88ab5
    Conflicts:
b88ab5
        Only ax88179 files
b88ab5
b88ab5
    commit 7e24b4ed5ac4321e41415b0c6f0f8a8ac14852b2
b88ab5
    Author: Chuhong Yuan <hslester96@gmail.com>
b88ab5
    Date:   Mon Jul 22 15:41:34 2019 +0800
b88ab5
b88ab5
        net: usb: Merge cpu_to_le32s + memcpy to put_unaligned_le32
b88ab5
b88ab5
        Merge the combo uses of cpu_to_le32s and memcpy.
b88ab5
        Use put_unaligned_le32 instead.
b88ab5
        This simplifies the code.
b88ab5
b88ab5
        Signed-off-by: Chuhong Yuan <hslester96@gmail.com>
b88ab5
        Signed-off-by: David S. Miller <davem@davemloft.net>
b88ab5
b88ab5
    Signed-off-by: Jose Ignacio Tornos Martinez <jtornosm@redhat.com>
b88ab5
b88ab5
commit 7faaf2665dcbc3a4fdb31331de699045040ed213
b88ab5
Author: Jose Ignacio Tornos Martinez <jtornosm@redhat.com>
b88ab5
Date:   Thu Oct 6 18:32:22 2022 +0200
b88ab5
b88ab5
    net: usb: ax88179_178a: Fix out-of-bounds accesses in RX fixup
b88ab5
b88ab5
    Bugzilla: https://bugzilla.redhat.com/2120504
b88ab5
    CVE: CVE-2022-2964
b88ab5
b88ab5
    commit 57bc3d3ae8c14df3ceb4e17d26ddf9eeab304581
b88ab5
    Author: Jann Horn <jannh@google.com>
b88ab5
    Date:   Wed Jan 26 14:14:52 2022 +0100
b88ab5
b88ab5
        net: usb: ax88179_178a: Fix out-of-bounds accesses in RX fixup
b88ab5
b88ab5
        ax88179_rx_fixup() contains several out-of-bounds accesses that can be
b88ab5
        triggered by a malicious (or defective) USB device, in particular:
b88ab5
b88ab5
         - The metadata array (hdr_off..hdr_off+2*pkt_cnt) can be out of bounds,
b88ab5
           causing OOB reads and (on big-endian systems) OOB endianness flips.
b88ab5
         - A packet can overlap the metadata array, causing a later OOB
b88ab5
           endianness flip to corrupt data used by a cloned SKB that has already
b88ab5
           been handed off into the network stack.
b88ab5
         - A packet SKB can be constructed whose tail is far beyond its end,
b88ab5
           causing out-of-bounds heap data to be considered part of the SKB's
b88ab5
           data.
b88ab5
b88ab5
        I have tested that this can be used by a malicious USB device to send a
b88ab5
        bogus ICMPv6 Echo Request and receive an ICMPv6 Echo Reply in response
b88ab5
        that contains random kernel heap data.
b88ab5
        It's probably also possible to get OOB writes from this on a
b88ab5
        little-endian system somehow - maybe by triggering skb_cow() via IP
b88ab5
        options processing -, but I haven't tested that.
b88ab5
b88ab5
        Fixes: e2ca90c276e1 ("ax88179_178a: ASIX AX88179_178A USB 3.0/2.0 to gigabit ethernet adapter driver")
b88ab5
        Cc: stable@kernel.org
b88ab5
        Signed-off-by: Jann Horn <jannh@google.com>
b88ab5
        Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
b88ab5
b88ab5
    Signed-off-by: Jose Ignacio Tornos Martinez <jtornosm@redhat.com>
b88ab5
b88ab5
commit 4e8b1e4091c6dce2911ffe8b9a8a7c58f8b028bc
b88ab5
Author: Jose Ignacio Tornos Martinez <jtornosm@redhat.com>
b88ab5
Date:   Thu Nov 17 08:53:37 2022 +0100
b88ab5
b88ab5
    net: usb: ax88179_178a: Fix packet receiving
b88ab5
b88ab5
    Bugzilla: https://bugzilla.redhat.com/2120504
b88ab5
    CVE: CVE-2022-2964
b88ab5
b88ab5
    commit f8ebb3ac881b17712e1d5967c97ab1806b16d3d6
b88ab5
    Author: Jose Alonso <joalonsof@gmail.com>
b88ab5
    Date:   Tue Jun 28 12:13:02 2022 -0300
b88ab5
b88ab5
        net: usb: ax88179_178a: Fix packet receiving
b88ab5
b88ab5
        This patch corrects packet receiving in ax88179_rx_fixup.
b88ab5
b88ab5
        - problem observed:
b88ab5
          ifconfig shows allways a lot of 'RX Errors' while packets
b88ab5
          are received normally.
b88ab5
b88ab5
          This occurs because ax88179_rx_fixup does not recognise properly
b88ab5
          the usb urb received.
b88ab5
          The packets are normally processed and at the end, the code exits
b88ab5
          with 'return 0', generating RX Errors.
b88ab5
          (pkt_cnt==-2 and ptk_hdr over field rx_hdr trying to identify
b88ab5
           another packet there)
b88ab5
b88ab5
          This is a usb urb received by "tcpdump -i usbmon2 -X" on a
b88ab5
          little-endian CPU:
b88ab5
          0x0000:  eeee f8e3 3b19 87a0 94de 80e3 daac 0800
b88ab5
                   ^         packet 1 start (pkt_len = 0x05ec)
b88ab5
                   ^^^^      IP alignment pseudo header
b88ab5
                        ^    ethernet packet start
b88ab5
                   last byte ethernet packet   v
b88ab5
                   padding (8-bytes aligned)     vvvv vvvv
b88ab5
          0x05e0:  c92d d444 1420 8a69 83dd 272f e82b 9811
b88ab5
          0x05f0:  eeee f8e3 3b19 87a0 94de 80e3 daac 0800
b88ab5
          ...      ^ packet 2
b88ab5
          0x0be0:  eeee f8e3 3b19 87a0 94de 80e3 daac 0800
b88ab5
          ...
b88ab5
          0x1130:  9d41 9171 8a38 0ec5 eeee f8e3 3b19 87a0
b88ab5
          ...
b88ab5
          0x1720:  8cfc 15ff 5e4c e85c eeee f8e3 3b19 87a0
b88ab5
          ...
b88ab5
          0x1d10:  ecfa 2a3a 19ab c78c eeee f8e3 3b19 87a0
b88ab5
          ...
b88ab5
          0x2070:  eeee f8e3 3b19 87a0 94de 80e3 daac 0800
b88ab5
          ...      ^ packet 7
b88ab5
          0x2120:  7c88 4ca5 5c57 7dcc 0d34 7577 f778 7e0a
b88ab5
          0x2130:  f032 e093 7489 0740 3008 ec05 0000 0080
b88ab5
                                       ====1==== ====2====
b88ab5
                   hdr_off             ^
b88ab5
                   pkt_len = 0x05ec         ^^^^
b88ab5
                   AX_RXHDR_*=0x00830  ^^^^   ^
b88ab5
                   pkt_len = 0                        ^^^^
b88ab5
                   AX_RXHDR_DROP_ERR=0x80000000  ^^^^   ^
b88ab5
          0x2140:  3008 ec05 0000 0080 3008 5805 0000 0080
b88ab5
          0x2150:  3008 ec05 0000 0080 3008 ec05 0000 0080
b88ab5
          0x2160:  3008 5803 0000 0080 3008 c800 0000 0080
b88ab5
                   ===11==== ===12==== ===13==== ===14====
b88ab5
          0x2170:  0000 0000 0e00 3821
b88ab5
                             ^^^^ ^^^^ rx_hdr
b88ab5
                             ^^^^      pkt_cnt=14
b88ab5
                                  ^^^^ hdr_off=0x2138
b88ab5
                   ^^^^ ^^^^           padding
b88ab5
b88ab5
          The dump shows that pkt_cnt is the number of entrys in the
b88ab5
          per-packet metadata. It is "2 * packet count".
b88ab5
          Each packet have two entrys. The first have a valid
b88ab5
          value (pkt_len and AX_RXHDR_*) and the second have a
b88ab5
          dummy-header 0x80000000 (pkt_len=0 with AX_RXHDR_DROP_ERR).
b88ab5
          Why exists dummy-header for each packet?!?
b88ab5
          My guess is that this was done probably to align the
b88ab5
          entry for each packet to 64-bits and maintain compatibility
b88ab5
          with old firmware.
b88ab5
          There is also a padding (0x00000000) before the rx_hdr to
b88ab5
          align the end of rx_hdr to 64-bit.
b88ab5
          Note that packets have a alignment of 64-bits (8-bytes).
b88ab5
b88ab5
          This patch assumes that the dummy-header and the last
b88ab5
          padding are optional. So it preserves semantics and
b88ab5
          recognises the same valid packets as the current code.
b88ab5
b88ab5
          This patch was made using only the dumpfile information and
b88ab5
          tested with only one device:
b88ab5
          0b95:1790 ASIX Electronics Corp. AX88179 Gigabit Ethernet
b88ab5
b88ab5
        Fixes: 57bc3d3ae8c1 ("net: usb: ax88179_178a: Fix out-of-bounds accesses in RX fixup")
b88ab5
        Fixes: e2ca90c276e1 ("ax88179_178a: ASIX AX88179_178A USB 3.0/2.0 to gigabit ethernet adapter driver")
b88ab5
        Signed-off-by: Jose Alonso <joalonsof@gmail.com>
b88ab5
        Acked-by: Paolo Abeni <pabeni@redhat.com>
b88ab5
        Link: https://lore.kernel.org/r/d6970bb04bf67598af4d316eaeb1792040b18cfd.camel@gmail.com
b88ab5
        Signed-off-by: Paolo Abeni <pabeni@redhat.com>
b88ab5
b88ab5
    Signed-off-by: Jose Ignacio Tornos Martinez <jtornosm@redhat.com>
b88ab5
b88ab5
Signed-off-by: Yannick Cote <ycote@redhat.com>
b88ab5
---
b88ab5
 drivers/net/usb/ax88179_178a.c | 128 ++++++++++++++++++++++++---------
b88ab5
 1 file changed, 93 insertions(+), 35 deletions(-)
b88ab5
b88ab5
diff --git a/drivers/net/usb/ax88179_178a.c b/drivers/net/usb/ax88179_178a.c
b88ab5
index 7f496ccdd272..1940f31facf0 100644
b88ab5
--- a/drivers/net/usb/ax88179_178a.c
b88ab5
+++ b/drivers/net/usb/ax88179_178a.c
b88ab5
@@ -1375,58 +1375,119 @@ static int ax88179_rx_fixup(struct usbnet *dev, struct sk_buff *skb)
b88ab5
 	u16 hdr_off;
b88ab5
 	u32 *pkt_hdr;
b88ab5
 
b88ab5
-	/* This check is no longer done by usbnet */
b88ab5
-	if (skb->len < dev->net->hard_header_len)
b88ab5
+	/* At the end of the SKB, there's a header telling us how many packets
b88ab5
+	 * are bundled into this buffer and where we can find an array of
b88ab5
+	 * per-packet metadata (which contains elements encoded into u16).
b88ab5
+	 */
b88ab5
+
b88ab5
+	/* SKB contents for current firmware:
b88ab5
+	 *   <packet 1> <padding>
b88ab5
+	 *   ...
b88ab5
+	 *   <packet N> <padding>
b88ab5
+	 *   <per-packet metadata entry 1> <dummy header>
b88ab5
+	 *   ...
b88ab5
+	 *   <per-packet metadata entry N> <dummy header>
b88ab5
+	 *   <padding2> <rx_hdr>
b88ab5
+	 *
b88ab5
+	 * where:
b88ab5
+	 *   <packet N> contains pkt_len bytes:
b88ab5
+	 *		2 bytes of IP alignment pseudo header
b88ab5
+	 *		packet received
b88ab5
+	 *   <per-packet metadata entry N> contains 4 bytes:
b88ab5
+	 *		pkt_len and fields AX_RXHDR_*
b88ab5
+	 *   <padding>	0-7 bytes to terminate at
b88ab5
+	 *		8 bytes boundary (64-bit).
b88ab5
+	 *   <padding2> 4 bytes to make rx_hdr terminate at
b88ab5
+	 *		8 bytes boundary (64-bit)
b88ab5
+	 *   <dummy-header> contains 4 bytes:
b88ab5
+	 *		pkt_len=0 and AX_RXHDR_DROP_ERR
b88ab5
+	 *   <rx-hdr>	contains 4 bytes:
b88ab5
+	 *		pkt_cnt and hdr_off (offset of
b88ab5
+	 *		  <per-packet metadata entry 1>)
b88ab5
+	 *
b88ab5
+	 * pkt_cnt is number of entrys in the per-packet metadata.
b88ab5
+	 * In current firmware there is 2 entrys per packet.
b88ab5
+	 * The first points to the packet and the
b88ab5
+	 *  second is a dummy header.
b88ab5
+	 * This was done probably to align fields in 64-bit and
b88ab5
+	 *  maintain compatibility with old firmware.
b88ab5
+	 * This code assumes that <dummy header> and <padding2> are
b88ab5
+	 *  optional.
b88ab5
+	 */
b88ab5
+
b88ab5
+	if (skb->len < 4)
b88ab5
 		return 0;
b88ab5
-
b88ab5
 	skb_trim(skb, skb->len - 4);
b88ab5
-	memcpy(&rx_hdr, skb_tail_pointer(skb), 4);
b88ab5
-	le32_to_cpus(&rx_hdr);
b88ab5
-
b88ab5
+	rx_hdr = get_unaligned_le32(skb_tail_pointer(skb));
b88ab5
 	pkt_cnt = (u16)rx_hdr;
b88ab5
 	hdr_off = (u16)(rx_hdr >> 16);
b88ab5
+
b88ab5
+	if (pkt_cnt == 0)
b88ab5
+		return 0;
b88ab5
+
b88ab5
+	/* Make sure that the bounds of the metadata array are inside the SKB
b88ab5
+	 * (and in front of the counter at the end).
b88ab5
+	 */
b88ab5
+	if (pkt_cnt * 4 + hdr_off > skb->len)
b88ab5
+		return 0;
b88ab5
 	pkt_hdr = (u32 *)(skb->data + hdr_off);
b88ab5
 
b88ab5
-	while (pkt_cnt--) {
b88ab5
+	/* Packets must not overlap the metadata array */
b88ab5
+	skb_trim(skb, hdr_off);
b88ab5
+
b88ab5
+	for (; pkt_cnt > 0; pkt_cnt--, pkt_hdr++) {
b88ab5
+		u16 pkt_len_plus_padd;
b88ab5
 		u16 pkt_len;
b88ab5
 
b88ab5
 		le32_to_cpus(pkt_hdr);
b88ab5
 		pkt_len = (*pkt_hdr >> 16) & 0x1fff;
b88ab5
+		pkt_len_plus_padd = (pkt_len + 7) & 0xfff8;
b88ab5
+
b88ab5
+		/* Skip dummy header used for alignment
b88ab5
+		 */
b88ab5
+		if (pkt_len == 0)
b88ab5
+			continue;
b88ab5
+
b88ab5
+		if (pkt_len_plus_padd > skb->len)
b88ab5
+			return 0;
b88ab5
 
b88ab5
 		/* Check CRC or runt packet */
b88ab5
-		if ((*pkt_hdr & AX_RXHDR_CRC_ERR) ||
b88ab5
-		    (*pkt_hdr & AX_RXHDR_DROP_ERR)) {
b88ab5
-			skb_pull(skb, (pkt_len + 7) & 0xFFF8);
b88ab5
-			pkt_hdr++;
b88ab5
+		if ((*pkt_hdr & (AX_RXHDR_CRC_ERR | AX_RXHDR_DROP_ERR)) ||
b88ab5
+		    pkt_len < 2 + ETH_HLEN) {
b88ab5
+			dev->net->stats.rx_errors++;
b88ab5
+			skb_pull(skb, pkt_len_plus_padd);
b88ab5
 			continue;
b88ab5
 		}
b88ab5
 
b88ab5
-		if (pkt_cnt == 0) {
b88ab5
-			/* Skip IP alignment psudo header */
b88ab5
+		/* last packet */
b88ab5
+		if (pkt_len_plus_padd == skb->len) {
b88ab5
+			skb_trim(skb, pkt_len);
b88ab5
+
b88ab5
+			/* Skip IP alignment pseudo header */
b88ab5
 			skb_pull(skb, 2);
b88ab5
-			skb->len = pkt_len;
b88ab5
-			skb_set_tail_pointer(skb, pkt_len);
b88ab5
-			skb->truesize = pkt_len + sizeof(struct sk_buff);
b88ab5
+
b88ab5
+			skb->truesize = SKB_TRUESIZE(pkt_len_plus_padd);
b88ab5
 			ax88179_rx_checksum(skb, pkt_hdr);
b88ab5
 			return 1;
b88ab5
 		}
b88ab5
 
b88ab5
 		ax_skb = skb_clone(skb, GFP_ATOMIC);
b88ab5
-		if (ax_skb) {
b88ab5
-			ax_skb->len = pkt_len;
b88ab5
-			ax_skb->data = skb->data + 2;
b88ab5
-			skb_set_tail_pointer(ax_skb, pkt_len);
b88ab5
-			ax_skb->truesize = pkt_len + sizeof(struct sk_buff);
b88ab5
-			ax88179_rx_checksum(ax_skb, pkt_hdr);
b88ab5
-			usbnet_skb_return(dev, ax_skb);
b88ab5
-		} else {
b88ab5
+		if (!ax_skb)
b88ab5
 			return 0;
b88ab5
-		}
b88ab5
+		skb_trim(ax_skb, pkt_len);
b88ab5
 
b88ab5
-		skb_pull(skb, (pkt_len + 7) & 0xFFF8);
b88ab5
-		pkt_hdr++;
b88ab5
+		/* Skip IP alignment pseudo header */
b88ab5
+		skb_pull(ax_skb, 2);
b88ab5
+
b88ab5
+		skb->truesize = pkt_len_plus_padd +
b88ab5
+				SKB_DATA_ALIGN(sizeof(struct sk_buff));
b88ab5
+		ax88179_rx_checksum(ax_skb, pkt_hdr);
b88ab5
+		usbnet_skb_return(dev, ax_skb);
b88ab5
+
b88ab5
+		skb_pull(skb, pkt_len_plus_padd);
b88ab5
 	}
b88ab5
-	return 1;
b88ab5
+
b88ab5
+	return 0;
b88ab5
 }
b88ab5
 
b88ab5
 static struct sk_buff *
b88ab5
@@ -1436,6 +1497,7 @@ ax88179_tx_fixup(struct usbnet *dev, struct sk_buff *skb, gfp_t flags)
b88ab5
 	int frame_size = dev->maxpacket;
b88ab5
 	int mss = skb_shinfo(skb)->gso_size;
b88ab5
 	int headroom;
b88ab5
+	void *ptr;
b88ab5
 
b88ab5
 	tx_hdr1 = skb->len;
b88ab5
 	tx_hdr2 = mss;
b88ab5
@@ -1450,13 +1512,9 @@ ax88179_tx_fixup(struct usbnet *dev, struct sk_buff *skb, gfp_t flags)
b88ab5
 		return NULL;
b88ab5
 	}
b88ab5
 
b88ab5
-	skb_push(skb, 4);
b88ab5
-	cpu_to_le32s(&tx_hdr2);
b88ab5
-	skb_copy_to_linear_data(skb, &tx_hdr2, 4);
b88ab5
-
b88ab5
-	skb_push(skb, 4);
b88ab5
-	cpu_to_le32s(&tx_hdr1);
b88ab5
-	skb_copy_to_linear_data(skb, &tx_hdr1, 4);
b88ab5
+	ptr = skb_push(skb, 8);
b88ab5
+	put_unaligned_le32(tx_hdr1, ptr);
b88ab5
+	put_unaligned_le32(tx_hdr2, ptr + 4);
b88ab5
 
b88ab5
 	return skb;
b88ab5
 }
b88ab5
-- 
b88ab5
2.39.0
b88ab5
b88ab5