Linux v4.8-rc4-119-ge4e98c4
This commit is contained in:
		
							parent
							
								
									aaaae68f00
								
							
						
					
					
						commit
						a5b5f8c65c
					
				| @ -1,73 +0,0 @@ | ||||
| From 9f30f83eb6347afa6b1d1df1065608c2b4485e2b Mon Sep 17 00:00:00 2001 | ||||
| From: Eric Dumazet <edumazet@google.com> | ||||
| Date: Tue, 23 Aug 2016 13:59:33 -0700 | ||||
| Subject: [PATCH] udp: fix poll() issue with zero sized packets | ||||
| 
 | ||||
| Laura tracked poll() [and friends] regression caused by commit | ||||
| e6afc8ace6dd ("udp: remove headers from UDP packets before queueing") | ||||
| 
 | ||||
| udp_poll() needs to know if there is a valid packet in receive queue, | ||||
| even if its payload length is 0. | ||||
| 
 | ||||
| Change first_packet_length() to return an signed int, and use -1 | ||||
| as the indication of an empty queue. | ||||
| 
 | ||||
| Fixes: e6afc8ace6dd ("udp: remove headers from UDP packets before queueing") | ||||
| Reported-by: Laura Abbott <labbott@redhat.com> | ||||
| Signed-off-by: Eric Dumazet <edumazet@google.com> | ||||
| Tested-by: Laura Abbott <labbott@redhat.com> | ||||
| ---
 | ||||
|  net/ipv4/udp.c | 12 ++++++------ | ||||
|  1 file changed, 6 insertions(+), 6 deletions(-) | ||||
| 
 | ||||
| diff --git a/net/ipv4/udp.c b/net/ipv4/udp.c
 | ||||
| index e61f7cd..00d18c5 100644
 | ||||
| --- a/net/ipv4/udp.c
 | ||||
| +++ b/net/ipv4/udp.c
 | ||||
| @@ -1182,13 +1182,13 @@ out:
 | ||||
|   *	@sk: socket | ||||
|   * | ||||
|   *	Drops all bad checksum frames, until a valid one is found. | ||||
| - *	Returns the length of found skb, or 0 if none is found.
 | ||||
| + *	Returns the length of found skb, or -1 if none is found.
 | ||||
|   */ | ||||
| -static unsigned int first_packet_length(struct sock *sk)
 | ||||
| +static int first_packet_length(struct sock *sk)
 | ||||
|  { | ||||
|  	struct sk_buff_head list_kill, *rcvq = &sk->sk_receive_queue; | ||||
|  	struct sk_buff *skb; | ||||
| -	unsigned int res;
 | ||||
| +	int res;
 | ||||
|   | ||||
|  	__skb_queue_head_init(&list_kill); | ||||
|   | ||||
| @@ -1203,7 +1203,7 @@ static unsigned int first_packet_length(struct sock *sk)
 | ||||
|  		__skb_unlink(skb, rcvq); | ||||
|  		__skb_queue_tail(&list_kill, skb); | ||||
|  	} | ||||
| -	res = skb ? skb->len : 0;
 | ||||
| +	res = skb ? skb->len : -1;
 | ||||
|  	spin_unlock_bh(&rcvq->lock); | ||||
|   | ||||
|  	if (!skb_queue_empty(&list_kill)) { | ||||
| @@ -1232,7 +1232,7 @@ int udp_ioctl(struct sock *sk, int cmd, unsigned long arg)
 | ||||
|   | ||||
|  	case SIOCINQ: | ||||
|  	{ | ||||
| -		unsigned int amount = first_packet_length(sk);
 | ||||
| +		int amount = max_t(int, 0, first_packet_length(sk));
 | ||||
|   | ||||
|  		return put_user(amount, (int __user *)arg); | ||||
|  	} | ||||
| @@ -2184,7 +2184,7 @@ unsigned int udp_poll(struct file *file, struct socket *sock, poll_table *wait)
 | ||||
|   | ||||
|  	/* Check for false positives due to checksum errors */ | ||||
|  	if ((mask & POLLRDNORM) && !(file->f_flags & O_NONBLOCK) && | ||||
| -	    !(sk->sk_shutdown & RCV_SHUTDOWN) && !first_packet_length(sk))
 | ||||
| +	    !(sk->sk_shutdown & RCV_SHUTDOWN) && first_packet_length(sk) == -1)
 | ||||
|  		mask &= ~(POLLIN | POLLRDNORM); | ||||
|   | ||||
|  	return mask; | ||||
| -- 
 | ||||
| 2.7.4 | ||||
| 
 | ||||
							
								
								
									
										2
									
								
								gitrev
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								gitrev
									
									
									
									
									
								
							| @ -1 +1 @@ | ||||
| 3eab887a55424fc2c27553b7bfe32330df83f7b8 | ||||
| e4e98c460ad38c78498622a164fd5ef09a2dc9cb | ||||
|  | ||||
							
								
								
									
										13
									
								
								kernel.spec
									
									
									
									
									
								
							
							
						
						
									
										13
									
								
								kernel.spec
									
									
									
									
									
								
							| @ -42,7 +42,7 @@ Summary: The Linux kernel | ||||
| # For non-released -rc kernels, this will be appended after the rcX and | ||||
| # gitX tags, so a 3 here would become part of release "0.rcX.gitX.3" | ||||
| # | ||||
| %global baserelease 2 | ||||
| %global baserelease 1 | ||||
| %global fedora_build %{baserelease} | ||||
| 
 | ||||
