Commit 5d93518e authored by Murali Karicheri's avatar Murali Karicheri Committed by David S. Miller

net: hsr: check for return value of skb_put_padto()

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: 6d6148bc ("net: hsr: fix incorrect lsdu size in the tag of HSR frames for small frames")
Signed-off-by: default avatarMurali Karicheri <m-karicheri2@ti.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 34b85ada
...@@ -120,7 +120,8 @@ static struct sk_buff *frame_get_stripped_skb(struct hsr_frame_info *frame, ...@@ -120,7 +120,8 @@ static struct sk_buff *frame_get_stripped_skb(struct hsr_frame_info *frame,
return skb_clone(frame->skb_std, GFP_ATOMIC); return skb_clone(frame->skb_std, GFP_ATOMIC);
} }
static void hsr_fill_tag(struct sk_buff *skb, struct hsr_frame_info *frame, 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_port *port, u8 proto_version)
{ {
struct hsr_ethhdr *hsr_ethhdr; struct hsr_ethhdr *hsr_ethhdr;
...@@ -128,7 +129,8 @@ static void hsr_fill_tag(struct sk_buff *skb, struct hsr_frame_info *frame, ...@@ -128,7 +129,8 @@ static void hsr_fill_tag(struct sk_buff *skb, struct hsr_frame_info *frame,
int lsdu_size; int lsdu_size;
/* pad to minimum packet size which is 60 + 6 (HSR tag) */ /* 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) if (port->type == HSR_PT_SLAVE_A)
lane_id = 0; lane_id = 0;
...@@ -147,6 +149,8 @@ static void hsr_fill_tag(struct sk_buff *skb, struct hsr_frame_info *frame, ...@@ -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->hsr_tag.encap_proto = hsr_ethhdr->ethhdr.h_proto;
hsr_ethhdr->ethhdr.h_proto = htons(proto_version ? hsr_ethhdr->ethhdr.h_proto = htons(proto_version ?
ETH_P_HSR : ETH_P_PRP); ETH_P_HSR : ETH_P_PRP);
return skb;
} }
static struct sk_buff *create_tagged_skb(struct sk_buff *skb_o, 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, ...@@ -175,9 +179,10 @@ static struct sk_buff *create_tagged_skb(struct sk_buff *skb_o,
memmove(dst, src, movelen); memmove(dst, src, movelen);
skb_reset_mac_header(skb); skb_reset_mac_header(skb);
hsr_fill_tag(skb, frame, port, port->hsr->prot_version); /* skb_put_padto free skb on error and hsr_fill_tag returns NULL in
* that case
return skb; */
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 /* If the original frame was an HSR tagged frame, just clone it to be sent
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment