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: 6d6148bc78
("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>
This commit is contained in:
parent
34b85adad8
commit
5d93518e06
1 changed files with 11 additions and 6 deletions
|
@ -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);
|
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_port *port, u8 proto_version)
|
struct hsr_frame_info *frame,
|
||||||
|
struct hsr_port *port, u8 proto_version)
|
||||||
{
|
{
|
||||||
struct hsr_ethhdr *hsr_ethhdr;
|
struct hsr_ethhdr *hsr_ethhdr;
|
||||||
int lane_id;
|
int lane_id;
|
||||||
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,
|
||||||
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,
|
||||||
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
|
||||||
|
|
Loading…
Reference in a new issue