From: pk910 Date: Sun, 8 Jan 2012 04:47:47 +0000 (+0100) Subject: fixed crash in multiple commands if createTempUser returns NULL X-Git-Tag: v5.3~70 X-Git-Url: http://git.pk910.de/?p=NeonServV5.git;a=commitdiff_plain;h=1441daa675488be93e8b9a82d105aed5dc273f47 fixed crash in multiple commands if createTempUser returns NULL --- diff --git a/src/IRCParser.c b/src/IRCParser.c index c1dbf6b..6e6c613 100644 --- a/src/IRCParser.c +++ b/src/IRCParser.c @@ -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] == '#') { diff --git a/src/UserNode.c b/src/UserNode.c index df4edeb..739722a 100644 --- a/src/UserNode.c +++ b/src/UserNode.c @@ -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) { diff --git a/src/cmd_global_register.c b/src/cmd_global_register.c index 9132484..45e5a75 100644 --- a/src/cmd_global_register.c +++ b/src/cmd_global_register.c @@ -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) { diff --git a/src/cmd_global_setaccess.c b/src/cmd_global_setaccess.c index d11fda6..0458bd6 100644 --- a/src/cmd_global_setaccess.c +++ b/src/cmd_global_setaccess.c @@ -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) { diff --git a/src/cmd_neonserv_access.c b/src/cmd_neonserv_access.c index 7636c79..d036bf8 100644 --- a/src/cmd_neonserv_access.c +++ b/src/cmd_neonserv_access.c @@ -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) { diff --git a/src/cmd_neonserv_adduser.c b/src/cmd_neonserv_adduser.c index 50ebd95..8eccf67 100644 --- a/src/cmd_neonserv_adduser.c +++ b/src/cmd_neonserv_adduser.c @@ -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) { diff --git a/src/cmd_neonserv_assignrank.c b/src/cmd_neonserv_assignrank.c index fb82bf0..4fedaf8 100644 --- a/src/cmd_neonserv_assignrank.c +++ b/src/cmd_neonserv_assignrank.c @@ -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) { diff --git a/src/cmd_neonserv_clvl.c b/src/cmd_neonserv_clvl.c index 4bb043e..a541c3d 100644 --- a/src/cmd_neonserv_clvl.c +++ b/src/cmd_neonserv_clvl.c @@ -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) { diff --git a/src/cmd_neonserv_deluser.c b/src/cmd_neonserv_deluser.c index 184de91..5188f01 100644 --- a/src/cmd_neonserv_deluser.c +++ b/src/cmd_neonserv_deluser.c @@ -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) { diff --git a/src/cmd_neonserv_giveowner.c b/src/cmd_neonserv_giveowner.c index bc789c7..9cf5ae7 100644 --- a/src/cmd_neonserv_giveowner.c +++ b/src/cmd_neonserv_giveowner.c @@ -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) { diff --git a/src/cmd_neonserv_invite.c b/src/cmd_neonserv_invite.c index 954d911..60c00a2 100644 --- a/src/cmd_neonserv_invite.c +++ b/src/cmd_neonserv_invite.c @@ -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); diff --git a/src/cmd_neonserv_myaccess.c b/src/cmd_neonserv_myaccess.c index c37f0f8..03ea942 100644 --- a/src/cmd_neonserv_myaccess.c +++ b/src/cmd_neonserv_myaccess.c @@ -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) { diff --git a/src/cmd_neonserv_noregister.c b/src/cmd_neonserv_noregister.c index ab1b432..f0ba380 100644 --- a/src/cmd_neonserv_noregister.c +++ b/src/cmd_neonserv_noregister.c @@ -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) { diff --git a/src/cmd_neonserv_suspend.c b/src/cmd_neonserv_suspend.c index d6cb87a..b6d18b4 100644 --- a/src/cmd_neonserv_suspend.c +++ b/src/cmd_neonserv_suspend.c @@ -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) { diff --git a/src/cmd_neonserv_unban.c b/src/cmd_neonserv_unban.c index 53b8919..3df5150 100644 --- a/src/cmd_neonserv_unban.c +++ b/src/cmd_neonserv_unban.c @@ -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++; diff --git a/src/cmd_neonserv_unsuspend.c b/src/cmd_neonserv_unsuspend.c index c319d1d..4053950 100644 --- a/src/cmd_neonserv_unsuspend.c +++ b/src/cmd_neonserv_unsuspend.c @@ -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) { diff --git a/src/cmd_neonserv_wipeinfo.c b/src/cmd_neonserv_wipeinfo.c index cf7b614..71a1cc8 100644 --- a/src/cmd_neonserv_wipeinfo.c +++ b/src/cmd_neonserv_wipeinfo.c @@ -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) {