diff options
author | Dan Carpenter <dan.carpenter@oracle.com> | 2017-09-09 04:58:03 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2017-09-09 17:33:27 -0400 |
commit | 1f4f554a72be0d8c164c2f5bc6ba939a1c624fb4 (patch) | |
tree | 4805767bc7adc50a31c1469ab62b2dd1085f1be3 | |
parent | ad9a19d003703ae06a6e8efc64cf26a939d9e84d (diff) |
net: qualcomm: rmnet: Fix a double free
There is a typo here so we accidentally free "skb" instead of "skbn".
It leads to a double free and a leak. After discussing with Subash,
it's better to just move the check before the allocation and avoid the
need to free.
Fixes: ceed73a2cf4a ("drivers: net: ethernet: qualcomm: rmnet: Initial implementation")
Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com>
Acked-by: Subash Abhinov Kasiviswanathan <subashab@codeaurora.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r-- | drivers/net/ethernet/qualcomm/rmnet/rmnet_map_data.c | 10 |
1 files changed, 4 insertions, 6 deletions
diff --git a/drivers/net/ethernet/qualcomm/rmnet/rmnet_map_data.c b/drivers/net/ethernet/qualcomm/rmnet/rmnet_map_data.c index 557c9bf1a469..86b8c758f94e 100644 --- a/drivers/net/ethernet/qualcomm/rmnet/rmnet_map_data.c +++ b/drivers/net/ethernet/qualcomm/rmnet/rmnet_map_data.c | |||
@@ -84,6 +84,10 @@ struct sk_buff *rmnet_map_deaggregate(struct sk_buff *skb) | |||
84 | if (((int)skb->len - (int)packet_len) < 0) | 84 | if (((int)skb->len - (int)packet_len) < 0) |
85 | return NULL; | 85 | return NULL; |
86 | 86 | ||
87 | /* Some hardware can send us empty frames. Catch them */ | ||
88 | if (ntohs(maph->pkt_len) == 0) | ||
89 | return NULL; | ||
90 | |||
87 | skbn = alloc_skb(packet_len + RMNET_MAP_DEAGGR_SPACING, GFP_ATOMIC); | 91 | skbn = alloc_skb(packet_len + RMNET_MAP_DEAGGR_SPACING, GFP_ATOMIC); |
88 | if (!skbn) | 92 | if (!skbn) |
89 | return NULL; | 93 | return NULL; |
@@ -94,11 +98,5 @@ struct sk_buff *rmnet_map_deaggregate(struct sk_buff *skb) | |||
94 | memcpy(skbn->data, skb->data, packet_len); | 98 | memcpy(skbn->data, skb->data, packet_len); |
95 | skb_pull(skb, packet_len); | 99 | skb_pull(skb, packet_len); |
96 | 100 | ||
97 | /* Some hardware can send us empty frames. Catch them */ | ||
98 | if (ntohs(maph->pkt_len) == 0) { | ||
99 | kfree_skb(skb); | ||
100 | return NULL; | ||
101 | } | ||
102 | |||
103 | return skbn; | 101 | return skbn; |
104 | } | 102 | } |