X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=net%2Fbridge%2Fnetfilter%2Febt_arpreply.c;h=b934de90f7c52e08806a0459296d8ad33b189265;hb=c7b5ebbddf7bcd3651947760f423e3783bbe6573;hp=87ba30dd090f7700d5f0919e08c025df9c4f7e70;hpb=5273a3df6485dc2ad6aa7ddd441b9a21970f003b;p=linux-2.6.git diff --git a/net/bridge/netfilter/ebt_arpreply.c b/net/bridge/netfilter/ebt_arpreply.c index 87ba30dd0..b934de90f 100644 --- a/net/bridge/netfilter/ebt_arpreply.c +++ b/net/bridge/netfilter/ebt_arpreply.c @@ -20,30 +20,38 @@ static int ebt_target_reply(struct sk_buff **pskb, unsigned int hooknr, const void *data, unsigned int datalen) { struct ebt_arpreply_info *info = (struct ebt_arpreply_info *)data; - u32 sip, dip; - struct arphdr ah; - unsigned char sha[ETH_ALEN]; + u32 _sip, *siptr, _dip, *diptr; + struct arphdr _ah, *ap; + unsigned char _sha[ETH_ALEN], *shp; struct sk_buff *skb = *pskb; - if (skb_copy_bits(skb, 0, &ah, sizeof(ah))) + ap = skb_header_pointer(skb, 0, sizeof(_ah), &_ah); + if (ap == NULL) return EBT_DROP; - if (ah.ar_op != __constant_htons(ARPOP_REQUEST) || ah.ar_hln != ETH_ALEN - || ah.ar_pro != __constant_htons(ETH_P_IP) || ah.ar_pln != 4) + if (ap->ar_op != htons(ARPOP_REQUEST) || + ap->ar_hln != ETH_ALEN || + ap->ar_pro != htons(ETH_P_IP) || + ap->ar_pln != 4) return EBT_CONTINUE; - if (skb_copy_bits(skb, sizeof(ah), &sha, ETH_ALEN)) + shp = skb_header_pointer(skb, sizeof(_ah), ETH_ALEN, &_sha); + if (shp == NULL) return EBT_DROP; - if (skb_copy_bits(skb, sizeof(ah) + ETH_ALEN, &sip, sizeof(sip))) + siptr = skb_header_pointer(skb, sizeof(_ah) + ETH_ALEN, + sizeof(_sip), &_sip); + if (siptr == NULL) return EBT_DROP; - if (skb_copy_bits(skb, sizeof(ah) + 2 * ETH_ALEN + sizeof(sip), - &dip, sizeof(dip))) + diptr = skb_header_pointer(skb, + sizeof(_ah) + 2 * ETH_ALEN + sizeof(_sip), + sizeof(_dip), &_dip); + if (diptr == NULL) return EBT_DROP; - arp_send(ARPOP_REPLY, ETH_P_ARP, sip, (struct net_device *)in, - dip, sha, info->mac, sha); + arp_send(ARPOP_REPLY, ETH_P_ARP, *siptr, (struct net_device *)in, + *diptr, shp, info->mac, shp); return info->target; } @@ -57,7 +65,7 @@ static int ebt_target_reply_check(const char *tablename, unsigned int hookmask, return -EINVAL; if (BASE_CHAIN && info->target == EBT_RETURN) return -EINVAL; - if (e->ethproto != __constant_htons(ETH_P_ARP) || + if (e->ethproto != htons(ETH_P_ARP) || e->invflags & EBT_IPROTO) return -EINVAL; CLEAR_BASE_CHAIN_BIT;