offchannel fixes; more memory verification
authorMichael Poole <mdpoole@troilus.org>
Wed, 26 Jan 2005 21:16:54 +0000 (21:16 +0000)
committerMichael Poole <mdpoole@troilus.org>
Wed, 26 Jan 2005 21:16:54 +0000 (21:16 +0000)
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

ChangeLog
src/chanserv.c
src/common.h
src/hash.c
src/log.c
src/proto-p10.c

index 22d3767aafae047f37474588994c91011cbdb7dd..05846ca326f3a0de842d33302f2242161b298ac4 100644 (file)
--- 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 <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:
index 7f0596fd944a9ef8a1de6108a5e8e06b3a727867..c1d6f9124ec950e86630a91afe20fcb1a2d49883 100644 (file)
@@ -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;
 }
index 56928adb356740755d547de5ea41ac3ae583d54e..5982512fe3670eda84f87721e133e8193342ed56 100644 (file)
@@ -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; 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]));\
@@ -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
index cb95ce16ef1b1aa0d585c8303475bd71f82e00b7..f179e96a88cac469d5cd189e4bae0baa93113bc6 100644 (file)
@@ -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; n<channel->members.used; n++) {
             verify(channel->members.list[n]);
index f7457006c80dc00115a25d1c4eaac09e71ee60e1..aefadbb86496e05931bcc60b8400415ceaa7fbdd 100644 (file)
--- 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)
index a237bfaf45fb2b436ec17582be67dd104cc9487b..f602a98a958cc99c9c6ee4b4a77ff1a7b6de2209 100644 (file)
@@ -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) {