forked from mirrors/linux
		
	ipv4: ipcm_cookie initializers
Initialize the cookie in one location to reduce code duplication and
avoid bugs from inconsistent initialization, such as that fixed in
commit 9887cba199 ("ip: limit use of gso_size to udp").
Signed-off-by: Willem de Bruijn <willemb@google.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
			
			
This commit is contained in:
		
							parent
							
								
									ab8565af68
								
							
						
					
					
						commit
						351782067b
					
				
					 6 changed files with 21 additions and 39 deletions
				
			
		|  | @ -79,6 +79,21 @@ struct ipcm_cookie { | ||||||
| 	__u16			gso_size; | 	__u16			gso_size; | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
|  | static inline void ipcm_init(struct ipcm_cookie *ipcm) | ||||||
|  | { | ||||||
|  | 	*ipcm = (struct ipcm_cookie) { .tos = -1 }; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | static inline void ipcm_init_sk(struct ipcm_cookie *ipcm, | ||||||
|  | 				const struct inet_sock *inet) | ||||||
|  | { | ||||||
|  | 	ipcm_init(ipcm); | ||||||
|  | 
 | ||||||
|  | 	ipcm->sockc.tsflags = inet->sk.sk_tsflags; | ||||||
|  | 	ipcm->oif = inet->sk.sk_bound_dev_if; | ||||||
|  | 	ipcm->addr = inet->inet_saddr; | ||||||
|  | } | ||||||
|  | 
 | ||||||
| #define IPCB(skb) ((struct inet_skb_parm*)((skb)->cb)) | #define IPCB(skb) ((struct inet_skb_parm*)((skb)->cb)) | ||||||
| #define PKTINFO_SKB_CB(skb) ((struct in_pktinfo *)((skb)->cb)) | #define PKTINFO_SKB_CB(skb) ((struct in_pktinfo *)((skb)->cb)) | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -429,15 +429,11 @@ static void icmp_reply(struct icmp_bxm *icmp_param, struct sk_buff *skb) | ||||||
| 
 | 
 | ||||||
| 	icmp_param->data.icmph.checksum = 0; | 	icmp_param->data.icmph.checksum = 0; | ||||||
| 
 | 
 | ||||||
|  | 	ipcm_init(&ipc); | ||||||
| 	inet->tos = ip_hdr(skb)->tos; | 	inet->tos = ip_hdr(skb)->tos; | ||||||
| 	sk->sk_mark = mark; | 	sk->sk_mark = mark; | ||||||
| 	daddr = ipc.addr = ip_hdr(skb)->saddr; | 	daddr = ipc.addr = ip_hdr(skb)->saddr; | ||||||
| 	saddr = fib_compute_spec_dst(skb); | 	saddr = fib_compute_spec_dst(skb); | ||||||
| 	ipc.opt = NULL; |  | ||||||
| 	ipc.tx_flags = 0; |  | ||||||
| 	ipc.ttl = 0; |  | ||||||
| 	ipc.tos = -1; |  | ||||||
| 	ipc.sockc.transmit_time = 0; |  | ||||||
| 
 | 
 | ||||||
| 	if (icmp_param->replyopts.opt.opt.optlen) { | 	if (icmp_param->replyopts.opt.opt.optlen) { | ||||||
| 		ipc.opt = &icmp_param->replyopts.opt; | 		ipc.opt = &icmp_param->replyopts.opt; | ||||||
|  | @ -711,12 +707,9 @@ void icmp_send(struct sk_buff *skb_in, int type, int code, __be32 info) | ||||||
| 	icmp_param.offset = skb_network_offset(skb_in); | 	icmp_param.offset = skb_network_offset(skb_in); | ||||||
| 	inet_sk(sk)->tos = tos; | 	inet_sk(sk)->tos = tos; | ||||||
| 	sk->sk_mark = mark; | 	sk->sk_mark = mark; | ||||||
|  | 	ipcm_init(&ipc); | ||||||
| 	ipc.addr = iph->saddr; | 	ipc.addr = iph->saddr; | ||||||
| 	ipc.opt = &icmp_param.replyopts.opt; | 	ipc.opt = &icmp_param.replyopts.opt; | ||||||
| 	ipc.tx_flags = 0; |  | ||||||
| 	ipc.ttl = 0; |  | ||||||
| 	ipc.tos = -1; |  | ||||||
| 	ipc.sockc.transmit_time = 0; |  | ||||||
| 
 | 
 | ||||||
| 	rt = icmp_route_lookup(net, &fl4, skb_in, iph, saddr, tos, mark, | 	rt = icmp_route_lookup(net, &fl4, skb_in, iph, saddr, tos, mark, | ||||||
| 			       type, code, &icmp_param); | 			       type, code, &icmp_param); | ||||||
|  |  | ||||||
|  | @ -1548,12 +1548,8 @@ void ip_send_unicast_reply(struct sock *sk, struct sk_buff *skb, | ||||||
| 	if (__ip_options_echo(net, &replyopts.opt.opt, skb, sopt)) | 	if (__ip_options_echo(net, &replyopts.opt.opt, skb, sopt)) | ||||||
| 		return; | 		return; | ||||||
| 
 | 
 | ||||||
|  | 	ipcm_init(&ipc); | ||||||
| 	ipc.addr = daddr; | 	ipc.addr = daddr; | ||||||
| 	ipc.opt = NULL; |  | ||||||
| 	ipc.tx_flags = 0; |  | ||||||
| 	ipc.ttl = 0; |  | ||||||
| 	ipc.tos = -1; |  | ||||||
| 	ipc.sockc.transmit_time = 0; |  | ||||||
| 
 | 
 | ||||||
| 	if (replyopts.opt.opt.optlen) { | 	if (replyopts.opt.opt.optlen) { | ||||||
| 		ipc.opt = &replyopts.opt; | 		ipc.opt = &replyopts.opt; | ||||||
|  |  | ||||||
|  | @ -739,14 +739,7 @@ static int ping_v4_sendmsg(struct sock *sk, struct msghdr *msg, size_t len) | ||||||
| 		/* no remote port */ | 		/* no remote port */ | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	ipc.sockc.tsflags = sk->sk_tsflags; | 	ipcm_init_sk(&ipc, inet); | ||||||
| 	ipc.addr = inet->inet_saddr; |  | ||||||
| 	ipc.opt = NULL; |  | ||||||
| 	ipc.oif = sk->sk_bound_dev_if; |  | ||||||
| 	ipc.tx_flags = 0; |  | ||||||
| 	ipc.ttl = 0; |  | ||||||
| 	ipc.tos = -1; |  | ||||||
| 	ipc.sockc.transmit_time = 0; |  | ||||||
| 
 | 
 | ||||||
| 	if (msg->msg_controllen) { | 	if (msg->msg_controllen) { | ||||||
| 		err = ip_cmsg_send(sk, msg, &ipc, false); | 		err = ip_cmsg_send(sk, msg, &ipc, false); | ||||||
|  |  | ||||||
|  | @ -562,14 +562,7 @@ static int raw_sendmsg(struct sock *sk, struct msghdr *msg, size_t len) | ||||||
| 		daddr = inet->inet_daddr; | 		daddr = inet->inet_daddr; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	ipc.sockc.tsflags = sk->sk_tsflags; | 	ipcm_init_sk(&ipc, inet); | ||||||
| 	ipc.sockc.transmit_time = 0; |  | ||||||
| 	ipc.addr = inet->inet_saddr; |  | ||||||
| 	ipc.opt = NULL; |  | ||||||
| 	ipc.tx_flags = 0; |  | ||||||
| 	ipc.ttl = 0; |  | ||||||
| 	ipc.tos = -1; |  | ||||||
| 	ipc.oif = sk->sk_bound_dev_if; |  | ||||||
| 
 | 
 | ||||||
| 	if (msg->msg_controllen) { | 	if (msg->msg_controllen) { | ||||||
| 		err = ip_cmsg_send(sk, msg, &ipc, false); | 		err = ip_cmsg_send(sk, msg, &ipc, false); | ||||||
|  |  | ||||||
|  | @ -926,12 +926,6 @@ int udp_sendmsg(struct sock *sk, struct msghdr *msg, size_t len) | ||||||
| 	if (msg->msg_flags & MSG_OOB) /* Mirror BSD error message compatibility */ | 	if (msg->msg_flags & MSG_OOB) /* Mirror BSD error message compatibility */ | ||||||
| 		return -EOPNOTSUPP; | 		return -EOPNOTSUPP; | ||||||
| 
 | 
 | ||||||
| 	ipc.opt = NULL; |  | ||||||
| 	ipc.tx_flags = 0; |  | ||||||
| 	ipc.ttl = 0; |  | ||||||
| 	ipc.tos = -1; |  | ||||||
| 	ipc.sockc.transmit_time = 0; |  | ||||||
| 
 |  | ||||||
| 	getfrag = is_udplite ? udplite_getfrag : ip_generic_getfrag; | 	getfrag = is_udplite ? udplite_getfrag : ip_generic_getfrag; | ||||||
| 
 | 
 | ||||||
| 	fl4 = &inet->cork.fl.u.ip4; | 	fl4 = &inet->cork.fl.u.ip4; | ||||||
|  | @ -978,9 +972,7 @@ int udp_sendmsg(struct sock *sk, struct msghdr *msg, size_t len) | ||||||
| 		connected = 1; | 		connected = 1; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	ipc.sockc.tsflags = sk->sk_tsflags; | 	ipcm_init_sk(&ipc, inet); | ||||||
| 	ipc.addr = inet->inet_saddr; |  | ||||||
| 	ipc.oif = sk->sk_bound_dev_if; |  | ||||||
| 	ipc.gso_size = up->gso_size; | 	ipc.gso_size = up->gso_size; | ||||||
| 
 | 
 | ||||||
| 	if (msg->msg_controllen) { | 	if (msg->msg_controllen) { | ||||||
|  |  | ||||||
		Loading…
	
		Reference in a new issue
	
	 Willem de Bruijn
						Willem de Bruijn