From 6bb86db78c51419b3561f8e6b69680bf64f60c9b Mon Sep 17 00:00:00 2001 From: Bart De Schuymer Date: Sun, 21 Jul 2002 15:19:26 +0000 Subject: add OR --- kernel/linux/net/bridge/netfilter/ebt_mark_m.c | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) (limited to 'kernel/linux/net/bridge/netfilter/ebt_mark_m.c') diff --git a/kernel/linux/net/bridge/netfilter/ebt_mark_m.c b/kernel/linux/net/bridge/netfilter/ebt_mark_m.c index 4972b09..d3f0119 100644 --- a/kernel/linux/net/bridge/netfilter/ebt_mark_m.c +++ b/kernel/linux/net/bridge/netfilter/ebt_mark_m.c @@ -13,19 +13,27 @@ #include static int ebt_filter_mark(const struct sk_buff *skb, - const struct net_device *in, - const struct net_device *out, - const void *data, - unsigned int datalen, const struct ebt_counter *c) + const struct net_device *in, const struct net_device *out, const void *data, + unsigned int datalen, const struct ebt_counter *c) { struct ebt_mark_m_info *info = (struct ebt_mark_m_info *) data; + if (info->bitmask & EBT_MARK_OR) + return !(!!(skb->nfmark & info->mask) ^ info->invert); return !(((skb->nfmark & info->mask) == info->mark) ^ info->invert); } static int ebt_mark_check(const char *tablename, unsigned int hookmask, const struct ebt_entry *e, void *data, unsigned int datalen) { + struct ebt_mark_m_info *info = (struct ebt_mark_m_info *) data; + + if (info->bitmask & ~EBT_MARK_MASK) + return -EINVAL; + if ((info->bitmask & EBT_MARK_OR) && (info->bitmask & EBT_MARK_AND)) + return -EINVAL; + if (!info->bitmask) + return -EINVAL; if (datalen != sizeof(struct ebt_mark_m_info)) { return -EINVAL; } -- cgit v1.2.3