ipv6: ipcm6_cookie initializer
authorWillem de Bruijn <willemb@google.com>
Fri, 6 Jul 2018 14:12:55 +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/ipv6.h
net/ipv6/icmp.c
net/ipv6/ping.c
net/ipv6/raw.c
net/ipv6/udp.c
net/l2tp/l2tp_ip6.c

index b7843e0b16ee5f180b12410317d36639545b6c19..6cb247f54d4c70f264f352ed2d5b0bb3e31f95f5 100644 (file)
@@ -301,6 +301,25 @@ struct ipcm6_cookie {
        __u16 gso_size;
 };
 
+static inline void ipcm6_init(struct ipcm6_cookie *ipc6)
+{
+       *ipc6 = (struct ipcm6_cookie) {
+               .hlimit = -1,
+               .tclass = -1,
+               .dontfrag = -1,
+       };
+}
+
+static inline void ipcm6_init_sk(struct ipcm6_cookie *ipc6,
+                                const struct ipv6_pinfo *np)
+{
+       *ipc6 = (struct ipcm6_cookie) {
+               .hlimit = -1,
+               .tclass = np->tclass,
+               .dontfrag = np->dontfrag,
+       };
+}
+
 static inline struct ipv6_txoptions *txopt_get(const struct ipv6_pinfo *np)
 {
        struct ipv6_txoptions *opt;
index be491bf6ab6e9ff4d1a9d84bc78c4582f4fe8e01..d99fed67cd10aa2dc3ce9e9b69d8c526b4411ca3 100644 (file)
@@ -545,7 +545,7 @@ static void icmp6_send(struct sk_buff *skb, u8 type, u8 code, __u32 info,
        else if (!fl6.flowi6_oif)
                fl6.flowi6_oif = np->ucast_oif;
 
-       ipc6.tclass = np->tclass;
+       ipcm6_init_sk(&ipc6, np);
        fl6.flowlabel = ip6_make_flowinfo(ipc6.tclass, fl6.flowlabel);
 
        dst = icmpv6_route_lookup(net, skb, sk, &fl6);
@@ -553,8 +553,6 @@ static void icmp6_send(struct sk_buff *skb, u8 type, u8 code, __u32 info,
                goto out;
 
        ipc6.hlimit = ip6_sk_dst_hoplimit(np, &fl6, dst);
-       ipc6.dontfrag = np->dontfrag;
-       ipc6.opt = NULL;
 
        msg.skb = skb;
        msg.offset = skb_network_offset(skb);
@@ -726,10 +724,9 @@ static void icmpv6_echo_reply(struct sk_buff *skb)
        msg.offset = 0;
        msg.type = ICMPV6_ECHO_REPLY;
 
+       ipcm6_init_sk(&ipc6, np);
        ipc6.hlimit = ip6_sk_dst_hoplimit(np, &fl6, dst);
        ipc6.tclass = ipv6_get_dsfield(ipv6_hdr(skb));
-       ipc6.dontfrag = np->dontfrag;
-       ipc6.opt = NULL;
 
        if (ip6_append_data(sk, icmpv6_getfrag, &msg,
                            skb->len + sizeof(struct icmp6hdr),
index 96f56bf49a30533ae693f11de286ff310a9fe356..717e7c1fba297c9b509ce04d5a26fba9e5364913 100644 (file)
@@ -119,7 +119,7 @@ static int ping_v6_sendmsg(struct sock *sk, struct msghdr *msg, size_t len)
        fl6.fl6_icmp_code = user_icmph.icmp6_code;
        security_sk_classify_flow(sk, flowi6_to_flowi(&fl6));
 
-       ipc6.tclass = np->tclass;
+       ipcm6_init_sk(&ipc6, np);
        fl6.flowlabel = ip6_make_flowinfo(ipc6.tclass, fl6.flowlabel);
 
        dst = ip6_sk_dst_lookup_flow(sk, &fl6, daddr, false);
@@ -142,8 +142,6 @@ static int ping_v6_sendmsg(struct sock *sk, struct msghdr *msg, size_t len)
        pfh.family = AF_INET6;
 
        ipc6.hlimit = ip6_sk_dst_hoplimit(np, &fl6, dst);
-       ipc6.dontfrag = np->dontfrag;
-       ipc6.opt = NULL;
 
        lock_sock(sk);
        err = ip6_append_data(sk, ping_getfrag, &pfh, len,
index 5737c50f16eb26a91467ae4900af64142f451c49..5f40670271eed4d8b43a49dd4e1dfe8fe453654c 100644 (file)
@@ -791,10 +791,7 @@ static int rawv6_sendmsg(struct sock *sk, struct msghdr *msg, size_t len)
        fl6.flowi6_mark = sk->sk_mark;
        fl6.flowi6_uid = sk->sk_uid;
 
-       ipc6.hlimit = -1;
-       ipc6.tclass = -1;
-       ipc6.dontfrag = -1;
-       ipc6.opt = NULL;
+       ipcm6_init(&ipc6);
 
        if (sin6) {
                if (addr_len < SIN6_LEN_RFC2133)
index ac6fc6728903715e993d5e99165e7c4ae2fcc7c9..940115da9843837936492b8d09e1a803b58dca4d 100644 (file)
@@ -1143,9 +1143,7 @@ int udpv6_sendmsg(struct sock *sk, struct msghdr *msg, size_t len)
        int (*getfrag)(void *, char *, int, int, int, struct sk_buff *);
        struct sockcm_cookie sockc;
 
-       ipc6.hlimit = -1;
-       ipc6.tclass = -1;
-       ipc6.dontfrag = -1;
+       ipcm6_init(&ipc6);
        ipc6.gso_size = up->gso_size;
        sockc.tsflags = sk->sk_tsflags;
        sockc.transmit_time = 0;
index 957369192ca181d6da21c9dda03d0e8a9726643e..38f80691f4aba8f28022fe1d866ac35dc2fcb6c6 100644 (file)
@@ -525,9 +525,7 @@ static int l2tp_ip6_sendmsg(struct sock *sk, struct msghdr *msg, size_t len)
        fl6.flowi6_mark = sk->sk_mark;
        fl6.flowi6_uid = sk->sk_uid;
 
-       ipc6.hlimit = -1;
-       ipc6.tclass = -1;
-       ipc6.dontfrag = -1;
+       ipcm6_init(&ipc6);
 
        if (lsa) {
                if (addr_len < SIN6_LEN_RFC2133)