Browse Source

* Port [3353] to 1.2.14
* Fix flaw in gotpart



svn: 3354

Bryan Drewery 19 years ago
parent
commit
7ed31d5071
2 changed files with 21 additions and 17 deletions
  1. 7 16
      src/mod/irc.mod/chan.c
  2. 14 1
      src/mod/irc.mod/irc.h

+ 7 - 16
src/mod/irc.mod/chan.c

@@ -864,16 +864,6 @@ static void resetmasks(struct chanset_t *chan, masklist *m, maskrec *mrec, maskr
   }
   }
 }
 }
 
 
-void check_this_mask(const char type, struct chanset_t *chan, char *mask, bool sticky)
-{
-  if (type == 'b')
-    check_this_ban(chan, mask, sticky);
-  else if (type == 'e')
-    check_this_exempt(chan, mask, sticky);
-  else if (type == 'I')
-    check_this_invite(chan, mask, sticky);
-}
-
 void check_this_ban(struct chanset_t *chan, char *banmask, bool sticky)
 void check_this_ban(struct chanset_t *chan, char *banmask, bool sticky)
 {
 {
   if (!me_op(chan))
   if (!me_op(chan))
@@ -2586,9 +2576,6 @@ static int gotpart(char *from, char *msg)
   strcpy(uhost, from);
   strcpy(uhost, from);
   nick = splitnick(&uhost);
   nick = splitnick(&uhost);
 
 
-  memberlist* m = ismember(chan, nick);
-  struct userrec *u = m->user;
-
   if (chan && !shouldjoin(chan) && match_my_nick(nick)) {
   if (chan && !shouldjoin(chan) && match_my_nick(nick)) {
     irc_log(chan, "Parting");    
     irc_log(chan, "Parting");    
     clear_channel(chan, 1);
     clear_channel(chan, 1);
@@ -2596,6 +2583,9 @@ static int gotpart(char *from, char *msg)
     return 0;
     return 0;
   }
   }
   if (chan && !channel_pending(chan)) {
   if (chan && !channel_pending(chan)) {
+    memberlist* m = ismember(chan, nick);
+    struct userrec *u = (m && m->user) ? m->user : get_user_by_host(from);
+
     if (!channel_active(chan)) {
     if (!channel_active(chan)) {
       /* whoa! */
       /* whoa! */
       putlog(LOG_ERRORS, "*", "confused bot: guess I'm on %s and didn't realize it", chan->dname);
       putlog(LOG_ERRORS, "*", "confused bot: guess I'm on %s and didn't realize it", chan->dname);
@@ -2605,9 +2595,10 @@ static int gotpart(char *from, char *msg)
     }
     }
     set_handle_laston(chan->dname, u, now);
     set_handle_laston(chan->dname, u, now);
 
 
-    detect_chan_flood(nick, m->userhost, from, chan, FLOOD_JOIN, NULL);
-
-    killmember(chan, nick);
+    if (m) {
+      detect_chan_flood(nick, m->userhost, from, chan, FLOOD_JOIN, NULL);
+      killmember(chan, nick);
+    }
     if (msg[0])
     if (msg[0])
       irc_log(chan, "Part: %s (%s) [%s]", nick, uhost, msg);
       irc_log(chan, "Part: %s (%s) [%s]", nick, uhost, msg);
     else
     else

+ 14 - 1
src/mod/irc.mod/irc.h

@@ -102,10 +102,23 @@ void real_add_mode(struct chanset_t *, const char, const char, const char *, boo
 #define add_mode(chan, pls, mode, nick) real_add_mode(chan, pls, mode, nick, 0)
 #define add_mode(chan, pls, mode, nick) real_add_mode(chan, pls, mode, nick, 0)
 #define add_cookie(chan, nick) real_add_mode(chan, '+', 'o', nick, 1)
 #define add_cookie(chan, nick) real_add_mode(chan, '+', 'o', nick, 1)
 bool me_op(struct chanset_t *);
 bool me_op(struct chanset_t *);
-void check_this_mask(const char, struct chanset_t *, char *, bool);
+
 void check_this_ban(struct chanset_t *, char *, bool);
 void check_this_ban(struct chanset_t *, char *, bool);
 void check_this_exempt(struct chanset_t *, char *, bool);
 void check_this_exempt(struct chanset_t *, char *, bool);
 void check_this_invite(struct chanset_t *, char *, bool);
 void check_this_invite(struct chanset_t *, char *, bool);
+
+inline void check_this_mask(const char type, struct chanset_t *chan, char *mask, bool sticky)
+{
+  if (channel_active(chan)) {
+    if (type == 'b')
+      check_this_ban(chan, mask, sticky);
+    else if (type == 'e')
+      check_this_exempt(chan, mask, sticky);
+    else if (type == 'I')
+      check_this_invite(chan, mask, sticky);
+  }
+}
+
 void check_this_user(char *, int, char *);
 void check_this_user(char *, int, char *);
 void raise_limit(struct chanset_t *);
 void raise_limit(struct chanset_t *);
 void enforce_closed(struct chanset_t *);
 void enforce_closed(struct chanset_t *);