synchronized more important events to fix some crashes
authorpk910 <philipp@zoelle1.de>
Sat, 18 Feb 2012 20:34:22 +0000 (21:34 +0100)
committerpk910 <philipp@zoelle1.de>
Sat, 18 Feb 2012 20:34:22 +0000 (21:34 +0100)
src/IRCParser.c

index 220283e1408025789d54c1269c3900bbf8532e46..cf98cc182c4875762068d04daebccf360b6754e4 100644 (file)
@@ -466,17 +466,28 @@ static IRC_CMD(raw_kick) {
 
 static IRC_CMD(raw_topic) {
     if(from == NULL || argc < 2) return 0;
+    SYNCHRONIZE(cache_sync);
     struct UserNode *user = getUserByMask(from);
     struct ChanNode *chan = getChanByName(argv[0]);
-    if(chan == NULL) return 0;
-    if(chan->chanbot != client->user) return 1; //just ignore it to prevent event duplicates
+    if(chan == NULL) {
+        DESYNCHRONIZE(cache_sync);
+        return 0;
+    }
+    if(chan->chanbot != client->user) {
+        DESYNCHRONIZE(cache_sync);
+        return 1; //just ignore it to prevent event duplicates
+    }
     if(user == NULL) {
         user = createTempUserMask(from);
-               if(!user) return 0;
+               if(!user) {
+            DESYNCHRONIZE(cache_sync);
+            return 0;
+        }
         user->flags |= USERFLAG_ISTMPUSER;
     }
     event_topic(user, chan, argv[1]);
     strcpy(chan->topic, argv[1]);
+    DESYNCHRONIZE(cache_sync);
     return 1;
 }
 
@@ -570,15 +581,26 @@ static void client_renamed(struct ClientSocket *client);
 
 static IRC_CMD(raw_nick) {
     if(from == NULL || argc == 0) return 0;
+    SYNCHRONIZE(cache_sync);
     struct UserNode *user = getUserByMask(from);
-    if(user == NULL) return 0;
+    if(user == NULL) {
+        DESYNCHRONIZE(cache_sync);
+        return 0;
+    }
     if(isBot(user)) {
-        if(client->user != user) return 1;
+        if(client->user != user) {
+            DESYNCHRONIZE(cache_sync);
+            return 1;
+        }
         client_renamed(client);
     }
-    else if(!is_firstBotSeeUser(client, user)) return 1; //we ignore it - but it's not a parse error
+    else if(!is_firstBotSeeUser(client, user)) {
+        DESYNCHRONIZE(cache_sync);
+        return 1; //we ignore it - but it's not a parse error
+    }
     event_nick(user, argv[0]);
     renameUser(user, argv[0]);
+    DESYNCHRONIZE(cache_sync);
     return 1;
 }
 
@@ -621,22 +643,33 @@ static IRC_CMD(raw_invite) {
 
 static IRC_CMD(raw_mode) {
     if(from == NULL || argc < 2) return 0;
+    SYNCHRONIZE(cache_sync);
     struct UserNode *user = getUserByMask(from);
     if(user == NULL) {
         user = createTempUserMask(from);
-               if(!user) return 0;
+               if(!user) {
+            DESYNCHRONIZE(cache_sync);
+            return 0;
+        }
         user->flags |= USERFLAG_ISTMPUSER;
     }
     if(argv[0][0] == '#') {
         //ChannelMode
         struct ChanNode *chan = getChanByName(argv[0]);
-        if(!chan) return 0;
-        if(chan->chanbot != client->user) return 1;
+        if(!chan) {
+            DESYNCHRONIZE(cache_sync);
+            return 0;
+        }
+        if(chan->chanbot != client->user) {
+            DESYNCHRONIZE(cache_sync);
+            return 1;
+        }
         parseModes(chan->modes, argv[1], argv+2, argc-2);
         event_mode(user, chan, argv[1], argv+2, argc-2);
     } else {
         //UserMode
     }
+    DESYNCHRONIZE(cache_sync);
     return 1;
 }