[NEW TARGET] target for modifying conntrack timeout value

Pablo Neira pablo at eurodev.net
Wed Dec 15 01:25:05 CET 2004


Richard wrote:

>  
>
>>-----Original Message-----
>>From: Richard [mailto:richard at o-matrix.org]
>>Sent: Wednesday, December 08, 2004 3:48 PM
>>To: 'Pablo Neira'
>>Cc: 'netfilter-devel at lists.netfilter.org'
>>Subject: RE: [NEW TARGET] target for modifying conntrack timeout value
>>
>>    
>>
>>>+                ct->timeout.expires = new_expires;
>>>                  ^^^
>>>
>>>Hm I thought that I told you to use ip_ct_refresh... you should. Your
>>>target will look smarter and you can forget about proper locking...
>>>which is now completely broken...
>>>      
>>>
>>Hi Pablo,
>>
>>Thanks for the comments. I made the modification and attached the latest
>>copy. Now it uses ip_ct_refresh. The target first reads the existing
>>expire value, then modify it. If there is something in between, the expire
>>value might get changed. Even worse, the conntrack state might change.
>>That's why I locked it first, then read and write, finally unlock. If it
>>is broken, there is no difference anyway...
>>
>>    
>>
>
>Just wonder if there is any update on this please...
>  
>

Some comments:

a) I think that you should implement this thing as a match instead of a 
target. Have a look at ipt_limit. It isn't actually matching anything 
but, for example, you could use it together with nat targets. A match 
gives you more flexibility.

b) About source code:

+       if (!is_confirmed(ct)) {
           ^^^
remove this `if' condition. ip_ct_refresh worries about about this for 
you and makes the thing more simple.

c) In checkentry:

+       if (info->mode > IPT_CTEXPIRE_MAXMODE) {
+               printk(KERN_WARNING "CTEXPIRE: invalid or unknown Mode 
%u\n",
+                       info->mode);
+               return 0;
+       }
+ [...]
+
+       if (info->expires * HZ < info->expires) {
+               /* if user specified value is too big, *HZ can overflow 
the counter
+               */
+               printk(KERN_WARNING "CTEXPIRE: expire value too big, 
will overflow counter: %ld\n", info->expires);
+               return 0;
+       }

You should do those checkings in user space. Those error must be handle 
in iptables, not in kernel.

A minor aesthetic comment, a line must fit 80 columns, split longer 
lines in two.

--
Pablo



More information about the netfilter-devel mailing list