struct ip_conntrack_expect *exp;
struct ip_conntrack *ct;
enum ip_conntrack_info ctinfo;
- int ret = info->invert;
+ int ret = 0;
ct = ip_conntrack_get((struct sk_buff *)skb, &ctinfo);
if (!ct) {
DEBUGP("ipt_helper: Eek! invalid conntrack?\n");
- return ret;
+ return 0;
}
if (!ct->master) {
DEBUGP("ipt_helper: conntrack %p has no master\n", ct);
- return ret;
+ return 0;
}
exp = ct->master;
DEBUGP("master's name = %s , info->name = %s\n",
exp->expectant->helper->name, info->name);
- if (info->name[0] == '\0')
- ret ^= 1;
- else
- ret ^= !strncmp(exp->expectant->helper->name, info->name,
- strlen(exp->expectant->helper->name));
+ ret = !strncmp(exp->expectant->helper->name, info->name,
+ strlen(exp->expectant->helper->name)) ^ info->invert;
out_unlock:
READ_UNLOCK(&ip_conntrack_lock);
return ret;
if (matchsize != IPT_ALIGN(sizeof(struct ipt_helper_info)))
return 0;
+ /* verify that we actually should match anything */
+ if ( strlen(info->name) == 0 )
+ return 0;
+
return 1;
}
static int __init init(void)
{
+ need_ip_conntrack();
return ipt_register_match(&helper_match);
}