mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: Greg KH <gregkh@suse.de>
To: linux-kernel@vger.kernel.org, stable@vger.kernel.org
Cc: stable-review@kernel.org, torvalds@linux-foundation.org,
	akpm@linux-foundation.org, alan@lxorguk.ukuu.org.uk,
	davem@davemloft.net, eric.dumazet@gmail.com,
	Jason Wang <jasowang@redhat.com>
Subject: [32/38] ipv6: fix NULL dereference in udp6_ufo_fragment()
Date: Tue, 11 Oct 2011 10:55:42 -0600	[thread overview]
Message-ID: <20111011165713.233109819@pistachio.kroah.org> (raw)
In-Reply-To: <20111011165903.GA30976@kroah.com>

3.0-stable review patch.  If anyone has any objections, please let us know.

------------------

From: Jason Wang <jasowang@redhat.com>

This patch fixes the issue caused by ef81bb40bf15f350fe865f31fa42f1082772a576
which is a backport of upstream 87c48fa3b4630905f98268dde838ee43626a060c. The
problem does not exist in upstream.

We do not check whether route is attached before trying to assign ip
identification through route dest which lead NULL pointer dereference. This
happens when host bridge transmit a packet from guest.

This patch changes ipv6_select_ident() to accept in6_addr as its paramter and
fix the issue by using the destination address in ipv6 header when no route is
attached.

Signed-off-by: Jason Wang <jasowang@redhat.com>
Acked-by: David S. Miller <davem@davemloft.net>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
---
 include/net/ipv6.h    |    2 +-
 net/ipv6/ip6_output.c |   10 +++++-----
 net/ipv6/udp.c        |    4 +++-
 3 files changed, 9 insertions(+), 7 deletions(-)

--- a/include/net/ipv6.h
+++ b/include/net/ipv6.h
@@ -463,7 +463,7 @@ static inline int ipv6_addr_diff(const s
 	return __ipv6_addr_diff(a1, a2, sizeof(struct in6_addr));
 }
 
