]> jfr.im git - irc/rizon/plexus4.git/commitdiff
m_nick: fix tripped assert in watch_check_hash from s2s NICK with 4-8 arguments
authorAdam <redacted>
Sun, 16 Jul 2017 02:51:26 +0000 (22:51 -0400)
committerAdam <redacted>
Sun, 16 Jul 2017 02:51:26 +0000 (22:51 -0400)
modules/core/m_nick.c

index c532d46f380fbddcef4140378561400d452539d5..01dcd1acde1782ac8916cb7f5c435d339b64a416 100644 (file)
@@ -336,31 +336,29 @@ nick_from_server(struct Client *client_p, struct Client *source_p, int parc,
     strlcpy(source_p->name, nick, sizeof(source_p->name));
     hash_add_client(source_p);
 
-    if (parc > 8)
-    {
-      const char *m;
-
-      /* parse usermodes */
-      for (m = &parv[4][1]; *m; ++m)
-      {
-        unsigned int flag = user_modes[(unsigned char)*m];
+    const char *m;
 
-        if ((flag & UMODE_INVISIBLE) && !HasUMode(source_p, UMODE_INVISIBLE))
-          ++Count.invisi;
-        if ((flag & UMODE_OPER) && !HasUMode(source_p, UMODE_OPER))
-          ++Count.oper;
-        if (flag & UMODE_SERVICE)
-          AddFlag(source_p, FLAGS_SERVICE);
+    /* parse usermodes */
+    for (m = &parv[4][1]; *m; ++m)
+    {
+      unsigned int flag = user_modes[(unsigned char)*m];
 
-        source_p->umodes |= flag;
-      }
+      if ((flag & UMODE_INVISIBLE) && !HasUMode(source_p, UMODE_INVISIBLE))
+        ++Count.invisi;
+      if ((flag & UMODE_OPER) && !HasUMode(source_p, UMODE_OPER))
+        ++Count.oper;
+      if (flag & UMODE_SERVICE)
+        AddFlag(source_p, FLAGS_SERVICE);
 
-      register_remote_user(source_p, parv[5], parv[6],
-                           parv[7], parv[9]);
-      return;
+      source_p->umodes |= flag;
     }
+
+    register_remote_user(source_p, parv[5], parv[6],
+                         parv[7], parv[9]);
+    return;
   }
-  else if (source_p->name[0])
+
+  if (source_p->name[0])
   {
     samenick = !irccmp(source_p->name, nick);
 
@@ -820,8 +818,12 @@ ms_nick(struct Client *client_p, struct Client *source_p,
   if (parc < 3 || EmptyString(parv[parc - 1]))
     return;
 
-  if (parc >= 11)
+  if (parc == 11)
   {
+    if (!IsServer(source_p))
+      /* users can't introduce other users */
+      return;
+
     struct Client *server_p = hash_find_server(parv[7]);
 
     if (server_p == NULL)
@@ -839,11 +841,8 @@ ms_nick(struct Client *client_p, struct Client *source_p,
         check_clean_host(client_p, parv[1], parv[6], server_p))
       return;
 
-    if (IsServer(source_p))
-      newts = atol(parv[3]);
-
-    if (IsServer(source_p))
-      svsid = parv[8];
+    newts = atol(parv[3]);
+    svsid = parv[8];
   }
   else if (parc == 3)
   {
@@ -857,6 +856,11 @@ ms_nick(struct Client *client_p, struct Client *source_p,
 
     newts = atol(parv[2]);
   }
+  else
+  {
+      exit_client(client_p, &me, "Malformed NICK");
+      return;
+  }
 
   /* If the nick doesnt exist, allow it and process like normal */
   if ((target_p = hash_find_client(parv[1])) == NULL)