| # base_sublevel is the kernel version we're starting with and patching | ||||
| @ -69,7 +69,7 @@ Summary: The Linux kernel | ||||
| # The rc snapshot level | ||||
| %define rcrev 4 | ||||
| # The git snapshot level | ||||
| %define gitrev 0 | ||||
| %define gitrev 1 | ||||
| # Set rpm version accordingly | ||||
| %define rpmversion 4.%{upstream_sublevel}.0 | ||||
| %endif | ||||
| @ -605,12 +605,6 @@ Patch665: netfilter-x_tables-deal-with-bogus-nextoffset-values.patch | ||||
| #rhbz 1200901 (There should be something better upstream at some point) | ||||
| Patch842: qxl-reapply-cursor-after-SetCrtc-calls.patch | ||||
| 
 | ||||
| #CVE-2016-6828 rhbz 1367091,1367092 | ||||
| Patch843: tcp-fix-use-after-free-in-tcp_xmit_retransmit_queue.patch | ||||
| 
 | ||||
| #rhbz 1365940 | ||||
| Patch844: 0001-udp-fix-poll-issue-with-zero-sized-packets.patch | ||||
| 
 | ||||
| # From kernel list, currently in linux-next | ||||
| Patch845: HID-microsoft-Add-Surface-4-type-cover-pro-4-JP.patch | ||||
| 
 | ||||
| @ -2156,6 +2150,9 @@ fi | ||||
| # | ||||
| # | ||||
| %changelog | ||||
| * Tue Aug 30 2016 Justin M. Forbes <jforbes@fedoraproject.org> - 4.8.0-0.rc4.git1.1 | ||||
| - Linux v4.8-rc4-119-ge4e98c4 | ||||
| 
 | ||||
| * Mon Aug 29 2016 Laura Abbott <labbott@fedoraproject.org> | ||||
| - Add event decoding fix (rhbz 1360688) | ||||
| 
 | ||||
|  | ||||
							
								
								
									
										1
									
								
								sources
									
									
									
									
									
								
							
							
						
						
									
										1
									
								
								sources
									
									
									
									
									
								
							| @ -1,3 +1,4 @@ | ||||
| 5276563eb1f39a048e4a8a887408c031  linux-4.7.tar.xz | ||||
| fe259c02c75eec61d1aa4b1211f3c853  perf-man-4.7.tar.gz | ||||
| a0c0753ff460ff35ef9908ecc97fa943  patch-4.8-rc4.xz | ||||
| 885fc3f5570fd07d2742dd75cb0c0aea  patch-4.8-rc4-git1.xz | ||||
|  | ||||
| @ -1,46 +0,0 @@ | ||||
| From: Eric Dumazet <edumazet@google.com> | ||||
| Date: 2016-08-17 12:56:26 | ||||
| Subject: [PATCH net] tcp: fix use after free in tcp_xmit_retransmit_queue() | ||||
| 
 | ||||
| When tcp_sendmsg() allocates a fresh and empty skb, it puts it at the | ||||
| tail of the write queue using tcp_add_write_queue_tail() | ||||
| 
 | ||||
| Then it attempts to copy user data into this fresh skb. | ||||
| 
 | ||||
| If the copy fails, we undo the work and remove the fresh skb. | ||||
| 
 | ||||
| Unfortunately, this undo lacks the change done to tp->highest_sack and | ||||
| we can leave a dangling pointer (to a freed skb) | ||||
| 
 | ||||
| Later, tcp_xmit_retransmit_queue() can dereference this pointer and | ||||
| access freed memory. For regular kernels where memory is not unmapped, | ||||
| this might cause SACK bugs because tcp_highest_sack_seq() is buggy, | ||||
| returning garbage instead of tp->snd_nxt, but with various debug | ||||
| features like CONFIG_DEBUG_PAGEALLOC, this can crash the kernel. | ||||
| 
 | ||||
| This bug was found by Marco Grassi thanks to syzkaller. | ||||
| 
 | ||||
| Fixes: 6859d49475d4 ("[TCP]: Abstract tp->highest_sack accessing & point to next skb") | ||||
| Reported-by: Marco Grassi <marco.gra@gmail.com> | ||||
| Signed-off-by: Eric Dumazet <edumazet@google.com> | ||||
| Cc: Ilpo Järvinen <ilpo.jarvinen@helsinki.fi> | ||||
| Cc: Yuchung Cheng <ycheng@google.com> | ||||
| Cc: Neal Cardwell <ncardwell@google.com> | ||||
| ---
 | ||||
|  include/net/tcp.h |    2 ++ | ||||
|  1 file changed, 2 insertions(+) | ||||
| 
 | ||||
| diff --git a/include/net/tcp.h b/include/net/tcp.h
 | ||||
| index c00e7d51bb18..7717302cab91 100644
 | ||||
| --- a/include/net/tcp.h
 | ||||
| +++ b/include/net/tcp.h
 | ||||
| @@ -1523,6 +1523,8 @@ static inline void tcp_check_send_head(struct sock *sk, struct sk_buff *skb_unli
 | ||||
|  { | ||||
|  	if (sk->sk_send_head == skb_unlinked) | ||||
|  		sk->sk_send_head = NULL; | ||||
| +	if (tcp_sk(sk)->highest_sack == skb_unlinked)
 | ||||
| +		tcp_sk(sk)->highest_sack = NULL;
 | ||||
|  } | ||||
|   | ||||
|  static inline void tcp_init_send_head(struct sock *sk) | ||||
| 
 | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user