From: Greg KH <gregkh@suse.de>
To: linux-kernel@vger.kernel.org, stable@kernel.org
Cc: Justin Forbes <jmforbes@linuxtx.org>,
Zwane Mwaikambo <zwane@arm.linux.org.uk>,
"Theodore Ts'o" <tytso@mit.edu>,
Randy Dunlap <rdunlap@xenotime.net>,
Dave Jones <davej@redhat.com>,
Chuck Wolber <chuckw@quantumlinux.com>,
Chris Wedgwood <reviews@ml.cw.f00f.org>,
Michael Krufky <mkrufky@linuxtv.org>,
Chuck Ebbert <cebbert@redhat.com>,
Domenico Andreoli <cavokz@gmail.com>, Willy Tarreau <w@1wt.eu>,
Rodrigo Rubira Branco <rbranco@la.checkpoint.com>,
Jake Edge <jake@lwn.net>, Eugene Teo <eteo@redhat.com>,
torvalds@linux-foundation.org, akpm@linux-foundation.org,
alan@lxorguk.ukuu.org.uk,
Herbert Xu <herbert@gondor.apana.org.au>,
"David S. Miller" <davem@davemloft.net>
Subject: [patch 30/48] ipv6: Copy cork options in ip6_append_data
Date: Fri, 13 Feb 2009 17:13:20 -0800 [thread overview]
Message-ID: <20090214011320.GE17706@kroah.com> (raw)
In-Reply-To: <20090214011208.GA17706@kroah.com>
[-- Attachment #1: ipv6-copy-cork-options-in-ip6_append_data.patch --]
[-- Type: text/plain, Size: 3601 bytes --]
2.6.28-stable review patch. If anyone has any objections, please let us know.
------------------
From: Herbert Xu <herbert@gondor.apana.org.au>
[ Upstream commit 0178b695fd6b40a62a215cbeb03dd51ada3bb5e0 ]
As the options passed to ip6_append_data may be ephemeral, we need
to duplicate it for corking. This patch applies the simplest fix
which is to memdup all the relevant bits.
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Signed-off-by: David S. Miller <davem@davemloft.net>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
---
net/ipv6/ip6_output.c | 67 ++++++++++++++++++++++++++++++++++++++------------
1 file changed, 52 insertions(+), 15 deletions(-)
--- a/net/ipv6/ip6_output.c
+++ b/net/ipv6/ip6_output.c
@@ -1104,6 +1104,18 @@ static inline int ip6_ufo_append_data(st
return err;
}
+static inline struct ipv6_opt_hdr *ip6_opt_dup(struct ipv6_opt_hdr *src,
+ gfp_t gfp)
+{
+ return src ? kmemdup(src, (src->hdrlen + 1) * 8, gfp) : NULL;
+}
+
+static inline struct ipv6_rt_hdr *ip6_rthdr_dup(struct ipv6_rt_hdr *src,
+ gfp_t gfp)
+{
+ return src ? kmemdup(src, (src->hdrlen + 1) * 8, gfp) : NULL;
+}
+
int ip6_append_data(struct sock *sk, int getfrag(void *from, char *to,
int offset, int len, int odd, struct sk_buff *skb),
void *from, int length, int transhdrlen,
@@ -1129,17 +1141,37 @@ int ip6_append_data(struct sock *sk, int
* setup for corking
*/
if (opt) {
- if (np->cork.opt == NULL) {
- np->cork.opt = kmalloc(opt->tot_len,
- sk->sk_allocation);
- if (unlikely(np->cork.opt == NULL))
- return -ENOBUFS;
- } else if (np->cork.opt->tot_len < opt->tot_len) {
- printk(KERN_DEBUG "ip6_append_data: invalid option length\n");
+ if (WARN_ON(np->cork.opt))
return -EINVAL;
- }
- memcpy(np->cork.opt, opt, opt->tot_len);
- inet->cork.flags |= IPCORK_OPT;
+
+ np->cork.opt = kmalloc(opt->tot_len, sk->sk_allocation);
+ if (unlikely(np->cork.opt == NULL))
+ return -ENOBUFS;
+
+ np->cork.opt->tot_len = opt->tot_len;
+ np->cork.opt->opt_flen = opt->opt_flen;
+ np->cork.opt->opt_nflen = opt->opt_nflen;
+
+ np->cork.opt->dst0opt = ip6_opt_dup(opt->dst0opt,
+ sk->sk_allocation);
+ if (opt->dst0opt && !np->cork.opt->dst0opt)
+ return -ENOBUFS;
+
+ np->cork.opt->dst1opt = ip6_opt_dup(opt->dst1opt,
+ sk->sk_allocation);
+ if (opt->dst1opt && !np->cork.opt->dst1opt)
+ return -ENOBUFS;
+
+ np->cork.opt->hopopt = ip6_opt_dup(opt->hopopt,
+ sk->sk_allocation);
+ if (opt->hopopt && !np->cork.opt->hopopt)
+ return -ENOBUFS;
+
+ np->cork.opt->srcrt = ip6_rthdr_dup(opt->srcrt,
+ sk->sk_allocation);
+ if (opt->srcrt && !np->cork.opt->srcrt)
+ return -ENOBUFS;
+
/* need source address above miyazawa*/
}
dst_hold(&rt->u.dst);
@@ -1166,8 +1198,7 @@ int ip6_append_data(struct sock *sk, int
} else {
rt = (struct rt6_info *)inet->cork.dst;
fl = &inet->cork.fl;
- if (inet->cork.flags & IPCORK_OPT)
- opt = np->cork.opt;
+ opt = np->cork.opt;
transhdrlen = 0;
exthdrlen = 0;
mtu = inet->cork.fragsize;
@@ -1406,9 +1437,15 @@ error:
static void ip6_cork_release(struct inet_sock *inet, struct ipv6_pinfo *np)
{
- inet->cork.flags &= ~IPCORK_OPT;
- kfree(np->cork.opt);
- np->cork.opt = NULL;
+ if (np->cork.opt) {
+ kfree(np->cork.opt->dst0opt);
+ kfree(np->cork.opt->dst1opt);
+ kfree(np->cork.opt->hopopt);
+ kfree(np->cork.opt->srcrt);
+ kfree(np->cork.opt);
+ np->cork.opt = NULL;
+ }
+
if (inet->cork.dst) {
dst_release(inet->cork.dst);
inet->cork.dst = NULL;
next prev parent reply other threads:[~2009-02-14 1:40 UTC|newest]
Thread overview: 49+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <20090214010805.419403436@mini.kroah.org>
2009-02-14 1:12 ` [patch 00/48] 2.6.28.6-stable review Greg KH
2009-02-14 1:12 ` [patch 01/48] x86, vmi: put a missing paravirt_release_pmd in pgd_dtor Greg KH
2009-02-14 1:12 ` [patch 02/48] nbd: fix I/O hang on disconnected nbds Greg KH
2009-02-14 1:12 ` [patch 03/48] mac80211: restrict to AP in outgoing interface heuristic Greg KH
2009-02-14 1:12 ` [patch 04/48] w1: w1 temp calculation overflow fix Greg KH
2009-02-14 1:12 ` [patch 05/48] zd1211rw: adding 0ace:0xa211 as a ZD1211 device Greg KH
2009-02-14 1:12 ` [patch 06/48] zd1211rw: treat MAXIM_NEW_RF(0x08) as UW2453_RF(0x09) for TP-Link WN322/422G Greg KH
2009-02-14 1:12 ` [patch 07/48] parport: parport_serial, dont bind netmos ibm 0299 Greg KH
2009-02-14 1:12 ` [patch 08/48] syscall define: fix uml compile bug Greg KH
2009-02-14 1:12 ` [patch 09/48] kernel-doc: fix syscall wrapper processing Greg KH
2009-02-14 1:12 ` [patch 10/48] Fix page writeback thinko, causing Berkeley DB slowdown Greg KH
2009-02-14 1:12 ` [patch 11/48] write-back: fix nr_to_write counter Greg KH
2009-02-14 1:12 ` [patch 12/48] writeback: fix break condition Greg KH
2009-02-14 1:12 ` [patch 13/48] mm: rearrange exit_mmap() to unlock before arch_exit_mmap Greg KH
2009-02-14 1:12 ` [patch 14/48] powerpc/fsl-booke: Fix mapping functions to use phys_addr_t Greg KH
2009-02-14 1:12 ` [patch 15/48] lockd: fix regression in lockds handling of blocked locks Greg KH
2009-02-14 1:12 ` [patch 16/48] sctp: Fix crc32c calculations on big-endian arhes Greg KH
2009-02-14 1:12 ` [patch 17/48] sctp: Correctly start rtx timer on new packet transmissions Greg KH
2009-02-14 1:12 ` [patch 18/48] sctp: Properly timestamp outgoing data chunks for rtx purposes Greg KH
2009-02-14 1:12 ` [patch 19/48] net: Fix frag_list handling in skb_seq_read Greg KH
2009-02-14 1:13 ` [patch 20/48] net: Fix OOPS in skb_seq_read() Greg KH
2009-02-14 1:13 ` [patch 21/48] drivers/net/skfp: if !capable(CAP_NET_ADMIN): inverted logic Greg KH
2009-02-14 1:13 ` [patch 22/48] ipv4: fix infinite retry loop in IP-Config Greg KH
2009-02-14 1:13 ` [patch 23/48] net: Fix userland breakage wrt. linux/if_tunnel.h Greg KH
2009-02-14 1:13 ` [patch 24/48] net: packet socket packet_lookup_frame fix Greg KH
2009-02-14 1:13 ` [patch 25/48] packet: Avoid lock_sock in mmap handler Greg KH
2009-02-14 1:13 ` [patch 26/48] sungem: Soft lockup in sungem on Netra AC200 when switching interface up Greg KH
2009-02-14 1:13 ` [patch 27/48] udp: Fix UDP short packet false positive Greg KH
2009-02-14 1:13 ` [patch 28/48] udp: increments sk_drops in __udp_queue_rcv_skb() Greg KH
2009-02-14 1:13 ` [patch 29/48] ipv6: Disallow rediculious flowlabel option sizes Greg KH
2009-02-14 1:13 ` Greg KH [this message]
2009-02-14 1:13 ` [patch 32/48] sky2: fix hard hang with netconsoling and iface going up Greg KH
2009-02-14 1:13 ` [patch 33/48] tun: Add some missing TUN compat ioctl translations Greg KH
2009-02-14 1:13 ` [patch 34/48] tun: Fix unicast filter overflow Greg KH
2009-02-14 1:13 ` [patch 35/48] virtio_net: Fix MAX_PACKET_LEN to support 802.1Q VLANs Greg KH
2009-02-14 1:13 ` [patch 36/48] tcp: splice as many packets as possible at once Greg KH
2009-02-14 1:13 ` [patch 37/48] tcp: Fix length tcp_splice_data_recv passes to skb_splice_bits Greg KH
2009-02-14 1:13 ` [patch 31/48] net: 4 bytes kernel memory disclosure in SO_BSDCOMPAT gsopt try #2 Greg KH
2009-02-14 1:13 ` [patch 38/48] sparc: Enable syscall wrappers for 64-bit (CVE-2009-0029) Greg KH
2009-02-14 1:13 ` [patch 39/48] sparc64: Annotate sparc64 specific syscalls with SYSCALL_DEFINEx() Greg KH
2009-02-14 1:13 ` [patch 40/48] ALSA: hda - Add missing terminator in slave dig-out array Greg KH
2009-02-14 1:13 ` [patch 41/48] ALSA: mtpav - Fix initial value for input hwport Greg KH
2009-02-14 1:13 ` [patch 42/48] HID: adjust report descriptor fixup for MS 1028 receiver Greg KH
2009-02-14 1:13 ` [patch 43/48] ide/libata: fix ata_id_is_cfa() (take 4) Greg KH
2009-02-14 1:13 ` [patch 44/48] libata: fix EH device failure handling Greg KH
2009-02-14 1:13 ` [patch 45/48] netfilter: fix tuple inversion for Node information request Greg KH
2009-02-14 1:13 ` [patch 46/48] netfilter: xt_sctp: sctp chunk mapping doesnt work Greg KH
2009-02-14 1:13 ` [patch 47/48] x86: microcode_amd: fix wrong handling of equivalent CPU id Greg KH
2009-02-14 1:13 ` [patch 48/48] ide-cd: fix DMA for non bio-backed requests 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=20090214011320.GE17706@kroah.com \
--to=gregkh@suse.de \
--cc=akpm@linux-foundation.org \
--cc=alan@lxorguk.ukuu.org.uk \
--cc=cavokz@gmail.com \
--cc=cebbert@redhat.com \
--cc=chuckw@quantumlinux.com \
--cc=davej@redhat.com \
--cc=davem@davemloft.net \
--cc=eteo@redhat.com \
--cc=herbert@gondor.apana.org.au \
--cc=jake@lwn.net \
--cc=jmforbes@linuxtx.org \
--cc=linux-kernel@vger.kernel.org \
--cc=mkrufky@linuxtv.org \
--cc=rbranco@la.checkpoint.com \
--cc=rdunlap@xenotime.net \
--cc=reviews@ml.cw.f00f.org \
--cc=stable@kernel.org \
--cc=torvalds@linux-foundation.org \
--cc=tytso@mit.edu \
--cc=w@1wt.eu \
--cc=zwane@arm.linux.org.uk \
/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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.