From b7b3b703c651dd543f35685ef9c1987210e3e9e6 Mon Sep 17 00:00:00 2001 From: Michael Poole Date: Wed, 12 Dec 2007 23:07:52 -0500 Subject: [PATCH] Fix DNR expiration and expiration-based DNR searches. src/chanserv.c (expire_dnrs): Use the usual trick for iterating over a dict while we might want to delete elements from it. (dnr_search_matches): Simplify the min_expires test. If max_expires is set, fail if the DNR never expires or it expires later. (dnr_search_create): Initialize max_expires to 0, not INT_MAX. --- src/chanserv.c | 33 +++++++++++++++++---------------- 1 file changed, 17 insertions(+), 16 deletions(-) diff --git a/src/chanserv.c b/src/chanserv.c index 5fde71f..ec6a364 100644 --- a/src/chanserv.c +++ b/src/chanserv.c @@ -1397,29 +1397,29 @@ expire_channels(UNUSED_ARG(void *data)) static void expire_dnrs(UNUSED_ARG(void *data)) { - dict_iterator_t it; + dict_iterator_t it, next; struct do_not_register *dnr; - for(it = dict_first(handle_dnrs); it; it = iter_next(it)) + for(it = dict_first(handle_dnrs); it; it = next) { dnr = iter_data(it); - if(!dnr->expires || dnr->expires > now) - continue; - dict_remove(handle_dnrs, dnr->chan_name + 1); + next = iter_next(it); + if(dnr->expires && dnr->expires <= now) + dict_remove(handle_dnrs, dnr->chan_name + 1); } - for(it = dict_first(plain_dnrs); it; it = iter_next(it)) + for(it = dict_first(plain_dnrs); it; it = next) { dnr = iter_data(it); - if(!dnr->expires || dnr->expires > now) - continue; - dict_remove(plain_dnrs, dnr->chan_name); + next = iter_next(it); + if(dnr->expires && dnr->expires <= now) + dict_remove(plain_dnrs, dnr->chan_name + 1); } - for(it = dict_first(mask_dnrs); it; it = iter_next(it)) + for(it = dict_first(mask_dnrs); it; it = next) { dnr = iter_data(it); - if(!dnr->expires || dnr->expires > now) - continue; - dict_remove(mask_dnrs, dnr->chan_name); + next = iter_next(it); + if(dnr->expires && dnr->expires <= now) + dict_remove(mask_dnrs, dnr->chan_name + 1); } if(chanserv_conf.dnr_expire_frequency) @@ -1734,8 +1734,10 @@ dnr_search_matches(const struct do_not_register *dnr, const struct dnr_search *s { return !((dnr->set < search->min_set) || (dnr->set > search->max_set) - || (dnr->expires && ((dnr->expires < search->min_expires) - || (dnr->expires > search->max_expires))) + || (dnr->expires < search->min_expires) + || (search->max_expires + && ((dnr->expires == 0) + || (dnr->expires > search->max_expires))) || (search->chan_mask && !match_ircglob(dnr->chan_name, search->chan_mask)) || (search->setter_mask @@ -1756,7 +1758,6 @@ dnr_search_create(struct userNode *user, struct svccmd *cmd, unsigned int argc, discrim->setter_mask = NULL; discrim->reason_mask = NULL; discrim->max_set = INT_MAX; - discrim->max_expires = INT_MAX; discrim->limit = 50; for(ii=0; ii