On Wed,  3 Feb 2021 11:10:28 +0800 Chris Mi wrote:
> Currently, the netlink skb length only includes metadata and data
> length. It doesn't include the psample generic netlink header length.

But what's the bug? Did you see oversized messages on the socket? Did
one of the nla_put() fail?

> Fixes: 6ae0a6286171 ("net: Introduce psample, a new genetlink channel for 
> packet sampling")
> CC: Yotam Gigi <yotam...@gmail.com>
> Reviewed-by: Ido Schimmel <ido...@nvidia.com>
> Signed-off-by: Chris Mi <c...@nvidia.com>
> ---
>  net/psample/psample.c | 10 ++++++----
>  1 file changed, 6 insertions(+), 4 deletions(-)
> 
> diff --git a/net/psample/psample.c b/net/psample/psample.c
> index 33e238c965bd..807d75f5a40f 100644
> --- a/net/psample/psample.c
> +++ b/net/psample/psample.c
> @@ -363,6 +363,7 @@ void psample_sample_packet(struct psample_group *group, 
> struct sk_buff *skb,
>       struct ip_tunnel_info *tun_info;
>  #endif
>       struct sk_buff *nl_skb;
> +     int header_len;
>       int data_len;
>       int meta_len;
>       void *data;
> @@ -381,12 +382,13 @@ void psample_sample_packet(struct psample_group *group, 
> struct sk_buff *skb,
>               meta_len += psample_tunnel_meta_len(tun_info);
>  #endif
>  
> +     /* psample generic netlink header size */
> +     header_len = nlmsg_total_size(GENL_HDRLEN + psample_nl_family.hdrsize);

GENL_HDRLEN is already included by genlmsg_new() and fam->hdrsize is 0
/ uninitialized for psample_nl_family. What am I missing? Ido?

>       data_len = min(skb->len, trunc_size);
> -     if (meta_len + nla_total_size(data_len) > PSAMPLE_MAX_PACKET_SIZE)
> -             data_len = PSAMPLE_MAX_PACKET_SIZE - meta_len - NLA_HDRLEN
> +     if (header_len + meta_len + nla_total_size(data_len) > 
> PSAMPLE_MAX_PACKET_SIZE)
> +             data_len = PSAMPLE_MAX_PACKET_SIZE - header_len - meta_len - 
> NLA_HDRLEN
>                           - NLA_ALIGNTO;
> -
> -     nl_skb = genlmsg_new(meta_len + nla_total_size(data_len), GFP_ATOMIC);
> +     nl_skb = genlmsg_new(header_len + meta_len + nla_total_size(data_len), 
> GFP_ATOMIC);
>       if (unlikely(!nl_skb))
>               return;
>  

Reply via email to