From 5bc09b8e9db045c7136d76405c1733ea531be0f7 Mon Sep 17 00:00:00 2001 From: "/C=EU/ST=EU/CN=Patrick McHardy/emailAddress=kaber@trash.net" Date: Mon, 14 Apr 2008 06:56:58 +0000 Subject: [PATCH 8/8] Implement AF_UNSPEC as a wildcard for extensions --- xtables.c | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) (limited to 'xtables.c') diff --git a/xtables.c b/xtables.c index b26b416..21da4b5 100644 --- a/xtables.c +++ b/xtables.c @@ -557,12 +557,13 @@ void xtables_register_match(struct xtables_match *me) } /* ignore not interested match */ - if (me->family != afinfo.family) + if (me->family != afinfo.family && me->family != AF_UNSPEC) return; old = find_match(me->name, DURING_LOAD, NULL); if (old) { - if (old->revision == me->revision) { + if (old->revision == me->revision && + old->family == me->family) { fprintf(stderr, "%s: match `%s' already registered.\n", program_name, me->name); @@ -574,10 +575,14 @@ void xtables_register_match(struct xtables_match *me) && old->revision > me->revision) return; - /* Replace if compatible. */ + /* See if new match can be used. */ if (!compatible_match_revision(me->name, me->revision)) return; + /* Prefer !AF_UNSPEC over AF_UNSPEC for same revision. */ + if (old->revision == me->revision && me->family == AF_UNSPEC) + return; + /* Delete old one. */ for (i = &xtables_matches; *i!=old; i = &(*i)->next); *i = old->next; @@ -623,14 +628,15 @@ void xtables_register_target(struct xtables_target *me) } /* ignore not interested target */ - if (me->family != afinfo.family) + if (me->family != afinfo.family && me->family != AF_UNSPEC) return; old = find_target(me->name, DURING_LOAD); if (old) { struct xtables_target **i; - if (old->revision == me->revision) { + if (old->revision == me->revision && + old->family == me->family) { fprintf(stderr, "%s: target `%s' already registered.\n", program_name, me->name); @@ -642,10 +648,14 @@ void xtables_register_target(struct xtables_target *me) && old->revision > me->revision) return; - /* Replace if compatible. */ + /* See if new target can be used. */ if (!compatible_target_revision(me->name, me->revision)) return; + /* Prefer !AF_UNSPEC over AF_UNSPEC for same revision. */ + if (old->revision == me->revision && me->family == AF_UNSPEC) + return; + /* Delete old one. */ for (i = &xtables_targets; *i!=old; i = &(*i)->next); *i = old->next; -- cgit v1.2.3