On 12/10/15(Mon) 22:29, Alexandr Nedvedicky wrote:
> Hello,
> 
> Richard Procter came back to me in private email with one more nit to fix:
> 
>       we can get rid of
> 
>           if (sn->rule.ptr != NULL)
>       test condition in pfioctl() function as well.
> 
> The relevant snippet looks as follows:
> 
> 2188                 p = psn->psn_src_nodes;
> 2189                 RB_FOREACH(n, pf_src_tree, &tree_src_tracking) {
> ....
> 2198                         pstore->kif = NULL;
> 2199                         if (n->rule.ptr != NULL)
> 2200                                 pstore->rule.nr = n->rule.ptr->nr;
> 
> need one more OK for Richard's suggestion. Updated patch is below.
> Complete email from Richard follows the patch.

ok mpi@

> 
> thanks and
> regards
> sasha
> 
> --------8<---------------8<---------------8<------------------8<--------
> 
> Index: pf.c
> ===================================================================
> RCS file: /cvs/src/sys/net/pf.c,v
> retrieving revision 1.946
> diff -u -p -r1.946 pf.c
> --- pf.c      8 Oct 2015 11:36:51 -0000       1.946
> +++ pf.c      12 Oct 2015 20:20:17 -0000
> @@ -501,7 +501,7 @@ pf_src_connlimit(struct pf_state **state
>  int
>  pf_insert_src_node(struct pf_src_node **sn, struct pf_rule *rule,
>      enum pf_sn_types type, sa_family_t af, struct pf_addr *src,
> -    struct pf_addr *raddr, int global)
> +    struct pf_addr *raddr)
>  {
>       struct pf_src_node      k;
>  
> @@ -509,10 +509,7 @@ pf_insert_src_node(struct pf_src_node **
>               k.af = af;
>               k.type = type;
>               PF_ACPY(&k.addr, src, af);
> -             if (global)
> -                     k.rule.ptr = NULL;
> -             else
> -                     k.rule.ptr = rule;
> +             k.rule.ptr = rule;
>               pf_status.scounters[SCNT_SRC_NODE_SEARCH]++;
>               *sn = RB_FIND(pf_src_tree, &tree_src_tracking, &k);
>       }
> @@ -531,10 +528,7 @@ pf_insert_src_node(struct pf_src_node **
>  
>               (*sn)->type = type;
>               (*sn)->af = af;
> -             if (global)
> -                     (*sn)->rule.ptr = NULL;
> -             else
> -                     (*sn)->rule.ptr = rule;
> +             (*sn)->rule.ptr = rule;
>               PF_ACPY(&(*sn)->addr, src, af);
>               if (raddr)
>                       PF_ACPY(&(*sn)->raddr, raddr, af);
> @@ -550,8 +544,7 @@ pf_insert_src_node(struct pf_src_node **
>                       return (-1);
>               }
>               (*sn)->creation = time_uptime;
> -             if ((*sn)->rule.ptr != NULL)
> -                     (*sn)->rule.ptr->src_nodes++;
> +             (*sn)->rule.ptr->src_nodes++;
>               pf_status.scounters[SCNT_SRC_NODE_INSERT]++;
>               pf_status.src_nodes++;
>       } else {
> @@ -570,16 +563,14 @@ pf_remove_src_node(struct pf_src_node *s
>       if (sn->states > 0 || sn->expire > time_uptime)
>               return;
>  
> -     if (sn->rule.ptr != NULL) {
> -             sn->rule.ptr->src_nodes--;
> -             if (sn->rule.ptr->states_cur == 0 &&
> -                 sn->rule.ptr->src_nodes == 0)
> -                     pf_rm_rule(NULL, sn->rule.ptr);
> -             RB_REMOVE(pf_src_tree, &tree_src_tracking, sn);
> -             pf_status.scounters[SCNT_SRC_NODE_REMOVALS]++;
> -             pf_status.src_nodes--;
> -             pool_put(&pf_src_tree_pl, sn);
> -     }
> +     sn->rule.ptr->src_nodes--;
> +     if (sn->rule.ptr->states_cur == 0 &&
> +         sn->rule.ptr->src_nodes == 0)
> +             pf_rm_rule(NULL, sn->rule.ptr);
> +     RB_REMOVE(pf_src_tree, &tree_src_tracking, sn);
> +     pf_status.scounters[SCNT_SRC_NODE_REMOVALS]++;
> +     pf_status.src_nodes--;
> +     pool_put(&pf_src_tree_pl, sn);
>  }
>  
>  struct pf_src_node *
> @@ -3381,7 +3372,7 @@ pf_test_rule(struct pf_pdesc *pd, struct
>  
>               if (r->rule_flag & PFRULE_SRCTRACK &&
>                   pf_insert_src_node(&sns[PF_SN_NONE], r, PF_SN_NONE, pd->af,
> -                 pd->src, NULL, 0) != 0) {
> +                 pd->src, NULL) != 0) {
>                       REASON_SET(&reason, PFRES_SRCLIMIT);
>                       goto cleanup;
>               }
> Index: pf_ioctl.c
> ===================================================================
> RCS file: /cvs/src/sys/net/pf_ioctl.c,v
> retrieving revision 1.290
> diff -u -p -r1.290 pf_ioctl.c
> --- pf_ioctl.c        4 Sep 2015 21:40:25 -0000       1.290
> +++ pf_ioctl.c        12 Oct 2015 20:20:20 -0000
> @@ -2175,8 +2175,7 @@ pfioctl(dev_t dev, u_long cmd, caddr_t a
>                       bzero(&pstore->entry, sizeof(pstore->entry));
>                       pstore->rule.ptr = NULL;
>                       pstore->kif = NULL;
> -                     if (n->rule.ptr != NULL)
> -                             pstore->rule.nr = n->rule.ptr->nr;
> +                     pstore->rule.nr = n->rule.ptr->nr;
>                       pstore->creation = secs - pstore->creation;
>                       if (pstore->expire > secs)
>                               pstore->expire -= secs;
> Index: pf_lb.c
> ===================================================================
> RCS file: /cvs/src/sys/net/pf_lb.c,v
> retrieving revision 1.49
> diff -u -p -r1.49 pf_lb.c
> --- pf_lb.c   3 Aug 2015 13:33:12 -0000       1.49
> +++ pf_lb.c   12 Oct 2015 20:20:22 -0000
> @@ -621,8 +621,7 @@ pf_map_addr(sa_family_t af, struct pf_ru
>                       pf_remove_src_node(sns[type]);
>                       sns[type] = NULL;
>               }
> -             if (pf_insert_src_node(&sns[type], r, type, af, saddr, naddr,
> -                 0))
> +             if (pf_insert_src_node(&sns[type], r, type, af, saddr, naddr))
>                       return (1);
>       }
>  
> Index: pfvar.h
> ===================================================================
> RCS file: /cvs/src/sys/net/pfvar.h,v
> retrieving revision 1.420
> diff -u -p -r1.420 pfvar.h
> --- pfvar.h   19 Aug 2015 21:22:41 -0000      1.420
> +++ pfvar.h   12 Oct 2015 20:20:23 -0000
> @@ -1681,7 +1681,7 @@ extern int                       pf_state_insert(struct 
> pfi
>  int                           pf_insert_src_node(struct pf_src_node **,
>                                   struct pf_rule *, enum pf_sn_types,
>                                   sa_family_t, struct pf_addr *,
> -                                 struct pf_addr *, int);
> +                                 struct pf_addr *);
>  void                          pf_remove_src_node(struct pf_src_node *);
>  struct pf_src_node           *pf_get_src_node(struct pf_state *,
>                                   enum pf_sn_types);
> 
> --------8<---------------8<---------------8<------------------8<--------
> 
> On Tue, Oct 13, 2015 at 08:45:01AM +1300, Richard Procter wrote:
> > Hi Sasha, 
> > 
> > I found some time to look at the pf_remove_src_node() issue. 
> > 
> > As far as I can tell, pf_remove_src_node() never receives a NULL 
> > sn->rule.ptr once the 'global' is removed. I first note that: 
> > 
> > pf_insert_src_node() alone inserts into tree_src_tracking /\ 
> > pf_insert_src_node() ensures (*sn)->rule.ptr != NULL        (0) 
> > 
> > I've traced the (bottom-up) call tree as follows, 
> > 
> > pf_remove_src_node()
> >     pf_purge_expired_src_nodes() 
> >               iterates over tree_src_tracking
> >             =>      { (0) }
> >               cur->rule.ptr != NULL [good]
> >                     
> >     pf_map_addr_sticky(*sns[]) 
> >               retrieves from tree_src_tracking
> >             =>      { (0) }
> >               retrieved source node->rule.ptr != NULL [good]
> >           
> >     pf_create_state(*sns[])     
> >     pf_map_addr(*sns[])
> > 
> > Ok, let's try to establish that the last two always receive 
> > (pointers to) struct pf_src_nodes from tree_src_tracking. 
> > Their (bottom-up) call trees are:
> > 
> > pf_create_state(*sns[])
> >     pf_test_rule()
> > 
> > pf_map_addr(*sns[])
> >     pf_get_sport(*sn[])
> >             pf_get_transaddr(*sns[])
> >             pf_get_transaddr_af(*sns[])
> >     pf_get_transaddr(*sns[])
> >             pf_test_rule()
> >     pf_get_transaddr_af(*sns[])
> >             pf_get_transaddr(*sns[])
> >     pf_set_rt_ifp()
> >     pf_route()
> >     pf_route6()
> > 
> > If these always populate *sns[] with items added 
> > by pf_insert_src_node(), we're done. 
> > 
> > pf_test_rule(), 
> > pf_set_rt_ifp(), 
> > pf_route() and 
> > pf_route6() all initialise their *sns[] array to NULL 
> > and never populate it directly. 
> > 
> > pf_get_sport(*sns[]),
> > pf_get_transaddr(*sns[]), 
> > pf_get_transsaddr_af(*sns[]) never alter *sns[] directly.
> > 
> > pf_map_addr() modifies *sns[] directly only by setting NULL on removal.
> > 
> > So it looks good.
> >               
> > Analagous to the guard in pf_remove_src_node(), removing 'global' 
> > probably also allows the following two guards to be removed as they too 
> > involve pf_src_nodes inserted into the tree_src_tracking tree. 
> > 
> > best, 
> > Richard. 
> > 
> > Index: pf.c
> > ===================================================================
> > RCS file: /cvs/src/sys/net/pf.c,v
> > retrieving revision 1.946
> > diff -u -p -u -r1.946 pf.c
> > --- pf.c        8 Oct 2015 11:36:51 -0000       1.946
> > +++ pf.c        12 Oct 2015 03:25:22 -0000
> > @@ -550,8 +550,7 @@ pf_insert_src_node(struct pf_src_node **
> >                         return (-1);
> >                 }
> >                 (*sn)->creation = time_uptime;
> > -               if ((*sn)->rule.ptr != NULL)
> > -                       (*sn)->rule.ptr->src_nodes++;
> > +               (*sn)->rule.ptr->src_nodes++;
> >                 pf_status.scounters[SCNT_SRC_NODE_INSERT]++;
> >                 pf_status.src_nodes++;
> >         } else {
> > Index: pf_ioctl.c
> > ===================================================================
> > RCS file: /cvs/src/sys/net/pf_ioctl.c,v
> > retrieving revision 1.290
> > diff -u -p -u -r1.290 pf_ioctl.c
> > --- pf_ioctl.c  4 Sep 2015 21:40:25 -0000       1.290
> > +++ pf_ioctl.c  12 Oct 2015 03:25:22 -0000
> > @@ -2175,8 +2175,7 @@ pfioctl(dev_t dev, u_long cmd, caddr_t a
> >                         bzero(&pstore->entry, sizeof(pstore->entry));
> >                         pstore->rule.ptr = NULL;
> >                         pstore->kif = NULL;
> > -                       if (n->rule.ptr != NULL)
> > -                               pstore->rule.nr = n->rule.ptr->nr;
> > +                       pstore->rule.nr = n->rule.ptr->nr;
> >                         pstore->creation = secs - pstore->creation;
> >                         if (pstore->expire > secs)
> >                                 pstore->expire -= secs;
> > 
> > 
> 

Reply via email to