2017-08-31, 09:59:39 -0700, Ivan Delalande wrote: > diff --git a/net/ipv4/tcp_diag.c b/net/ipv4/tcp_diag.c > index a748c74aa8b7..abbf0edcf6c2 100644 > --- a/net/ipv4/tcp_diag.c > +++ b/net/ipv4/tcp_diag.c [...] > +static int tcp_diag_get_aux(struct sock *sk, bool net_admin, > + struct sk_buff *skb) > +{ > +#ifdef CONFIG_TCP_MD5SIG > + if (net_admin) {
In tcp_diag_get_aux_size() you put a check for sk_fullsock. I don't see anything preventing you from reaching this with a !fullsock? > + struct tcp_md5sig_info *md5sig; > + int err = 0; > + > + rcu_read_lock(); > + md5sig = rcu_dereference(tcp_sk(sk)->md5sig_info); > + if (md5sig) > + err = tcp_diag_put_md5sig(skb, md5sig); > + rcu_read_unlock(); > + if (err < 0) > + return err; > + } > +#endif > + > + return 0; > +} > + > +static size_t tcp_diag_get_aux_size(struct sock *sk, bool net_admin) > +{ > + size_t size = 0; > + > +#ifdef CONFIG_TCP_MD5SIG > + if (net_admin && sk_fullsock(sk)) { > + const struct tcp_md5sig_info *md5sig; > + const struct tcp_md5sig_key *key; > + size_t md5sig_count = 0; > + > + rcu_read_lock(); > + md5sig = rcu_dereference(tcp_sk(sk)->md5sig_info); > + if (md5sig) { > + hlist_for_each_entry_rcu(key, &md5sig->head, node) > + md5sig_count++; > + } > + rcu_read_unlock(); > + size += nla_total_size(md5sig_count * > + sizeof(struct tcp_diag_md5sig)); > + } > +#endif > + > + return size; > +} > + > static void tcp_diag_dump(struct sk_buff *skb, struct netlink_callback *cb, > const struct inet_diag_req_v2 *r, struct nlattr *bc) > { -- Sabrina