Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

netfilter: ebtables: add ebt_get_target and ebt_get_target_c

ebt_get_target similar to {ip/ip6/arp}t_get_target.
and ebt_get_target_c similar to {ip/ip6/arp}t_get_target_c.

Signed-off-by: Taehee Yoo <ap420073@gmail.com>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>

authored by

Taehee Yoo and committed by
Pablo Neira Ayuso
a1d768f1 4351bef0

+19 -9
+6
include/uapi/linux/netfilter_bridge/ebtables.h
··· 191 191 unsigned char elems[0] __attribute__ ((aligned (__alignof__(struct ebt_replace)))); 192 192 }; 193 193 194 + static __inline__ struct ebt_entry_target * 195 + ebt_get_target(struct ebt_entry *e) 196 + { 197 + return (void *)e + e->target_offset; 198 + } 199 + 194 200 /* {g,s}etsockopt numbers */ 195 201 #define EBT_BASE_CTL 128 196 202
+13 -9
net/bridge/netfilter/ebtables.c
··· 177 177 return (void *)entry + entry->next_offset; 178 178 } 179 179 180 + static inline const struct ebt_entry_target * 181 + ebt_get_target_c(const struct ebt_entry *e) 182 + { 183 + return ebt_get_target((struct ebt_entry *)e); 184 + } 185 + 180 186 /* Do some firewalling */ 181 187 unsigned int ebt_do_table(struct sk_buff *skb, 182 188 const struct nf_hook_state *state, ··· 236 230 */ 237 231 EBT_WATCHER_ITERATE(point, ebt_do_watcher, skb, &acpar); 238 232 239 - t = (struct ebt_entry_target *) 240 - (((char *)point) + point->target_offset); 233 + t = ebt_get_target_c(point); 241 234 /* standard target */ 242 235 if (!t->u.target->target) 243 236 verdict = ((struct ebt_standard_target *)t)->verdict; ··· 642 637 return 1; 643 638 EBT_WATCHER_ITERATE(e, ebt_cleanup_watcher, net, NULL); 644 639 EBT_MATCH_ITERATE(e, ebt_cleanup_match, net, NULL); 645 - t = (struct ebt_entry_target *)(((char *)e) + e->target_offset); 640 + t = ebt_get_target(e); 646 641 647 642 par.net = net; 648 643 par.target = t->u.target; ··· 721 716 ret = EBT_WATCHER_ITERATE(e, ebt_check_watcher, &tgpar, &j); 722 717 if (ret != 0) 723 718 goto cleanup_watchers; 724 - t = (struct ebt_entry_target *)(((char *)e) + e->target_offset); 719 + t = ebt_get_target(e); 725 720 gap = e->next_offset - e->target_offset; 726 721 727 722 target = xt_request_find_target(NFPROTO_BRIDGE, t->u.name, 0); ··· 794 789 if (pos == nentries) 795 790 continue; 796 791 } 797 - t = (struct ebt_entry_target *) 798 - (((char *)e) + e->target_offset); 792 + t = ebt_get_target_c(e); 799 793 if (strcmp(t->u.name, EBT_STANDARD_TARGET)) 800 794 goto letscontinue; 801 795 if (e->target_offset + sizeof(struct ebt_standard_target) > ··· 1400 1396 return -EFAULT; 1401 1397 1402 1398 hlp = ubase + (((char *)e + e->target_offset) - base); 1403 - t = (struct ebt_entry_target *)(((char *)e) + e->target_offset); 1399 + t = ebt_get_target_c(e); 1404 1400 1405 1401 ret = EBT_MATCH_ITERATE(e, ebt_match_to_user, base, ubase); 1406 1402 if (ret != 0) ··· 1741 1737 return ret; 1742 1738 target_offset = e->target_offset - (origsize - *size); 1743 1739 1744 - t = (struct ebt_entry_target *) ((char *) e + e->target_offset); 1740 + t = ebt_get_target(e); 1745 1741 1746 1742 ret = compat_target_to_user(t, dstptr, size); 1747 1743 if (ret) ··· 1789 1785 EBT_MATCH_ITERATE(e, compat_calc_match, &off); 1790 1786 EBT_WATCHER_ITERATE(e, compat_calc_watcher, &off); 1791 1787 1792 - t = (const struct ebt_entry_target *) ((char *) e + e->target_offset); 1788 + t = ebt_get_target_c(e); 1793 1789 1794 1790 off += xt_compat_target_offset(t->u.target); 1795 1791 off += ebt_compat_entry_padsize();