bumping this legit patch.

On Thu, Jan 22, 2015 at 6:48 PM, Bertrand PROVOST
<provost.bertr...@gmail.com> wrote:
> Hello,
>
> Based on a patch[1] found on the mailing list, I added a link between
> dhcpd and unbound to be able to resolve name of all client that have
> a lease on dhcpd. And I found a bug in the function 'periodic_scan'
> which is called every X second (X = half of the minimum lease duration).
>
> This function check all leases and for each expired leases,
> it call `release_lease' and remove from pf table `leases' the associated
> ip to this lease.
>
> 1) Calling `release_lease' in dhcpd.c, in `periodic_scan' is irrelevant.
> The function `release_lease' would be used to trigger this part of code.
>
> This function check if the leases is NOT yet expired and then change
> the end time of the lease to `cur_time'
> So it do nothing if this condition is false:
>
>     if (lt.ends > cur_time)
>
> And this condition cannot be true when it's called in `periodic_scan'
> because we check that the lease has already expire
>
>     if (cur_time >= l->ends){
>
> 2) This function would remove an IP address from a pf's  table again
> and again. Then, for example, if the shortest leases time is 10 minutes,
> every 5 minutes, this code will be call:
>
>     pfmsg('R', l);
>
> So I choose to add a condition that check this was not called on
> previous scan.
>
> I don't know if this can be a problem because this ip should be handle
> only by one dhcpd server. But in case or we want add manually this ip
> in the table, it will be removed every time that, the function
> `periodic_scan` is called
>
>
> [1] http://marc.info/?l=openbsd-tech&m=118039557923827
>
> --
> Bertrand PROVOST
>
>
> Index: dhcpd.c
> ===================================================================
> RCS file: /cvs/src/usr.sbin/dhcpd/dhcpd.c,v
> retrieving revision 1.46
> diff -u -p -r1.46 dhcpd.c
> --- dhcpd.c     16 Jan 2015 06:40:16 -0000      1.46
> +++ dhcpd.c     22 Jan 2015 19:15:55 -0000
> @@ -48,6 +48,7 @@
>  void usage(void);
>
>  time_t cur_time;
> +time_t last_periodic_scan_time;
>  struct group root_group;
>
>  u_int16_t server_port;
> @@ -347,10 +348,10 @@ periodic_scan(void *p)
>                 for (g = n->group; g; g = g->next)
>                         for (s = g->shared_network; s; s = s->next)
>                                 for (l = s->leases; l && l->ends; l = l->next)
> -                                       if (cur_time >= l->ends){
> -                                               release_lease(l);
> +                                       if (cur_time >= l->ends &&
> l->ends > last_periodic_scan_time){
>                                                 pfmsg('R', l);
>                                         }
>
> +       last_periodic_scan_time = cur_time;
>         add_timeout(cur_time + y, periodic_scan, NULL);
>  }
>



-- 
---------------------------------------------------------------------------------------------------------------------
() ascii ribbon campaign - against html e-mail
/\

Reply via email to