]> git.proxmox.com Git - mirror_ubuntu-hirsute-kernel.git/commitdiff
ipv4: ipcm_cookie initializers
authorWillem de Bruijn <willemb@google.com>
Fri, 6 Jul 2018 14:12:54 +0000 (10:12 -0400)
committerDavid S. Miller <davem@davemloft.net>
Sat, 7 Jul 2018 01:58:49 +0000 (10:58 +0900)
Initialize the cookie in one location to reduce code duplication and
avoid bugs from inconsistent initialization, such as that fixed in
commit 9887cba19978 ("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>
include/net/ip.h
net/ipv4/icmp.c
net/ipv4/ip_output.c
net/ipv4/ping.c
net/ipv4/raw.c
net/ipv4/udp.c

index 99d1b835d2aaee567865ac13ed718d6a6619e12f..6db23bf1e5eb41866609720ce6ab6543d3282fb8 100644 (file)
@@ -79,6 +79,21 @@ struct ipcm_cookie {
        __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 PKTINFO_SKB_CB(skb) ((struct in_pktinfo *)((skb)->cb))
 
index 937239afd68da0fec6a83448a25f4b3677e70f57..695979b7ef6d08c2056384d90c9671efd7ae90dd 100644 (file)
@@ -429,15 +429,11 @@ static void icmp_reply(struct icmp_bxm *icmp_param, struct sk_buff *skb)
 
        icmp_param->data.icmph.checksum = 0;
 
+       ipcm_init(&ipc);
        inet->tos = ip_hdr(skb)->tos;
        sk->sk_mark = mark;
        daddr = ipc.addr = ip_hdr(skb)->saddr;
        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) {
                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);
        inet_sk(sk)->tos = tos;
        sk->sk_mark = mark;
+       ipcm_init(&ipc);
        ipc.addr = iph->saddr;
        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,
                               type, code, &icmp_param);
index 570e3ebc397457bc82a5c42c4487d34a4b7c4028..81d0e4a77ec5965eea26a9cc8daf0660005049c3 100644 (file)
@@ -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))
                return;
 
+       ipcm_init(&ipc);
        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) {
                ipc.opt = &replyopts.opt;
index b47492205507611c1a2d17dfbc52ed5e3356a9de..6f17fc8ebbdb7c96ee8d605a1747ad8d3b7797b3 100644 (file)
@@ -739,14 +739,7 @@ static int ping_v4_sendmsg(struct sock *sk, struct msghdr *msg, size_t len)
                /* no remote port */
        }
 
-       ipc.sockc.tsflags = sk->sk_tsflags;
-       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;
+       ipcm_init_sk(&ipc, inet);
 
        if (msg->msg_controllen) {
                err = ip_cmsg_send(sk, msg, &ipc, false);
index 446af7be2b5545ca0cb53e5b3ac3359935229d3f..cf142909389cd1d5317228ae7f26f47e5618e33b 100644 (file)
@@ -562,14 +562,7 @@ static int raw_sendmsg(struct sock *sk, struct msghdr *msg, size_t len)
                daddr = inet->inet_daddr;
        }
 
-       ipc.sockc.tsflags = sk->sk_tsflags;
-       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;
+       ipcm_init_sk(&ipc, inet);
 
        if (msg->msg_controllen) {
                err = ip_cmsg_send(sk, msg, &ipc, false);
index 5c76ba0666ec91df18c2340d9c6918a533b6e0c1..87f3a0b77864e2a805232ede3683938882f928d2 100644 (file)
@@ -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 */
                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;
 
        fl4 = &inet->cork.fl.u.ip4;
@@ -978,9 +972,7 @@ int udp_sendmsg(struct sock *sk, struct msghdr *msg, size_t len)
                connected = 1;
        }
 
-       ipc.sockc.tsflags = sk->sk_tsflags;
-       ipc.addr = inet->inet_saddr;
-       ipc.oif = sk->sk_bound_dev_if;
+       ipcm_init_sk(&ipc, inet);
        ipc.gso_size = up->gso_size;
 
        if (msg->msg_controllen) {