ipv4: raw: fix icmp_filter()
icmp_filter() should not modify its input, or else its caller would need to recompute ip_hdr() if skb->head is reallocated. Use skb_header_pointer() instead of pskb_may_pull() and change the prototype to make clear both sk and skb are const. Signed-off-by: Eric Dumazet <edumazet@google.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
		
					parent
					
						
							
								9913b8c8f0
							
						
					
				
			
			
				commit
				
					
						ab43ed8b74
					
				
			
		
					 1 changed files with 8 additions and 6 deletions
				
			
		|  | @ -131,18 +131,20 @@ found: | |||
|  *	0 - deliver | ||||
|  *	1 - block | ||||
|  */ | ||||
| static __inline__ int icmp_filter(struct sock *sk, struct sk_buff *skb) | ||||
| static int icmp_filter(const struct sock *sk, const struct sk_buff *skb) | ||||
| { | ||||
| 	int type; | ||||
| 	struct icmphdr _hdr; | ||||
| 	const struct icmphdr *hdr; | ||||
| 
 | ||||
| 	if (!pskb_may_pull(skb, sizeof(struct icmphdr))) | ||||
| 	hdr = skb_header_pointer(skb, skb_transport_offset(skb), | ||||
| 				 sizeof(_hdr), &_hdr); | ||||
| 	if (!hdr) | ||||
| 		return 1; | ||||
| 
 | ||||
| 	type = icmp_hdr(skb)->type; | ||||
| 	if (type < 32) { | ||||
| 	if (hdr->type < 32) { | ||||
| 		__u32 data = raw_sk(sk)->filter.data; | ||||
| 
 | ||||
| 		return ((1 << type) & data) != 0; | ||||
| 		return ((1U << hdr->type) & data) != 0; | ||||
| 	} | ||||
| 
 | ||||
| 	/* Do not block unknown ICMP types */ | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Eric Dumazet
				Eric Dumazet