int len, err;
struct lapbethdev *lapbeth;
+ if ((skb = skb_share_check(skb, GFP_ATOMIC)) == NULL)
+ return NET_RX_DROP;
+
if (!pskb_may_pull(skb, 2))
goto drop;
struct sock *sk;
struct ec_device *edev = dev->ec_ptr;
- if (!edev) {
- kfree_skb(skb);
- return 0;
- }
+ if (skb->pkt_type == PACKET_OTHERHOST)
+ goto drop;
- if (!pskb_may_pull(skb, sizeof(struct ec_framehdr))) {
- /* Frame is too small to be any use */
- kfree_skb(skb);
- return 0;
- }
+ if (!edev)
+ goto drop;
+
+ if ((skb = skb_share_check(skb, GFP_ATOMIC)) == NULL)
+ return NET_RX_DROP;
+
+ if (!pskb_may_pull(skb, sizeof(struct ec_framehdr)))
+ goto drop;
hdr = (struct ec_framehdr *) skb->data;
}
sk = ec_listening_socket(hdr->port, hdr->src_stn, hdr->src_net);
- if (!sk) {
- kfree_skb(skb);
- return 0;
- }
+ if (!sk)
+ goto drop;
return ec_queue_packet(sk, skb, edev->net, hdr->src_stn, hdr->cb,
hdr->port);
+
+drop:
+ kfree_skb(skb);
+ return 0;
}
static struct packet_type econet_packet_type = {
unsigned char *sha, *tha; /* s for "source", t for "target" */
struct ic_device *d;
+ if ((skb = skb_share_check(skb, GFP_ATOMIC)) == NULL)
+ return NET_RX_DROP;
+
if (!pskb_may_pull(skb, sizeof(arphdr)))
goto drop;
if (skb->pkt_type == PACKET_OTHERHOST)
goto drop;
+ if ((skb = skb_share_check(skb, GFP_ATOMIC)) == NULL)
+ return NET_RX_DROP;
+
if (!pskb_may_pull(skb,
sizeof(struct iphdr) +
sizeof(struct udphdr)))