From 85305eb03a55c6eda40783b68f3f728f4a147c06 Mon Sep 17 00:00:00 2001 From: Entrope Date: Wed, 3 Mar 2004 01:47:41 +0000 Subject: [PATCH] Various bug fixes * In ?kickbanall, mod_chanmode_alloc(1) when we only use one arg. * In ?modcmd ... channel_access, accept "0" to mean the same as "none." * In log.c, make a single function to free the oldest log entry for a log_type struct. * Add more checks for cmd==NULL in chanserv.c:eject_user(). git-archimport-id: srvx@srvx.net--2004-srvx/srvx--devo--1.3--patch-22 --- src/chanserv.c | 18 +++++--- src/log.c | 120 +++++++++++++++++++++++-------------------------- src/modcmd.c | 2 +- src/opserv.c | 2 +- 4 files changed, 70 insertions(+), 72 deletions(-) diff --git a/src/chanserv.c b/src/chanserv.c index f7ee36a..8edf117 100644 --- a/src/chanserv.c +++ b/src/chanserv.c @@ -2787,7 +2787,8 @@ eject_user(struct userNode *user, struct chanNode *channel, unsigned int argc, c free(bData->reason); bData->reason = strdup(reason); safestrncpy(bData->owner, (user->handle_info ? user->handle_info->handle : user->nick), sizeof(bData->owner)); - reply("CSMSG_REASON_CHANGE", ban); + if(cmd) + reply("CSMSG_REASON_CHANGE", ban); if(!bData->expires) goto post_add_ban; } @@ -2818,7 +2819,11 @@ eject_user(struct userNode *user, struct chanNode *channel, unsigned int argc, c if(bData->expires) timeq_add(bData->expires, expire_ban, bData); - if(duration) + if(!cmd) + { + /* automated kickban */ + } + else if(duration) reply("CSMSG_BAN_EXTENDED", ban, intervalString(interval, duration)); else reply("CSMSG_BAN_ADDED", name, channel->name); @@ -2826,7 +2831,8 @@ eject_user(struct userNode *user, struct chanNode *channel, unsigned int argc, c goto post_add_ban; } } - reply("CSMSG_REDUNDANT_BAN", name, channel->name); + if(cmd) + reply("CSMSG_REDUNDANT_BAN", name, channel->name); free(ban); return 0; @@ -2875,7 +2881,8 @@ eject_user(struct userNode *user, struct chanNode *channel, unsigned int argc, c if(channel->banlist.used >= MAXBANS) { - reply("CSMSG_BANLIST_FULL", channel->name); + if(cmd) + reply("CSMSG_BANLIST_FULL", channel->name); free(ban); return 0; } @@ -2901,7 +2908,8 @@ eject_user(struct userNode *user, struct chanNode *channel, unsigned int argc, c if(exists && (action == ACTION_BAN)) { - reply("CSMSG_REDUNDANT_BAN", name, channel->name); + if(cmd) + reply("CSMSG_REDUNDANT_BAN", name, channel->name); free(ban); return 0; } diff --git a/src/log.c b/src/log.c index 15d8e14..3530979 100644 --- a/src/log.c +++ b/src/log.c @@ -86,6 +86,7 @@ log_open(const char *name) struct logDestination *ld; char *sep; char type_name[32]; + if ((ld = dict_find(log_dests, name, NULL))) { ld->refcnt++; return ld; @@ -100,9 +101,8 @@ log_open(const char *name) log_module(MAIN_LOG, LOG_ERROR, "Invalid log type for log '%s'.", name); return 0; } - if (!(ld = vtbl->open(sep ? sep+1 : 0))) { + if (!(ld = vtbl->open(sep ? sep+1 : 0))) return 0; - } ld->name = strdup(name); dict_insert(log_dests, ld->name, ld); ld->refcnt = 1; @@ -115,20 +115,17 @@ logList_open(struct logList *ll, struct record_data *rd) struct logDestination *ld; unsigned int ii; - if (!ll->size) { + if (!ll->size) logList_init(ll); - } switch (rd->type) { case RECDB_QSTRING: - if ((ld = log_open(rd->d.qstring))) { + if ((ld = log_open(rd->d.qstring))) logList_append(ll, ld); - } break; case RECDB_STRING_LIST: for (ii=0; iid.slist->used; ++ii) { - if ((ld = log_open(rd->d.slist->list[ii]))) { + if ((ld = log_open(rd->d.slist->list[ii]))) logList_append(ll, ld); - } } break; default: @@ -141,9 +138,8 @@ logList_join(struct logList *target, const struct logList *source) { unsigned int ii, jj, kk; - if (!source->used) { + if (!source->used) return; - } jj = target->used; target->used += source->used; target->size += source->used; @@ -198,17 +194,27 @@ close_logs(void) } } +static void +log_type_free_oldest(struct log_type *lt) +{ + struct logEntry *next; + + if (!lt->log_oldest) + return; + next = lt->log_oldest->next; + free(lt->log_oldest->default_desc); + free(lt->log_oldest); + lt->log_oldest = next; + lt->log_count--; +} + static void log_type_free(void *ptr) { struct log_type *lt = ptr; - struct logEntry *le, *next; - - for (le = lt->log_oldest; le; le = next) { - next = le->next; - free(le->default_desc); - free(le); - } + + while (lt->log_oldest) + log_type_free_oldest(lt); free(lt); } @@ -248,7 +254,8 @@ log_parse_logset(char *buffer, struct string_list *slist) slist->used = 0; while (buffer) { char *cont = strchr(buffer, ','); - if (cont) *cont++ = 0; + if (cont) + *cont++ = 0; string_list_append(slist, strdup(buffer)); buffer = cont; } @@ -272,11 +279,10 @@ log_parse_sevset(char *buffer, char targets[LOG_NUM_SEVERITIES]) targets[bound] = 1; } } else if (buffer[0] == '<') { - if (buffer[1] == '=') { + if (buffer[1] == '=') bound = find_severity(buffer+2) + 1; - } else { + else bound = find_severity(buffer+1); - } for (first = 1; bound > 0; bound--) { /* make people explicitly specify replay targets */ if (bound != LOG_REPLAY || first) { @@ -285,11 +291,10 @@ log_parse_sevset(char *buffer, char targets[LOG_NUM_SEVERITIES]) } } } else if (buffer[0] == '>') { - if (buffer[1] == '=') { + if (buffer[1] == '=') bound = find_severity(buffer+2); - } else { + else bound = find_severity(buffer+1) + 1; - } for (first = 1; bound < LOG_NUM_SEVERITIES; bound++) { /* make people explicitly specify replay targets */ if (bound != LOG_REPLAY || first) { @@ -323,9 +328,11 @@ log_parse_options(struct log_type *type, struct dict *conf) { const char *opt; opt = database_get_data(conf, "max_age", RECDB_QSTRING); - if (opt) type->max_age = ParseInterval(opt); + if (opt) + type->max_age = ParseInterval(opt); opt = database_get_data(conf, "max_count", RECDB_QSTRING); - if (opt) type->max_count = strtoul(opt, NULL, 10); + if (opt) + type->max_count = strtoul(opt, NULL, 10); } static void @@ -375,9 +382,8 @@ log_conf_read(void) } } } - if (log_debugged) { + if (log_debugged) log_debug(); - } } void @@ -391,9 +397,8 @@ log_debug(void) logList_init(&target); logList_append(&target, log_stdout); - for (sev = 0; sev < LOG_NUM_SEVERITIES; ++sev) { + for (sev = 0; sev < LOG_NUM_SEVERITIES; ++sev) logList_join(&log_default->logs[sev], &target); - } logList_close(&target); log_debugged = 1; @@ -427,11 +432,13 @@ log_register_type(const char *name, const char *default_log) /* If any severity level was unspecified in the config, use the default. */ dest = NULL; for (sev = 0; sev < LOG_NUM_SEVERITIES; ++sev) { - if (sev == LOG_REPLAY) continue; /* never default LOG_REPLAY */ + if (sev == LOG_REPLAY) + continue; /* never default LOG_REPLAY */ if (!type->logs[sev].size) { logList_init(&type->logs[sev]); if (!dest) { - if (!(dest = log_open(default_log))) break; + if (!(dest = log_open(default_log))) + break; dest->refcnt--; } logList_append(&type->logs[sev], dest); @@ -459,15 +466,12 @@ log_audit(struct log_type *type, enum log_severity sev, struct userNode *user, s } /* Allocate and fill in the log entry */ size = sizeof(*entry) + strlen(user->nick) + strlen(command) + 2; - if (user->handle_info) { + if (user->handle_info) size += strlen(user->handle_info->handle) + 1; - } - if (channel_name) { + if (channel_name) size += strlen(channel_name) + 1; - } - if (flags & AUDIT_HOSTMASK) { + if (flags & AUDIT_HOSTMASK) size += strlen(user->ident) + strlen(user->hostname) + 2; - } entry = calloc(1, size); str_next = (char*)(entry + 1); entry->time = now; @@ -507,29 +511,18 @@ log_audit(struct log_type *type, enum log_severity sev, struct userNode *user, s /* insert into the linked list */ entry->next = 0; entry->prev = type->log_newest; - if (type->log_newest) { + if (type->log_newest) type->log_newest->next = entry; - } else { + else type->log_oldest = entry; - } type->log_newest = entry; type->log_count++; /* remove old elements from the linked list */ - while (type->log_count > type->max_count) { - struct logEntry *next = type->log_oldest->next; - free(type->log_oldest->default_desc); - free(type->log_oldest); - type->log_oldest = next; - type->log_count--; - } - while (type->log_oldest && (type->log_oldest->time + type->max_age < (unsigned long)now)) { - struct logEntry *next = type->log_oldest->next; - free(type->log_oldest->default_desc); - free(type->log_oldest); - type->log_oldest = next; - type->log_count--; - } + while (type->log_count > type->max_count) + log_type_free_oldest(type); + while (type->log_oldest && (type->log_oldest->time + type->max_age < (unsigned long)now)) + log_type_free_oldest(type); if (type->log_oldest) type->log_oldest->prev = 0; else @@ -635,17 +628,15 @@ log_discrim_create(struct userNode *service, struct userNode *user, unsigned int } else if (!irccasecmp(argv[ii], "age")) { const char *cmp = argv[++ii]; if (cmp[0] == '<') { - if (cmp[1] == '=') { + if (cmp[1] == '=') discrim->min_time = now - ParseInterval(cmp+2); - } else { + else discrim->min_time = now - (ParseInterval(cmp+1) - 1); - } } else if (cmp[0] == '>') { - if (cmp[1] == '=') { + if (cmp[1] == '=') discrim->max_time = now - ParseInterval(cmp+2); - } else { + else discrim->max_time = now - (ParseInterval(cmp+1) - 1); - } } else { discrim->min_time = now - ParseInterval(cmp+2); } @@ -887,13 +878,12 @@ ldStd_open(const char *args) { ld->fname = strdup(args); /* Print to stderr if given "err" and default to stdout otherwise. */ - if (atoi(args)) { + if (atoi(args)) ld->output = fdopen(atoi(args), "a"); - } else if (!strcasecmp(args, "err")) { + else if (!strcasecmp(args, "err")) ld->output = stdout; - } else { + else ld->output = stderr; - } return &ld->base; } diff --git a/src/modcmd.c b/src/modcmd.c index 1cb8399..d4b59fb 100644 --- a/src/modcmd.c +++ b/src/modcmd.c @@ -337,7 +337,7 @@ svccmd_configure(struct svccmd *cmd, struct userNode *user, struct userNode *bot return 1; } else if (!irccasecmp(param, "channel_level") || !irccasecmp(param, "channel_access") || !irccasecmp(param, "access")) { unsigned short ul; - if (!irccasecmp(value, "none")) { + if (!irccasecmp(value, "none") || !irccasecmp(value, "0")) { cmd->min_channel_access = 0; return 1; } else if ((ul = user_level_from_name(value, UL_OWNER)) > 0) { diff --git a/src/opserv.c b/src/opserv.c index 0fb5fd2..ed09ccb 100644 --- a/src/opserv.c +++ b/src/opserv.c @@ -1039,7 +1039,7 @@ static MODCMD_FUNC(cmd_kickbanall) change->args[1].mode = MODE_BAN; change->args[1].hostmask = "*!*@*"; } else { - change = mod_chanmode_alloc(2); + change = mod_chanmode_alloc(1); change->args[0].mode = MODE_BAN; change->args[0].hostmask = "*!*@*"; } -- 2.20.1