diff options
author | Andrew Lunn <andrew@lunn.ch> | 2010-02-19 10:18:09 -0500 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@suse.de> | 2010-03-03 19:43:03 -0500 |
commit | 8d03847c090b12694fb9fa81dbefa7b3e4f10f1d (patch) | |
tree | 1229d196df517d43eebe75c99fb4fdf5a57ebd40 | |
parent | 837b8248f6206a6b08b3d6defe2946282e432679 (diff) |
Staging: batman-adv: Fix skbuff leak in VIS code.
The vis code takes a copy of the data inside the skbuf if it is interesting
for us, so we always need to release the skbuf.
Reported-by: Linus Luessing <linus.luessing@web.de>
Signed-off-by: Andrew Lunn <andrew@lunn.ch>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
-rw-r--r-- | drivers/staging/batman-adv/routing.c | 9 |
1 files changed, 4 insertions, 5 deletions
diff --git a/drivers/staging/batman-adv/routing.c b/drivers/staging/batman-adv/routing.c index 7dc9aef9bef4..d89048beebe1 100644 --- a/drivers/staging/batman-adv/routing.c +++ b/drivers/staging/batman-adv/routing.c | |||
@@ -939,7 +939,6 @@ int recv_vis_packet(struct sk_buff *skb) | |||
939 | struct vis_packet *vis_packet; | 939 | struct vis_packet *vis_packet; |
940 | struct ethhdr *ethhdr; | 940 | struct ethhdr *ethhdr; |
941 | int hdr_size = sizeof(struct vis_packet); | 941 | int hdr_size = sizeof(struct vis_packet); |
942 | int ret; | ||
943 | 942 | ||
944 | if (skb_headlen(skb) < hdr_size) | 943 | if (skb_headlen(skb) < hdr_size) |
945 | return NET_RX_DROP; | 944 | return NET_RX_DROP; |
@@ -962,18 +961,18 @@ int recv_vis_packet(struct sk_buff *skb) | |||
962 | case VIS_TYPE_SERVER_SYNC: | 961 | case VIS_TYPE_SERVER_SYNC: |
963 | /* TODO: handle fragmented skbs properly */ | 962 | /* TODO: handle fragmented skbs properly */ |
964 | receive_server_sync_packet(vis_packet, skb_headlen(skb)); | 963 | receive_server_sync_packet(vis_packet, skb_headlen(skb)); |
965 | ret = NET_RX_SUCCESS; | ||
966 | break; | 964 | break; |
967 | 965 | ||
968 | case VIS_TYPE_CLIENT_UPDATE: | 966 | case VIS_TYPE_CLIENT_UPDATE: |
969 | /* TODO: handle fragmented skbs properly */ | 967 | /* TODO: handle fragmented skbs properly */ |
970 | receive_client_update_packet(vis_packet, skb_headlen(skb)); | 968 | receive_client_update_packet(vis_packet, skb_headlen(skb)); |
971 | ret = NET_RX_SUCCESS; | ||
972 | break; | 969 | break; |
973 | 970 | ||
974 | default: /* ignore unknown packet */ | 971 | default: /* ignore unknown packet */ |
975 | ret = NET_RX_DROP; | ||
976 | break; | 972 | break; |
977 | } | 973 | } |
978 | return ret; | 974 | |
975 | /* We take a copy of the data in the packet, so we should | ||
976 | always free the skbuf. */ | ||
977 | return NET_RX_DROP; | ||
979 | } | 978 | } |