From: Michael Poole Date: Wed, 26 Jan 2005 21:16:54 +0000 (+0000) Subject: offchannel fixes; more memory verification X-Git-Tag: v1.4.0-rc1~183 X-Git-Url: http://git.pk910.de/?p=srvx.git;a=commitdiff_plain;h=b76e9de89cc343f6d675a9f899fd4bcf94166084 offchannel fixes; more memory verification src/chanserv.c (cmd_register): Do not join channels if the default options include being offchannel. src/common.h: Verify list allocations when appending or removing. src/hash.c (GetUserMode): Verify channel and user list allocations. src/log.c (log_entry_search): Keep pointer to last visited log entry. src/proto-p10.c (mod_chanmode_parse): Fail if trying to change +z when passed MCP_REGISTERED. git-archimport-id: srvx@srvx.net--2005-srvx/srvx--devo--1.3--patch-9 --- diff --git a/ChangeLog b/ChangeLog index 22d3767..05846ca 100644 --- a/ChangeLog +++ b/ChangeLog @@ -2,6 +2,30 @@ # arch-tag: automatic-ChangeLog--srvx@srvx.net--2005-srvx/srvx--devo--1.3 # +2005-01-26 21:16:54 GMT Michael Poole patch-9 + + Summary: + offchannel fixes; more memory verification + Revision: + srvx--devo--1.3--patch-9 + + src/chanserv.c (cmd_register): Do not join channels if the default + options include being offchannel. + + src/common.h: Verify list allocations when appending or removing. + + src/hash.c (GetUserMode): Verify channel and user list allocations. + + src/log.c (log_entry_search): Keep pointer to last visited log entry. + + src/proto-p10.c (mod_chanmode_parse): Fail if trying to change +z when + passed MCP_REGISTERED. + + modified files: + ChangeLog src/chanserv.c src/common.h src/hash.c src/log.c + src/proto-p10.c + + 2005-01-24 17:12:38 GMT Michael Poole patch-8 Summary: diff --git a/src/chanserv.c b/src/chanserv.c index 7f0596f..c1d6f91 100644 --- a/src/chanserv.c +++ b/src/chanserv.c @@ -1662,7 +1662,6 @@ chanserv_get_owned_count(struct handle_info *hi) static CHANSERV_FUNC(cmd_register) { - struct mod_chanmode *change; struct handle_info *handle; struct chanData *cData; struct modeNode *mn; @@ -1752,13 +1751,20 @@ static CHANSERV_FUNC(cmd_register) scan_user_presence(add_channel_user(cData, handle, UL_OWNER, 0, NULL), NULL); cData->modes = chanserv_conf.default_modes; if(off_channel > 0) - cData->modes.modes_set |= MODE_REGISTERED; - change = mod_chanmode_dup(&cData->modes, 1); - change->args[change->argc].mode = MODE_CHANOP; - change->args[change->argc].u.member = AddChannelUser(chanserv, channel); - change->argc++; - mod_chanmode_announce(chanserv, channel, change); - mod_chanmode_free(change); + cData->modes.modes_set |= MODE_REGISTERED; + if (IsOffChannel(cData)) + { + mod_chanmode_announce(chanserv, channel, &cData->modes); + } + else + { + struct mod_chanmode *change = mod_chanmode_dup(&cData->modes, 1); + change->args[change->argc].mode = MODE_CHANOP; + change->args[change->argc].u.member = AddChannelUser(chanserv, channel); + change->argc++; + mod_chanmode_announce(chanserv, channel, change); + mod_chanmode_free(change); + } /* Initialize the channel's max user record. */ cData->max = channel->members.used; @@ -6476,8 +6482,6 @@ chanserv_conf_read(void) else strlist = alloc_string_list(2); chanserv_conf.old_ban_names = strlist; - /* the variable itself is actually declared in proto-common.c; this is equally - * parse issue. */ str = database_get_data(conf_node, "off_channel", RECDB_QSTRING); off_channel = str ? atoi(str) : 0; } diff --git a/src/common.h b/src/common.h index 56928ad..5982512 100644 --- a/src/common.h +++ b/src/common.h @@ -163,6 +163,7 @@ void STRUCTNAME##_init(struct STRUCTNAME *list) {\ list->list = malloc(list->size*sizeof(list->list[0]));\ }\ void STRUCTNAME##_append(struct STRUCTNAME *list, ITEMTYPE new_item) {\ + verify(list->list);\ if (list->used == list->size) {\ list->size = list->size ? (list->size << 1) : 4;\ list->list = realloc(list->list, list->size*sizeof(list->list[0]));\ @@ -171,6 +172,7 @@ void STRUCTNAME##_append(struct STRUCTNAME *list, ITEMTYPE new_item) {\ }\ int STRUCTNAME##_remove(struct STRUCTNAME *list, ITEMTYPE new_item) {\ unsigned int n, found;\ + verify(list->list);\ for (found=n=0; nused; n++) {\ if (list->list[n] == new_item) {\ memmove(list->list+n, list->list+n+1, (list->used-n-1)*sizeof(list->list[n]));\ @@ -183,6 +185,7 @@ int STRUCTNAME##_remove(struct STRUCTNAME *list, ITEMTYPE new_item) {\ void STRUCTNAME##_clean(struct STRUCTNAME *list) {\ list->used = list->size = 0;\ free(list->list);\ + list->list = NULL;\ } /* The longest string that is likely to be produced in English is "10 diff --git a/src/hash.c b/src/hash.c index cb95ce1..f179e96 100644 --- a/src/hash.c +++ b/src/hash.c @@ -694,7 +694,9 @@ GetUserMode(struct chanNode *channel, struct userNode *user) struct modeNode *mn = NULL; verify(channel); + verify(channel->members.list); verify(user); + verify(user->channels.list); if (channel->members.used < user->channels.used) { for (n=0; nmembers.used; n++) { verify(channel->members.list[n]); diff --git a/src/log.c b/src/log.c index f745700..aefadbb 100644 --- a/src/log.c +++ b/src/log.c @@ -719,9 +719,12 @@ log_entry_search(struct logSearch *discrim, entry_search_func esf, void *data) unsigned int matched = 0; if (discrim->type) { - struct logEntry *entry; + struct logEntry *entry, *last; - for (entry = discrim->type->log_oldest; entry; entry = entry->next) { + for (entry = discrim->type->log_oldest, last = NULL; + entry; + last = entry, entry = entry->next) { + verify(entry); if (entry_match(discrim, entry)) { esf(entry, data); if (++matched >= discrim->limit) diff --git a/src/proto-p10.c b/src/proto-p10.c index a237bfa..f602a98 100644 --- a/src/proto-p10.c +++ b/src/proto-p10.c @@ -2085,7 +2085,14 @@ mod_chanmode_parse(struct chanNode *channel, char **modes, unsigned int argc, un case 'r': do_chan_mode(MODE_REGONLY); break; case 's': do_chan_mode(MODE_SECRET); break; case 't': do_chan_mode(MODE_TOPICLIMIT); break; - case 'z': do_chan_mode(MODE_REGISTERED); break; + case 'z': + if (!(flags & MCP_REGISTERED)) { + do_chan_mode(MODE_REGISTERED); + } else { + mod_chanmode_free(change); + return NULL; + } + break; #undef do_chan_mode case 'l': if (add) {