Currently, the netlink skb length only includes metadata and data
length. It doesn't include the psample generic netlink header length.
Fix it by adding it.

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);
        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;
 
-- 
2.26.2

Reply via email to