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

Reply via email to