On Tue, Aug 12, 2014 at 18:26 +0200, Mike Belopuhov wrote:
> On Tue, Jul 22, 2014 at 19:03 +0200, Mike Belopuhov wrote:
> > Hi,
> > 
> > Before I send a diff for pfctl to disable "once" on "match" rules,
> > I've decided to try and see how much work is it to make it actually
> > work.  Turns out that I need to extend pf_rule_item by 3 pointers
> > to track the match rule ruleset, anchor rule and the ruleset it
> > belongs to.
> > 
> > Here's what this means in practice.  Consider a ruleset:
> > 
> >  block drop all
> >  match out log proto tcp to port 22 once
> >  anchor "foo" all {
> >    match out log proto tcp to port 22 once
> >    anchor "bar" all {
> >      match out log proto tcp to port 22 once
> >      pass out quick proto tcp to port 22 once
> >    }
> >  }
> > 
> > Once we send a packet to port 22 the ruleset collapses to just:
> > 
> >  block drop all
> > 
> > Thoughts?
> 
> Henning thinks it's a bit of an overkill.  Any other opinions?
> 

here we go then.  OK?

diff --git sbin/pfctl/parse.y sbin/pfctl/parse.y
index c277b8d..61c2646 100644
--- sbin/pfctl/parse.y
+++ sbin/pfctl/parse.y
@@ -1488,12 +1488,18 @@ pfrule          : action dir logquick interface af 
proto fromto
                        if ($8.marker & FOM_SETPRIO) {
                                r.set_prio[0] = $8.set_prio[0];
                                r.set_prio[1] = $8.set_prio[1];
                                r.scrub_flags |= PFSTATE_SETPRIO;
                        }
-                       if ($8.marker & FOM_ONCE)
+                       if ($8.marker & FOM_ONCE) {
+                               if (r.action == PF_MATCH) {
+                                       yyerror("can't specify once for "
+                                           "match rules");
+                                       YYERROR;
+                               }
                                r.rule_flag |= PFRULE_ONCE;
+                       }
                        if ($8.marker & FOM_AFTO)
                                r.rule_flag |= PFRULE_AFTO;
                        r.af = $5;
 
                        if ($8.tag)

Reply via email to