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 |  *	0 - deliver | ||||||
|  *	1 - block |  *	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; | 		return 1; | ||||||
| 
 | 
 | ||||||
| 	type = icmp_hdr(skb)->type; | 	if (hdr->type < 32) { | ||||||
| 	if (type < 32) { |  | ||||||
| 		__u32 data = raw_sk(sk)->filter.data; | 		__u32 data = raw_sk(sk)->filter.data; | ||||||
| 
 | 
 | ||||||
| 		return ((1 << type) & data) != 0; | 		return ((1U << hdr->type) & data) != 0; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	/* Do not block unknown ICMP types */ | 	/* Do not block unknown ICMP types */ | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Eric Dumazet
				Eric Dumazet