summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authormarkus <markus@openbsd.org>2012-12-29 14:54:45 +0000
committermarkus <markus@openbsd.org>2012-12-29 14:54:45 +0000
commit60152e752e0c6baac9d7b7130ada301fc8043c9c (patch)
treea264148db250ff6b8a11c96476ec1d7551ca07fc
parentKeep mfs from potentially consuming the entire buffer cache if it gets (diff)
downloadwireguard-openbsd-60152e752e0c6baac9d7b7130ada301fc8043c9c.tar.xz
wireguard-openbsd-60152e752e0c6baac9d7b7130ada301fc8043c9c.zip
reset the counter in case its current value has been removed
from the pool (e.g. ifconfig em0 1.2.3.4 -alias) ok henning@, mikeb@
-rw-r--r--sys/net/pf_lb.c21
1 files changed, 16 insertions, 5 deletions
diff --git a/sys/net/pf_lb.c b/sys/net/pf_lb.c
index 7d0e0f0a946..70e6d9dc3f0 100644
--- a/sys/net/pf_lb.c
+++ b/sys/net/pf_lb.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: pf_lb.c,v 1.22 2012/12/29 14:53:05 markus Exp $ */
+/* $OpenBSD: pf_lb.c,v 1.23 2012/12/29 14:54:45 markus Exp $ */
/*
* Copyright (c) 2001 Daniel Hartmeier
@@ -396,8 +396,15 @@ pf_map_addr(sa_family_t af, struct pf_rule *r, struct pf_addr *saddr,
case PF_POOL_ROUNDROBIN:
if (rpool->addr.type == PF_ADDR_TABLE ||
rpool->addr.type == PF_ADDR_DYNIFTL) {
- if (pfr_pool_get(rpool, &raddr, &rmask, af))
- return (1);
+ if (pfr_pool_get(rpool, &raddr, &rmask, af)) {
+ /*
+ * reset counter in case its value
+ * has been removed from the pool.
+ */
+ bzero(&rpool->counter, sizeof(rpool->counter));
+ if (pfr_pool_get(rpool, &raddr, &rmask, af))
+ return (1);
+ }
} else if (pf_match_addr(0, raddr, rmask, &rpool->counter, af))
return (1);
@@ -434,8 +441,12 @@ pf_map_addr(sa_family_t af, struct pf_rule *r, struct pf_addr *saddr,
/* retrieve an address first */
if (rpool->addr.type == PF_ADDR_TABLE ||
rpool->addr.type == PF_ADDR_DYNIFTL) {
- if (pfr_pool_get(rpool, &raddr, &rmask, af))
- return (1);
+ if (pfr_pool_get(rpool, &raddr, &rmask, af)) {
+ /* see PF_POOL_ROUNDROBIN */
+ bzero(&rpool->counter, sizeof(rpool->counter));
+ if (pfr_pool_get(rpool, &raddr, &rmask, af))
+ return (1);
+ }
} else if (pf_match_addr(0, raddr, rmask, &rpool->counter, af))
return (1);