Просмотр исходного кода

* Flush channel mode queues in clear_channel()

This also fixes queued cookies persisting through a jump.
Bryan Drewery 16 лет назад
Родитель
Сommit
a020912e68
2 измененных файлов с 10 добавлено и 6 удалено
  1. 0 6
      src/mod/channels.mod/channels.c
  2. 10 0
      src/mod/channels.mod/tclchan.c

+ 0 - 6
src/mod/channels.mod/channels.c

@@ -693,8 +693,6 @@ static inline bool chanset_unlink(struct chanset_t *chan)
  */
 void remove_channel(struct chanset_t *chan)
 {
-   int i;
-
    if (chan != chanset_default) {
      irc_log(chan, "Parting");
      /* Remove the channel from the list, so that noone can pull it
@@ -721,10 +719,6 @@ void remove_channel(struct chanset_t *chan)
      noshare = 0;
    }
    free(chan->channel.key);
-   for (i = 0; i < MODES_PER_LINE_MAX && chan->cmode[i].op; i++)
-     free(chan->cmode[i].op);
-   for (i = 0; i < (MODES_PER_LINE_MAX - 1) && chan->ccmode[i].op; i++)
-     free(chan->ccmode[i].op);
    if (chan->key)
      free(chan->key);
    if (chan->rmkey)

+ 10 - 0
src/mod/channels.mod/tclchan.c

@@ -918,6 +918,16 @@ void clear_channel(struct chanset_t *chan, bool reset)
 
   if (reset)
     init_channel(chan, 1);
+  for (size_t i = 0; i < MODES_PER_LINE_MAX; ++i) {
+    if (chan->cmode[i].op) {
+      free(chan->cmode[i].op);
+      chan->cmode[i].op = NULL;
+    }
+    if (chan->ccmode[i].op) {
+      free(chan->ccmode[i].op);
+      chan->ccmode[i].op = NULL;
+    }
+  }
 }
 
 /* Create new channel and parse commands.