]> jfr.im git - irc/hexchat/hexchat.git/commitdiff
Avoid prioritising MODE queries for channels with hyphens in their name
authorJames Clarke <redacted>
Wed, 1 Jan 2020 20:37:39 +0000 (20:37 +0000)
committerPatrick <redacted>
Thu, 2 Jan 2020 00:39:11 +0000 (16:39 -0800)
If a user has a large number of channels containing hyphens in their
names, the initial MODE queries will have the same high priority as any
PINGs, and so will block the PINGs from being sent, causing the
connection to time out due to a lack of PONGs received.

src/common/server.c

index 3db0a9635fc5a1d1b6099290561cd439b8c0f8ad..f7fa8b968b7f06e6b0bc39496248e27c9a668cc0 100644 (file)
@@ -200,13 +200,35 @@ tcp_send_len (server *serv, char *buf, int len)
        }
        else
        {
-               /* WHO/MODE get the lowest priority */
-               if (g_ascii_strncasecmp (dbuf + 1, "WHO ", 4) == 0 ||
-               /* but only MODE queries, not changes */
-                       (g_ascii_strncasecmp (dbuf + 1, "MODE", 4) == 0 &&
-                        strchr (dbuf, '-') == NULL &&
-                        strchr (dbuf, '+') == NULL))
+               /* WHO gets the lowest priority */
+               if (g_ascii_strncasecmp (dbuf + 1, "WHO ", 4) == 0)
                        dbuf[0] = 0;
+               /* as do MODE queries (but not changes) */
+               else if (g_ascii_strncasecmp (dbuf + 1, "MODE ", 5) == 0)
+               {
+                       char *mode_str, *mode_str_end, *loc;
+                       /* skip spaces before channel/nickname */
+                       for (mode_str = dbuf + 5; *mode_str == ' '; ++mode_str);
+                       /* skip over channel/nickname */
+                       mode_str = strchr (mode_str, ' ');
+                       if (mode_str)
+                       {
+                               /* skip spaces before mode string */
+                               for (; *mode_str == ' '; ++mode_str);
+                               /* find spaces after end of mode string */
+                               mode_str_end = strchr (mode_str, ' ');
+                               /* look for +/- within the mode string */
+                               loc = strchr (mode_str, '-');
+                               if (loc && (!mode_str_end || loc < mode_str_end))
+                                       goto keep_priority;
+                               loc = strchr (mode_str, '+');
+                               if (loc && (!mode_str_end || loc < mode_str_end))
+                                       goto keep_priority;
+                       }
+                       dbuf[0] = 0;
+keep_priority:
+                       ;
+               }
        }
 
        serv->outbound_queue = g_slist_append (serv->outbound_queue, dbuf);