Go to:
Gentoo Home
Documentation
Forums
Lists
Bugs
Planet
Store
Wiki
Get Gentoo!
Gentoo's Bugzilla – Attachment 210811 Details for
Bug 293378
>=sys-kernel/gentoo-source-2.6.30 <sys-kernel/git-source-2.6.30-r6 WARNING: at net/ipv4/af_inet.c:153 inet_sock_destruct+0x161/0x17c()
Home
|
New
–
[Ex]
|
Browse
|
Search
|
Privacy Policy
|
[?]
|
Reports
|
Requests
|
Help
|
New Account
|
Log In
[x]
|
Forgot Password
Login:
[x]
[patch]
backported patch from repository
2000_sk-forward-alloc-corruption-fix.patch (text/plain), 4.14 KB, created by
Mike Pagano
on 2009-11-21 19:54:41 UTC
(
hide
)
Description:
backported patch from repository
Filename:
MIME Type:
Creator:
Mike Pagano
Created:
2009-11-21 19:54:41 UTC
Size:
4.14 KB
patch
obsolete
>From: Eric Dumazet <eric.dumazet@gmail.com> >Date: Fri, 30 Oct 2009 05:03:53 +0000 (+0000) >Subject: net: fix sk_forward_alloc corruption >X-Git-Tag: v2.6.32-rc6~9^2~3 >X-Git-Url: http://git.kernel.org/?p=linux%2Fkernel%2Fgit%2Fnext%2Flinux-next.git;a=commitdiff_plain;h=9d410c796067686b1e032d54ce475b7055537138 > >net: fix sk_forward_alloc corruption > >On UDP sockets, we must call skb_free_datagram() with socket locked, >or risk sk_forward_alloc corruption. This requirement is not respected >in SUNRPC. > >Add a convenient helper, skb_free_datagram_locked() and use it in SUNRPC > >Reported-by: Francis Moreau <francis.moro@gmail.com> >Signed-off-by: Eric Dumazet <eric.dumazet@gmail.com> >Signed-off-by: David S. Miller <davem@davemloft.net> >--- > >diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h >index 6aebfce..bcdd660 100644 >--- a/include/linux/skbuff.h >+++ b/include/linux/skbuff.h >@@ -1757,6 +1757,8 @@ extern int skb_copy_datagram_const_iovec(const struct sk_buff *from, > int to_offset, > int size); > extern void skb_free_datagram(struct sock *sk, struct sk_buff *skb); >+extern void skb_free_datagram_locked(struct sock *sk, >+ struct sk_buff *skb); > extern int skb_kill_datagram(struct sock *sk, struct sk_buff *skb, > unsigned int flags); > extern __wsum skb_checksum(const struct sk_buff *skb, int offset, >diff --git a/net/core/datagram.c b/net/core/datagram.c >index 1c6cf3a..4ade301 100644 >--- a/net/core/datagram.c >+++ b/net/core/datagram.c >@@ -224,6 +224,15 @@ void skb_free_datagram(struct sock *sk, struct sk_buff *skb) > consume_skb(skb); > sk_mem_reclaim_partial(sk); > } >+EXPORT_SYMBOL(skb_free_datagram); >+ >+void skb_free_datagram_locked(struct sock *sk, struct sk_buff *skb) >+{ >+ lock_sock(sk); >+ skb_free_datagram(sk, skb); >+ release_sock(sk); >+} >+EXPORT_SYMBOL(skb_free_datagram_locked); > > /** > * skb_kill_datagram - Free a datagram skbuff forcibly >@@ -752,5 +761,4 @@ unsigned int datagram_poll(struct file *file, struct socket *sock, > EXPORT_SYMBOL(datagram_poll); > EXPORT_SYMBOL(skb_copy_and_csum_datagram_iovec); > EXPORT_SYMBOL(skb_copy_datagram_iovec); >-EXPORT_SYMBOL(skb_free_datagram); > EXPORT_SYMBOL(skb_recv_datagram); >diff --git a/net/ipv4/udp.c b/net/ipv4/udp.c >index d0d436d..0fa9f70 100644 >--- a/net/ipv4/udp.c >+++ b/net/ipv4/udp.c >@@ -999,9 +999,7 @@ try_again: > err = ulen; > > out_free: >- lock_sock(sk); >- skb_free_datagram(sk, skb); >- release_sock(sk); >+ skb_free_datagram_locked(sk, skb); > out: > return err; > >diff --git a/net/ipv6/udp.c b/net/ipv6/udp.c >index 3a60f12..cf538ed 100644 >--- a/net/ipv6/udp.c >+++ b/net/ipv6/udp.c >@@ -288,9 +288,7 @@ try_again: > err = ulen; > > out_free: >- lock_sock(sk); >- skb_free_datagram(sk, skb); >- release_sock(sk); >+ skb_free_datagram_locked(sk, skb); > out: > return err; > >--- a/net/sunrpc/svcsock.c 2009-11-21 14:18:47.000000000 -0500 >+++ b/net/sunrpc/svcsock.c 2009-11-21 14:23:18.000000000 -0500 >@@ -110,7 +110,7 @@ static void svc_release_skb(struct svc_r > rqstp->rq_xprt_ctxt = NULL; > > dprintk("svc: service %p, releasing skb %p\n", rqstp, skb); >- skb_free_datagram(svsk->sk_sk, skb); >+ skb_free_datagram_locked(svsk->sk_sk, skb); > } > } > >@@ -537,7 +537,7 @@ static int svc_udp_recvfrom(struct svc_r > printk("rpcsvc: received unknown control message:" > "%d/%d\n", > cmh->cmsg_level, cmh->cmsg_type); >- skb_free_datagram(svsk->sk_sk, skb); >+ skb_free_datagram_locked(svsk->sk_sk, skb); > return 0; > } > svc_udp_get_dest_address(rqstp, cmh); >@@ -548,18 +548,18 @@ static int svc_udp_recvfrom(struct svc_r > if (csum_partial_copy_to_xdr(&rqstp->rq_arg, skb)) { > local_bh_enable(); > /* checksum error */ >- skb_free_datagram(svsk->sk_sk, skb); >+ skb_free_datagram_locked(svsk->sk_sk, skb); > return 0; > } > local_bh_enable(); >- skb_free_datagram(svsk->sk_sk, skb); >+ skb_free_datagram_locked(svsk->sk_sk, skb); > } else { > /* we can use it in-place */ > rqstp->rq_arg.head[0].iov_base = skb->data + > sizeof(struct udphdr); > rqstp->rq_arg.head[0].iov_len = len; > if (skb_checksum_complete(skb)) { >- skb_free_datagram(svsk->sk_sk, skb); >+ skb_free_datagram_locked(svsk->sk_sk, skb); > return 0; > } > rqstp->rq_xprt_ctxt = skb;
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Diff
Attachments on
bug 293378
:
210565
| 210811