fixed crash in multiple commands if createTempUser returns NULL
[NeonServV5.git] / src / UserNode.c
index e4d73cac70bc8e33817c34f3657053aa61c209bf..739722ad4009d8755d512b62f8aa50546588b44d 100644 (file)
@@ -1,5 +1,5 @@
-/* UserNode.c - NeonServ v5.2
- * Copyright (C) 2011  Philipp Kreil (pk910)
+/* UserNode.c - NeonServ v5.3
+ * Copyright (C) 2011-2012  Philipp Kreil (pk910)
  * 
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -17,6 +17,7 @@
 #include "UserNode.h"
 #include "ChanUser.h"
 #include "tools.h"
+#include "IRCEvents.h"
 
 static struct UserNode **userList;
 
@@ -243,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)
             {
@@ -338,6 +342,7 @@ int renameUser(struct UserNode* user, const char *new_nick) {
 void delUser(struct UserNode* user, int freeUser) {
     int userListIndex = get_nicklist_entry(user->nick[0]);
     if(userListIndex == -1) return;
+    event_freeuser(user);
     struct UserNode *cuser, *last_user = NULL;
     for(cuser = userList[userListIndex]; cuser; cuser = cuser->next) {
         if(cuser == user) {
@@ -349,6 +354,10 @@ void delUser(struct UserNode* user, int freeUser) {
         } else
             last_user = cuser;
     }
+       if(freeUser && (user->flags & USERFLAG_IS_ON_WHO_QUEUE)) {
+               user->flags |= USERFLAG_FREE_AFTER_WHO;
+               freeUser = 0;
+       }
     if(user->channel) {
         struct ChanUser *chanUser, *next;
         for(chanUser = user->channel; chanUser; chanUser = next) {