diff --git a/include/s_conf.h b/include/s_conf.h index 96e742bd..58e57b64 100644 --- a/include/s_conf.h +++ b/include/s_conf.h @@ -339,7 +339,7 @@ extern struct ConfItem *make_conf(void); extern void free_conf(struct ConfItem *); extern rb_dlink_node *find_prop_ban(unsigned int status, const char *user, const char *host); -extern void deactivate_conf(struct ConfItem *, rb_dlink_node *); +extern void deactivate_conf(struct ConfItem *, rb_dlink_node *, time_t); extern void replace_old_ban(struct ConfItem *); extern void read_conf_files(int cold); diff --git a/modules/m_kline.c b/modules/m_kline.c index e133b026..ff034d8d 100644 --- a/modules/m_kline.c +++ b/modules/m_kline.c @@ -834,6 +834,7 @@ static void remove_prop_kline(struct Client *source_p, struct ConfItem *aconf) { rb_dlink_node *ptr; + time_t now; ptr = rb_dlinkFind(aconf, &prop_bans); if (!ptr) @@ -848,8 +849,9 @@ remove_prop_kline(struct Client *source_p, struct ConfItem *aconf) ilog(L_KLINE, "UK %s %s %s", get_oper_name(source_p), aconf->user, aconf->host); - if(aconf->created < rb_current_time()) - aconf->created = rb_current_time(); + now = rb_current_time(); + if(aconf->created < now) + aconf->created = now; else aconf->created++; aconf->hold = aconf->created; @@ -863,5 +865,5 @@ remove_prop_kline(struct Client *source_p, struct ConfItem *aconf) 0, (int)(aconf->lifetime - aconf->created)); remove_reject_mask(aconf->user, aconf->host); - deactivate_conf(aconf, ptr); + deactivate_conf(aconf, ptr, now); } diff --git a/modules/m_resv.c b/modules/m_resv.c index 98e61fb4..42aa8120 100644 --- a/modules/m_resv.c +++ b/modules/m_resv.c @@ -513,6 +513,7 @@ remove_resv(struct Client *source_p, const char *name, int propagated) { struct ConfItem *aconf = NULL; rb_dlink_node *ptr; + time_t now; if(IsChannelName(name)) { @@ -540,8 +541,9 @@ remove_resv(struct Client *source_p, const char *name, int propagated) "%s has removed the global RESV for: [%s]", get_oper_name(source_p), name); ilog(L_KLINE, "UR %s %s", get_oper_name(source_p), name); - if(aconf->created < rb_current_time()) - aconf->created = rb_current_time(); + now = rb_current_time(); + if(aconf->created < now) + aconf->created = now; else aconf->created++; aconf->hold = aconf->created; @@ -554,7 +556,7 @@ remove_resv(struct Client *source_p, const char *name, int propagated) (unsigned long)aconf->created, 0, (int)(aconf->lifetime - aconf->created)); - deactivate_conf(aconf, ptr); + deactivate_conf(aconf, ptr, now); return; } else if(propagated && rb_dlink_list_length(&cluster_conf_list) > 0) @@ -613,8 +615,9 @@ remove_resv(struct Client *source_p, const char *name, int propagated) "%s has removed the global RESV for: [%s]", get_oper_name(source_p), name); ilog(L_KLINE, "UR %s %s", get_oper_name(source_p), name); - if(aconf->created < rb_current_time()) - aconf->created = rb_current_time(); + now = rb_current_time(); + if(aconf->created < now) + aconf->created = now; else aconf->created++; aconf->hold = aconf->created; @@ -627,7 +630,7 @@ remove_resv(struct Client *source_p, const char *name, int propagated) (unsigned long)aconf->created, 0, (int)(aconf->lifetime - aconf->created)); - deactivate_conf(aconf, ptr); + deactivate_conf(aconf, ptr, now); return; } else if(propagated && rb_dlink_list_length(&cluster_conf_list) > 0) diff --git a/modules/m_xline.c b/modules/m_xline.c index f04ef51b..7d8bd0c3 100644 --- a/modules/m_xline.c +++ b/modules/m_xline.c @@ -471,6 +471,7 @@ remove_xline(struct Client *source_p, const char *name, int propagated) { struct ConfItem *aconf; rb_dlink_node *ptr; + time_t now; RB_DLINK_FOREACH(ptr, xline_conf_list.head) { @@ -493,8 +494,9 @@ remove_xline(struct Client *source_p, const char *name, int propagated) "%s has removed the global X-Line for: [%s]", get_oper_name(source_p), name); ilog(L_KLINE, "UX %s %s", get_oper_name(source_p), name); - if(aconf->created < rb_current_time()) - aconf->created = rb_current_time(); + now = rb_current_time(); + if(aconf->created < now) + aconf->created = now; else aconf->created++; aconf->hold = aconf->created; @@ -508,7 +510,7 @@ remove_xline(struct Client *source_p, const char *name, int propagated) 0, (int)(aconf->lifetime - aconf->created)); remove_reject_mask(aconf->host, NULL); - deactivate_conf(aconf, ptr); + deactivate_conf(aconf, ptr, now); return; } else if(propagated && rb_dlink_list_length(&cluster_conf_list)) diff --git a/src/s_conf.c b/src/s_conf.c index a7560982..1a70de25 100644 --- a/src/s_conf.c +++ b/src/s_conf.c @@ -1057,7 +1057,7 @@ find_prop_ban(unsigned int status, const char *user, const char *host) } void -deactivate_conf(struct ConfItem *aconf, rb_dlink_node *ptr) +deactivate_conf(struct ConfItem *aconf, rb_dlink_node *ptr, time_t now) { int i; @@ -1096,7 +1096,7 @@ deactivate_conf(struct ConfItem *aconf, rb_dlink_node *ptr) del_from_resv_hash(aconf->host, aconf); break; } - if (aconf->lifetime != 0 && rb_current_time() < aconf->lifetime) + if (aconf->lifetime != 0 && now < aconf->lifetime) aconf->status |= CONF_ILLEGAL; else { @@ -1132,7 +1132,7 @@ replace_old_ban(struct ConfItem *aconf) aconf->lifetime = aconf->hold; /* Tell deactivate_conf() to destroy it. */ oldconf->lifetime = rb_current_time(); - deactivate_conf(oldconf, ptr); + deactivate_conf(oldconf, ptr, oldconf->lifetime); } } @@ -1142,13 +1142,15 @@ expire_prop_bans(void *list) rb_dlink_node *ptr; rb_dlink_node *next_ptr; struct ConfItem *aconf; + time_t now; + now = rb_current_time(); RB_DLINK_FOREACH_SAFE(ptr, next_ptr, ((rb_dlink_list *) list)->head) { aconf = ptr->data; - if(aconf->lifetime <= rb_current_time() || - (aconf->hold <= rb_current_time() && + if(aconf->lifetime <= now || + (aconf->hold <= now && !(aconf->status & CONF_ILLEGAL))) { /* Alert opers that a TKline expired - Hwy */ @@ -1162,7 +1164,7 @@ expire_prop_bans(void *list) aconf->host ? aconf->host : "*"); /* will destroy or mark illegal */ - deactivate_conf(aconf, ptr); + deactivate_conf(aconf, ptr, now); } } }