-extern void ipv6_select_ident(struct frag_hdr *fhdr, struct rt6_info *rt);
+extern void ipv6_select_ident(struct frag_hdr *fhdr, struct in6_addr *addr);
 
 /*
  *	Prototypes exported by ipv6
--- a/net/ipv6/ip6_output.c
+++ b/net/ipv6/ip6_output.c
@@ -620,9 +620,9 @@ static u32 __ipv6_select_ident(const str
 	return hash + newid;
 }
 
-void ipv6_select_ident(struct frag_hdr *fhdr, struct rt6_info *rt)
+void ipv6_select_ident(struct frag_hdr *fhdr, struct in6_addr *addr)
 {
-	fhdr->identification = htonl(__ipv6_select_ident(&rt->rt6i_dst.addr));
+	fhdr->identification = htonl(__ipv6_select_ident(addr));
 }
 
 int ip6_fragment(struct sk_buff *skb, int (*output)(struct sk_buff *))
@@ -709,7 +709,7 @@ int ip6_fragment(struct sk_buff *skb, in
 		skb_reset_network_header(skb);
 		memcpy(skb_network_header(skb), tmp_hdr, hlen);
 
-		ipv6_select_ident(fh, rt);
+		ipv6_select_ident(fh, &rt->rt6i_dst.addr);
 		fh->nexthdr = nexthdr;
 		fh->reserved = 0;
 		fh->frag_off = htons(IP6_MF);
@@ -855,7 +855,7 @@ slow_path:
 		fh->nexthdr = nexthdr;
 		fh->reserved = 0;
 		if (!frag_id) {
-			ipv6_select_ident(fh, rt);
+			ipv6_select_ident(fh, &rt->rt6i_dst.addr);
 			frag_id = fh->identification;
 		} else
 			fh->identification = frag_id;
@@ -1146,7 +1146,7 @@ static inline int ip6_ufo_append_data(st
 		skb_shinfo(skb)->gso_size = (mtu - fragheaderlen -
 					     sizeof(struct frag_hdr)) & ~7;
 		skb_shinfo(skb)->gso_type = SKB_GSO_UDP;
-		ipv6_select_ident(&fhdr, rt);
+		ipv6_select_ident(&fhdr, &rt->rt6i_dst.addr);
 		skb_shinfo(skb)->ip6_frag_id = fhdr.identification;
 		__skb_queue_tail(&sk->sk_write_queue, skb);
 
--- a/net/ipv6/udp.c
+++ b/net/ipv6/udp.c
@@ -1309,6 +1309,7 @@ static struct sk_buff *udp6_ufo_fragment
 	u8 frag_hdr_sz = sizeof(struct frag_hdr);
 	int offset;
 	__wsum csum;
+	struct rt6_info *rt = (struct rt6_info *)skb_dst(skb);
 
 	mss = skb_shinfo(skb)->gso_size;
 	if (unlikely(skb->len <= mss))
@@ -1359,7 +1360,8 @@ static struct sk_buff *udp6_ufo_fragment
 	fptr = (struct frag_hdr *)(skb_network_header(skb) + unfrag_ip6hlen);
 	fptr->nexthdr = nexthdr;
 	fptr->reserved = 0;
-	ipv6_select_ident(fptr, (struct rt6_info *)skb_dst(skb));
+	ipv6_select_ident(fptr,
+			  rt ? &rt->rt6i_dst.addr : &ipv6_hdr(skb)->daddr);
 
 	/* Fragment the skb. ipv6 header and the remaining fields of the
 	 * fragment header are updated in ipv6_gso_segment()



  parent reply	other threads:[~2011-10-11 17:06 UTC|newest]

Thread overview: 51+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-10-11 16:59 [00/38] 3.0.7-stable review Greg KH
2011-10-11 16:55 ` [01/38] PCI: Set PCI-E Max Payload Size on fabric Greg KH
2011-10-11 17:20   ` Benjamin LaHaise
2011-10-11 18:14     ` Bjorn Helgaas
2011-10-11 19:24       ` Greg KH
2011-10-11 19:47         ` Bjorn Helgaas
2011-10-11 19:56           ` Greg KH
2011-10-11 20:03             ` Benjamin LaHaise
2011-10-11 21:31               ` Greg KH
2011-10-11 20:22             ` Bjorn Helgaas
2011-10-11 21:32               ` Greg KH
2011-10-11 16:55 ` [02/38] PCI: export pcie_bus_configure_settings symbol Greg KH
2011-10-11 16:55 ` [03/38] PCI: Remove MRRS modification from MPS setting code Greg KH
2011-10-11 16:55 ` [04/38] pci: Dont crash when reading mpss from root complex Greg KH
2011-10-11 16:55 ` [05/38] Fix pointer dereference before call to pcie_bus_configure_settings Greg KH
2011-10-11 16:55 ` [06/38] PCI: Disable MPS configuration by default Greg KH
2011-10-11 16:55 ` [07/38] sparc64: Force the execute bit in OpenFirmwares translation entries Greg KH
2011-10-11 16:55 ` [08/38] sched/rt: Migrate equal priority tasks to available CPUs Greg KH
2011-10-11 16:55 ` [09/38] sched: Fix up wchan borkage Greg KH
2011-10-11 16:55 ` [10/38] ide-disk: Fix request requeuing Greg KH
2011-10-11 16:55 ` [11/38] posix-cpu-timers: Cure SMP wobbles Greg KH
2011-10-11 16:55 ` [12/38] lis3: fix regression of HP DriveGuard with 8bit chip Greg KH
2011-10-11 16:55 ` [13/38] ASoC: use a valid device for dev_err() in Zylonite Greg KH
2011-10-11 16:55 ` [14/38] ASoC: Fix setting update bits for WM8753_LADC and WM8753_RADC Greg KH
2011-10-11 16:55 ` [15/38] drm/radeon: Update AVIVO cursor coordinate origin before x/yorigin calculation Greg KH
2011-10-11 16:55 ` [16/38] drm/radeon/kms: Fix logic error in DP HPD handler Greg KH
2011-10-11 16:55 ` [17/38] drm/radeon/kms: fix regression in DP aux defer handling Greg KH
2011-10-11 16:55 ` [18/38] drm/radeon/kms: add retry limits for native DP aux defer Greg KH
2011-10-11 16:55 ` [19/38] drm/radeon/kms: fix channel_remap setup (v2) Greg KH
2011-10-11 16:55 ` [20/38] ptp: fix L2 event message recognition Greg KH
2011-10-11 16:55 ` [21/38] rt2x00: Serialize TX operations on a queue Greg KH
2011-10-11 16:55 ` [22/38] x86/PCI: use host bridge _CRS info on ASUS M2V-MX SE Greg KH
2011-10-11 16:55 ` [23/38] [SCSI] qla2xxx: Fix crash in qla2x00_abort_all_cmds() on unload Greg KH
2011-10-11 16:55 ` [24/38] [SCSI] libsas: fix panic when single phy is disabled on a wide port Greg KH
2011-10-11 16:55 ` [25/38] md: Avoid waking up a thread after it has been freed Greg KH
2011-10-11 16:55 ` [26/38] dm table: avoid crash if integrity profile changes Greg KH
2011-10-11 16:55 ` [27/38] mmc: mxs-mmc: fix clock rate setting Greg KH
2011-10-11 16:55 ` [28/38] exec: do not call request_module() twice from search_binary_handler() Greg KH
2011-10-11 16:55 ` [29/38] ARM: mach-ux500: enable fix for ARM errata 754322 Greg KH
2011-10-11 16:55 ` [30/38] drm/radeon/kms: retry aux transactions if there are status flags Greg KH
2011-10-11 16:55 ` [31/38] drm/radeon/kms: use hardcoded dig encoder to transmitter mapping for DCE4.1 Greg KH
2011-10-11 16:55 ` Greg KH [this message]
2011-10-11 16:55 ` [33/38] ahci: Enable SB600 64bit DMA on Asus M3A Greg KH
2011-10-11 16:55 ` [34/38] MIPS: PM: Use struct syscore_ops instead of sysdevs for PM (v2) Greg KH
2011-10-11 16:55 ` [35/38] ftrace: Fix regression of :mod:module function enabling Greg KH
2011-10-11 16:55 ` [36/38] ftrace: Fix regression where ftrace breaks when modules are loaded Greg KH
2011-10-11 16:55 ` [37/38] ftrace: Fix warning when CONFIG_FUNCTION_TRACER is not defined Greg KH
2011-10-11 16:55 ` [38/38] e1000e: workaround for packet drop on 82579 at 100Mbps Greg KH
2011-10-11 17:00 ` [00/38] 3.0.7-stable review Greg KH
2011-10-17 15:05   ` Conny Seidel
2011-10-17 15:21     ` Greg KH

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20111011165713.233109819@pistachio.kroah.org \
    --to=gregkh@suse.de \
    --cc=akpm@linux-foundation.org \
    --cc=alan@lxorguk.ukuu.org.uk \
    --cc=davem@davemloft.net \
    --cc=eric.dumazet@gmail.com \
    --cc=jasowang@redhat.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=stable-review@kernel.org \
    --cc=stable@vger.kernel.org \
    --cc=torvalds@linux-foundation.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

all inboxes | Powered by JetHome®