X-Git-Url: https://jfr.im/git/solanum.git/blobdiff_plain/5eb10743f91f0f47de6c8e61f5659407643ff2d1..8efff56fdf9f4ce4a3968c74162fed9d8d45c51a:/ircd/reject.c diff --git a/ircd/reject.c b/ircd/reject.c index efff4919..db90d388 100644 --- a/ircd/reject.c +++ b/ircd/reject.c @@ -233,44 +233,51 @@ check_reject(rb_fde_t *F, struct sockaddr *addr) rb_patricia_node_t *pnode; reject_t *rdata; delay_t *ddata; + /* Reject is disabled */ - if(ConfigFileEntry.reject_after_count == 0 || ConfigFileEntry.reject_duration == 0) + if (ConfigFileEntry.reject_after_count == 0 || ConfigFileEntry.reject_duration == 0) return 0; pnode = rb_match_ip(reject_tree, addr); - if(pnode != NULL) + if (pnode == NULL) + return 0; + + rdata = pnode->data; + rdata->time = rb_current_time(); + + if (rdata->count <= (unsigned long)ConfigFileEntry.reject_after_count) + return 0; + + if (rdata->aconf != NULL && rdata->aconf->status & CONF_ILLEGAL) { - rdata = pnode->data; + rb_dlinkDelete(&rdata->rnode, &reject_list); + reject_free(rdata); + rb_patricia_remove(reject_tree, pnode); + return 0; + } - rdata->time = rb_current_time(); - if(rdata->count > (unsigned long)ConfigFileEntry.reject_after_count) - { - ddata = rb_malloc(sizeof(delay_t)); - ServerStats.is_rej++; - rb_setselect(F, RB_SELECT_WRITE | RB_SELECT_READ, NULL, NULL); - if(rdata->aconf) - { - ddata->aconf = rdata->aconf; - ddata->aconf->clients++; - ddata->reason = NULL; - } - else if(rdata->reason) - { - ddata->reason = rdata->reason; - ddata->aconf = NULL; - } - else - { - ddata->aconf = NULL; - ddata->reason = NULL; - } - ddata->F = F; - rb_dlinkAdd(ddata, &ddata->node, &delay_exit); - return 1; - } + ddata = rb_malloc(sizeof(delay_t)); + ServerStats.is_rej++; + rb_setselect(F, RB_SELECT_WRITE | RB_SELECT_READ, NULL, NULL); + if (rdata->aconf) + { + ddata->aconf = rdata->aconf; + ddata->aconf->clients++; + ddata->reason = NULL; } - /* Caller does what it wants */ - return 0; + else if (rdata->reason) + { + ddata->reason = rdata->reason; + ddata->aconf = NULL; + } + else + { + ddata->aconf = NULL; + ddata->reason = NULL; + } + ddata->F = F; + rb_dlinkAdd(ddata, &ddata->node, &delay_exit); + return 1; } int