net: hsr: check for return value of skb_put_padto()
authorMurali Karicheri <m-karicheri2@ti.com>
Mon, 20 Jul 2020 16:43:27 +0000 (12:43 -0400)
committerDavid S. Miller <davem@davemloft.net>
Tue, 21 Jul 2020 01:02:28 +0000 (18:02 -0700)
skb_put_padto() can fail. So check for return type and return NULL
for skb. Caller checks for skb and acts correctly if it is NULL.

Fixes: 6d6148bc78d2 ("net: hsr: fix incorrect lsdu size in the tag of HSR frames for small frames")
Signed-off-by: Murali Karicheri <m-karicheri2@ti.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/hsr/hsr_forward.c

index e42fd356f07355c7b90e8ed4c55ebaae0f4bda31..1ea17752fffc9b6d502b4997bcf97bb7d20fbab0 100644 (file)
@@ -120,15 +120,17 @@ static struct sk_buff *frame_get_stripped_skb(struct hsr_frame_info *frame,
        return skb_clone(frame->skb_std, GFP_ATOMIC);
 }
 
-static void hsr_fill_tag(struct sk_buff *skb, struct hsr_frame_info *frame,
-                        struct hsr_port *port, u8 proto_version)
+static struct sk_buff *hsr_fill_tag(struct sk_buff *skb,
+                                   struct hsr_frame_info *frame,
+                                   struct hsr_port *port, u8 proto_version)
 {
        struct hsr_ethhdr *hsr_ethhdr;
        int lane_id;
        int lsdu_size;
 
        /* pad to minimum packet size which is 60 + 6 (HSR tag) */
-       skb_put_padto(skb, ETH_ZLEN + HSR_HLEN);
+       if (skb_put_padto(skb, ETH_ZLEN + HSR_HLEN))
+               return NULL;
 
        if (port->type == HSR_PT_SLAVE_A)
                lane_id = 0;
@@ -147,6 +149,8 @@ static void hsr_fill_tag(struct sk_buff *skb, struct hsr_frame_info *frame,
        hsr_ethhdr->hsr_tag.encap_proto = hsr_ethhdr->ethhdr.h_proto;
        hsr_ethhdr->ethhdr.h_proto = htons(proto_version ?
                        ETH_P_HSR : ETH_P_PRP);
+
+       return skb;
 }
 
 static struct sk_buff *create_tagged_skb(struct sk_buff *skb_o,
@@ -175,9 +179,10 @@ static struct sk_buff *create_tagged_skb(struct sk_buff *skb_o,
        memmove(dst, src, movelen);
        skb_reset_mac_header(skb);
 
-       hsr_fill_tag(skb, frame, port, port->hsr->prot_version);
-
-       return skb;
+       /* skb_put_padto free skb on error and hsr_fill_tag returns NULL in
+        * that case
+        */
+       return hsr_fill_tag(skb, frame, port, port->hsr->prot_version);
 }
 
 /* If the original frame was an HSR tagged frame, just clone it to be sent