fixed crash in multiple commands if createTempUser returns NULL
authorpk910 <philipp@zoelle1.de>
Sun, 8 Jan 2012 04:47:47 +0000 (05:47 +0100)
committerpk910 <philipp@zoelle1.de>
Sun, 8 Jan 2012 04:50:31 +0000 (05:50 +0100)
17 files changed:
src/IRCParser.c
src/UserNode.c
src/cmd_global_register.c
src/cmd_global_setaccess.c
src/cmd_neonserv_access.c
src/cmd_neonserv_adduser.c
src/cmd_neonserv_assignrank.c
src/cmd_neonserv_clvl.c
src/cmd_neonserv_deluser.c
src/cmd_neonserv_giveowner.c
src/cmd_neonserv_invite.c
src/cmd_neonserv_myaccess.c
src/cmd_neonserv_noregister.c
src/cmd_neonserv_suspend.c
src/cmd_neonserv_unban.c
src/cmd_neonserv_unsuspend.c
src/cmd_neonserv_wipeinfo.c

index c1dbf6bca825450332036be9c19114fdc10dbe7a..6e6c61318a7a2104920bc1b331a4c35f766559b9 100644 (file)
@@ -396,6 +396,7 @@ static IRC_CMD(raw_kick) {
     if(isUserOnChan(target, chan) && (chan->flags & CHANFLAG_RECEIVED_USERLIST)) {
         if(user == NULL) {
             user = createTempUser(from);
+                       if(!user) return 0;
             user->flags |= USERFLAG_ISTMPUSER;
         }
         struct ChanUser *chanuser = getChanUser(target, chan);
@@ -425,6 +426,7 @@ static IRC_CMD(raw_topic) {
     if(chan->chanbot != client->user) return 1; //just ignore it to prevent event duplicates
     if(user == NULL) {
         user = createTempUser(from);
+               if(!user) return 0;
         user->flags |= USERFLAG_ISTMPUSER;
     }
     event_topic(user, chan, argv[1]);
@@ -437,6 +439,7 @@ static IRC_CMD(raw_privmsg) {
     struct UserNode *user = getUserByMask(from);
     if(user == NULL) {
         user = createTempUser(from);
+               if(!user) return 0;
         user->flags |= USERFLAG_ISTMPUSER;
     }
     if(!stricmp(user->nick, "*status") && !match("Disconnected from IRC.*", argv[1])) {
@@ -494,6 +497,7 @@ static IRC_CMD(raw_notice) {
     struct UserNode *user = getUserByMask(from);
     if(user == NULL) {
         user = createTempUser(from);
+               if(!user) return 0;
         user->flags |= USERFLAG_ISTMPUSER;
     }
     if(argv[0][0] == '#') { //Channel notice
@@ -548,6 +552,7 @@ static IRC_CMD(raw_invite) {
     struct UserNode *user = getUserByMask(from);
     if(user == NULL) {
         user = createTempUser(from);
+               if(!user) return 0;
         user->flags |= USERFLAG_ISTMPUSER;
     }
     event_invite(client, user, argv[1]);
@@ -559,6 +564,7 @@ static IRC_CMD(raw_mode) {
     struct UserNode *user = getUserByMask(from);
     if(user == NULL) {
         user = createTempUser(from);
+               if(!user) return 0;
         user->flags |= USERFLAG_ISTMPUSER;
     }
     if(argv[0][0] == '#') {
index df4edebfe73f54a55e5d731ef957f9085baf1695..739722ad4009d8755d512b62f8aa50546588b44d 100644 (file)
@@ -244,6 +244,9 @@ struct UserNode* createTempUser(const char *mask) {
     for(i = 0; i < strlen(mask)+1; i++) {
         if(cmask[i] == '!') {
             cmask[i] = 0;
+                       if(!is_valid_nick(cmask)) {
+                               return NULL;
+                       }
             user = malloc(sizeof(*user));
             if (!user)
             {
index 9132484b362a445ad4a1ddcbdda3398f4a11c381..45e5a759cf25312ceb1f0ccd00b8fd076dc24165 100644 (file)
@@ -114,6 +114,10 @@ CMD_BIND(global_cmd_register) {
         struct UserNode *cuser = getUserByNick(argv[1]);
         if(!cuser) {
             cuser = createTempUser(argv[1]);
+                       if(!cuser) {
+                reply(getTextBot(), user, "NS_USER_UNKNOWN", argv[1]);
+                return;
+            }
             cuser->flags |= USERFLAG_ISTMPUSER;
         }
         if(cuser->flags & USERFLAG_ISAUTHED) {
index d11fda6b8ee9aebc98d1858140c34f6e0f15356c..0458bd660ebe4369dce177bc774fe1021b04ac95 100644 (file)
@@ -75,6 +75,10 @@ CMD_BIND(global_cmd_setaccess) {
         struct UserNode *cuser = getUserByNick(argv[0]);
         if(!cuser) {
             cuser = createTempUser(argv[0]);
+                       if(!cuser) {
+                reply(getTextBot(), user, "NS_USER_UNKNOWN", argv[0]);
+                return;
+            }
             cuser->flags |= USERFLAG_ISTMPUSER;
         }
         if(cuser->flags & USERFLAG_ISAUTHED) {
index 7636c79a98ab5655e106fa76d52bb55297098354..d036bf8bceb69251e6174c6c055bd52f4c1853b1 100644 (file)
@@ -56,6 +56,10 @@ CMD_BIND(neonserv_cmd_access) {
         struct UserNode *cuser = getUserByNick(argv[0]);
         if(!cuser) {
             cuser = createTempUser(argv[0]);
+            if(!cuser) {
+                reply(getTextBot(), user, "NS_USER_UNKNOWN", argv[0]);
+                return;
+            }
             cuser->flags |= USERFLAG_ISTMPUSER;
         }
         if(cuser->flags & USERFLAG_ISAUTHED) {
index 50ebd95bd1954e43aa701d05391f650716fb3c28..8eccf67873eb368ec1ac0f9ec311e8626c109013 100644 (file)
@@ -80,6 +80,10 @@ CMD_BIND(neonserv_cmd_adduser) {
         struct UserNode *cuser = getUserByNick(argv[0]);
         if(!cuser) {
             cuser = createTempUser(argv[0]);
+                       if(!cuser) {
+                reply(getTextBot(), user, "NS_USER_UNKNOWN", argv[0]);
+                return;
+            }
             cuser->flags |= USERFLAG_ISTMPUSER;
         }
         if(cuser->flags & USERFLAG_ISAUTHED) {
index fb82bf042d84bf3b9abce038515f330e696f53a5..4fedaf85089e5fc508cfefba62991cef49be18c6 100644 (file)
@@ -74,6 +74,10 @@ CMD_BIND(neonserv_cmd_assignrank) {
         struct UserNode *cuser = getUserByNick(argv[0]);
         if(!cuser) {
             cuser = createTempUser(argv[0]);
+                       if(!cuser) {
+                reply(getTextBot(), user, "NS_USER_UNKNOWN", argv[0]);
+                return;
+            }
             cuser->flags |= USERFLAG_ISTMPUSER;
         }
         if(cuser->flags & USERFLAG_ISAUTHED) {
index 4bb043e4a7892c808d095ea88f57aae5d09607de..a541c3d108a1368669fb0348209ce69a43c3b6ae 100644 (file)
@@ -56,6 +56,10 @@ CMD_BIND(neonserv_cmd_clvl) {
         struct UserNode *cuser = getUserByNick(argv[0]);
         if(!cuser) {
             cuser = createTempUser(argv[0]);
+                       if(!cuser) {
+                reply(getTextBot(), user, "NS_USER_UNKNOWN", argv[0]);
+                return;
+            }
             cuser->flags |= USERFLAG_ISTMPUSER;
         }
         if(cuser->flags & USERFLAG_ISAUTHED) {
index 184de91f08d8e9cfddba4feed54a34c9873eb555..5188f01c7f8ef5d19b4e3b547556a250e2cc941e 100644 (file)
@@ -40,6 +40,10 @@ CMD_BIND(neonserv_cmd_deluser) {
         struct UserNode *cuser = getUserByNick(argv[0]);
         if(!cuser) {
             cuser = createTempUser(argv[0]);
+                       if(!cuser) {
+                reply(getTextBot(), user, "NS_USER_UNKNOWN", argv[0]);
+                return;
+            }
             cuser->flags |= USERFLAG_ISTMPUSER;
         }
         if(cuser->flags & USERFLAG_ISAUTHED) {
index bc789c7d44b8815fd83f6777b9800fbf913d999d..9cf5ae750941c0439e6ac25563a089e2fcef2e23 100644 (file)
@@ -55,6 +55,10 @@ CMD_BIND(neonserv_cmd_giveowner) {
         struct UserNode *cuser = getUserByNick(argv[0]);
         if(!cuser) {
             cuser = createTempUser(argv[0]);
+                       if(!cuser) {
+                reply(getTextBot(), user, "NS_USER_UNKNOWN", argv[0]);
+                return;
+            }
             cuser->flags |= USERFLAG_ISTMPUSER;
         }
         if(cuser->flags & USERFLAG_ISAUTHED) {
index 954d9117c934f0a3881ad7edd629e07118ff2b82..60c00a219aea884d0dceb8d8e51a8c28a59e1e81 100644 (file)
@@ -53,6 +53,10 @@ CMD_BIND(neonserv_cmd_invite) {
     struct UserNode *cuser = getUserByNick(argv[0]);
     if(!cuser) {
         cuser = createTempUser(argv[0]);
+               if(!cuser) {
+            reply(getTextBot(), user, "NS_USER_UNKNOWN", argv[0]);
+            return;
+        }
         cuser->flags |= USERFLAG_ISTMPUSER;
     } else if(getChanUser(cuser, chan)) {
         reply(getTextBot(), user, "NS_INVITE_ON_CHAN", cuser->nick, chan->name);
index c37f0f8b0452f37a870ad497b89fb551f884c66e..03ea9421f62684fe4a1b9236b872ee32a914f3e8 100644 (file)
@@ -67,6 +67,10 @@ CMD_BIND(neonserv_cmd_myaccess) {
         struct UserNode *cuser = getUserByNick(argv[0]);
         if(!cuser) {
             cuser = createTempUser(argv[0]);
+                       if(!cuser) {
+                reply(getTextBot(), user, "NS_USER_UNKNOWN", argv[0]);
+                return;
+            }
             cuser->flags |= USERFLAG_ISTMPUSER;
         }
         if(cuser->flags & USERFLAG_ISAUTHED) {
index ab1b432eee83ecce7118e91692ad7f0dd0d6078d..f0ba38020b2316e93c89bb09bfd112d4c98bf2fe 100644 (file)
@@ -87,6 +87,10 @@ CMD_BIND(neonserv_cmd_noregister) {
         struct UserNode *cuser = getUserByNick(argv[0]);
         if(!cuser) {
             cuser = createTempUser(argv[0]);
+                       if(!cuser) {
+                reply(getTextBot(), user, "NS_USER_UNKNOWN", argv[0]);
+                return;
+            }
             cuser->flags |= USERFLAG_ISTMPUSER;
         }
         if(cuser->flags & USERFLAG_ISAUTHED) {
index d6cb87a68f11fc658db485c0e76addd97a130d70..b6d18b4004808ba6744c1aef3f05583cc3a1f12a 100644 (file)
@@ -40,6 +40,10 @@ CMD_BIND(neonserv_cmd_suspend) {
         struct UserNode *cuser = getUserByNick(argv[0]);
         if(!cuser) {
             cuser = createTempUser(argv[0]);
+                       if(!cuser) {
+                reply(getTextBot(), user, "NS_USER_UNKNOWN", argv[0]);
+                return;
+            }
             cuser->flags |= USERFLAG_ISTMPUSER;
         }
         if(cuser->flags & USERFLAG_ISAUTHED) {
index 53b8919b0d749172c974b875540cc2fddd4927c6..3df515059fe0ea77ae8f9790070e148866903e6d 100644 (file)
@@ -64,6 +64,9 @@ CMD_BIND(neonserv_cmd_unban) {
             struct UserNode *cuser = getUserByNick(mask);
             if(!cuser) {
                 cuser = createTempUser(mask);
+                               if(!cuser) {
+                                       break; //internal bot error
+                               }
                 cuser->flags |= USERFLAG_ISTMPUSER;
                 get_userauth(cuser, neonserv_cmd_unban_userauth_lookup, cache);
                 cache->pending_whos++;
index c319d1dbe0715a28554a6895f2e64c823459bf0d..4053950e4b6c29aab397bb960257d47be227d077 100644 (file)
@@ -40,6 +40,10 @@ CMD_BIND(neonserv_cmd_unsuspend) {
         struct UserNode *cuser = getUserByNick(argv[0]);
         if(!cuser) {
             cuser = createTempUser(argv[0]);
+                       if(!cuser) {
+                reply(getTextBot(), user, "NS_USER_UNKNOWN", argv[0]);
+                return;
+            }
             cuser->flags |= USERFLAG_ISTMPUSER;
         }
         if(cuser->flags & USERFLAG_ISAUTHED) {
index cf7b6141f12ab23482a419dd841fa7e5e2cfb4a6..71a1cc8b95a45ca1488bcb16b6d07a56ad1f0c65 100644 (file)
@@ -40,6 +40,10 @@ CMD_BIND(neonserv_cmd_wipeinfo) {
         struct UserNode *cuser = getUserByNick(argv[0]);
         if(!cuser) {
             cuser = createTempUser(argv[0]);
+                       if(!cuser) {
+                reply(getTextBot(), user, "NS_USER_UNKNOWN", argv[0]);
+                return;
+            }
             cuser->flags |= USERFLAG_ISTMPUSER;
         }
         if(cuser->flags & USERFLAG_ISAUTHED) {