# arch-tag: automatic-ChangeLog--srvx@srvx.net--2005-srvx/srvx--devo--1.3
#
+2005-01-26 21:16:54 GMT Michael Poole <mdpoole@troilus.org> 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 <mdpoole@troilus.org> patch-8
Summary:
static CHANSERV_FUNC(cmd_register)
{
- struct mod_chanmode *change;
struct handle_info *handle;
struct chanData *cData;
struct modeNode *mn;
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;
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;
}
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]));\
}\
int STRUCTNAME##_remove(struct STRUCTNAME *list, ITEMTYPE new_item) {\
unsigned int n, found;\
+ verify(list->list);\
for (found=n=0; n<list->used; n++) {\
if (list->list[n] == new_item) {\
memmove(list->list+n, list->list+n+1, (list->used-n-1)*sizeof(list->list[n]));\
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
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; n<channel->members.used; n++) {
verify(channel->members.list[n]);
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)
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) {