New target: can't delete rule
Gervasio Bernal
gervasiobernal at speedy.com.ar
Mon Sep 12 21:23:36 CEST 2005
El mié, 07-09-2005 a las 22:30, Pablo Neira escribió:
> Gervasio Bernal wrote:
> > I'm from Argentina and I'm developing a new target for iptables with a
> > college friend. This new target uses the Linux Cryptographic API.
> >
> > We are debbuging the new extension and we noticed a rare behavior.
> > First we inserted the rule like this:
> > #iptables -t mangle -A INPUT -s xxx.xxx.xxx.xxx -j NEW --param hello
> > And we don't have problems.
> >
> > The problem appears when we tried to erase the rule:
> > #iptables -t mangle -D INPUT -s xxx.xxx.xxx.xxx -j NEW --param hello
> > It says: :-(
> > iptables: No chain/target/match by that name
> >
> > But, if we put this:
> > #iptables -t mangle -D INPUT 1
> > It erases correctly :-)
> >
> > Why it works with a method and not with the another one?
> > It can be because we allocating memory in checkentry function and
> > freeing it in destroy function?
> > How can we correct this rare behavior?
>
> I bet that you have a pointer in the private info section of the target.
> See that iptables sets that pointer to NULL at rule creation.
> Afterwards, once checkentry() is called, such pointer won't be NULL anymore.
>
> At removal, the rule built by iptables sets that pointer to NULL. Such
> rule will be compared with the ruleset hold in kernel space but no
> matches will be found since the pointers mismatch.
>
> This problem is well known and it's very easy to fix up (look for
> userspacesize and offsetof in iptables/extensions). See ipt_limit,
> ipt_CLUSTERIP...
>
> But it's *even* easier to figure out what's wrong with yout module if
> you post it here, in the mailing list.
>
> --
> Pablo
>
Pablo:
I did what you said, but I cannot make walk it.
This is my libipt_CRYPT.c
static struct iptables_target CRYPT
= {
.name = "CRYPT",
.version = IPTABLES_VERSION,
.size = IPT_ALIGN(sizeof(struct ipt_CRYPT_info)),
.userspacesize = offsetof(struct ipt_CRYPT_info,
table_alloc_ptr),
.help = &help,
.init = &init,
.parse = &parse,
.final_check = &final_check,
.print = &print,
.save = &save,
.extra_opts = opts
};
This is my ipt_CRYPT.h
struct ipt_CRYPT_info
{
char key[MAX_KEY_SIZE];
unsigned int block_size;
unsigned int key_size;
struct tabla_alloc* table_alloc_ptr;
};
struct tabla_alloc
{
struct crypto_tfm *tfm;
struct tabla_alloc* next;
struct tabla_alloc* ant;
};
Greetings
More information about the netfilter-devel
mailing list