From 786cc29fa93dcf771e992076c2a780f25d733ed5 Mon Sep 17 00:00:00 2001
From: Pelish <pelish@gmail.com>
Date: Sun, 14 Feb 2010 11:55:56 +0000
Subject: [PATCH] fix for WOL gamepass bug

---
 pvpgn/src/bnetd/handle_wol.cpp | 32 +++++++++++++++++---------------
 1 file changed, 17 insertions(+), 15 deletions(-)

diff --git a/pvpgn/src/bnetd/handle_wol.cpp b/pvpgn/src/bnetd/handle_wol.cpp
index 264b32a..1e53955 100644
--- a/pvpgn/src/bnetd/handle_wol.cpp
+++ b/pvpgn/src/bnetd/handle_wol.cpp
@@ -1021,7 +1021,9 @@ static int _handle_joingame_command(t_connection * conn, int numparams, char **
 	   	 	t_game_type gametype;
             t_channel * channel;
 	   	 	t_channel * old_channel = conn_get_channel(conn);
-	   	 	char * gamepass;
+            char gamepass [MAX_GAMEPASS_LEN];
+
+            std::memset(gamepass,0,sizeof(gamepass));
 
             if ((conn_get_clienttag(conn) == CLIENTTAG_REDALERT_UINT)
                 && (channellist_find_channel_by_name(gamename, NULL, NULL) != NULL)
@@ -1061,8 +1063,9 @@ static int _handle_joingame_command(t_connection * conn, int numparams, char **
             }
 
             if (std::strcmp(game_get_pass(game),"") != 0) {
-                if ((params[2]) && (std::strcmp(params[2], game_get_pass(game)) == 0))
-                    gamepass = params[2];
+                if ((numparams==3) && (params[2]) && (std::strcmp(params[2], game_get_pass(game)) == 0)) {
+                    strcpy(gamepass, params[2]);
+                }
                 else {
                     snprintf(_temp, sizeof(_temp), "%s :Bad password", e[0]);
                     irc_send(conn,ERR_BADCHANNELKEY,_temp);
@@ -1071,8 +1074,6 @@ static int _handle_joingame_command(t_connection * conn, int numparams, char **
      	            return 0;
                 }
             }
-            else
-                gamepass = "";
 
 			conn_wol_set_ingame(conn,1);
 	   	 	gametype = game_get_type(game);
@@ -1120,9 +1121,9 @@ static int _handle_joingame_command(t_connection * conn, int numparams, char **
 				}
 			}
 		}
-    		if (e)
-		    irc_unget_listelems(e);
-    	    return 0;
+    	if (e)
+		irc_unget_listelems(e);
+    	return 0;
 	}
 	else if((numparams>=7)) {
 	    char ** e;
@@ -1151,18 +1152,19 @@ static int _handle_joingame_command(t_connection * conn, int numparams, char **
 	    if ((e)&&(e[0])) {
     		char const * gamename = irc_convert_ircname(e[0]);
     		t_game_type gametype;
-            char * gamepass;
-    		
-    		if (std::atoi(params[6]) == 1)
+            char gamepass [MAX_GAMEPASS_LEN];
+
+            std::memset(gamepass,0,sizeof(gamepass));
+
+            if (std::strcmp(params[6], "1") == 0)   		
     		    gametype = game_type_ladder;
 		    else
     		    gametype = game_type_ffa;		    
 //    		    gametype = game_type_none;
 
-            if (params[8])
-                gamepass = params[8];
-            else
-                gamepass = "";
+            if ((numparams>=8) && (params[8])) {
+                strcpy(gamepass, params[8]);
+            }
 
 			if ((!(gamename)) || ((conn_set_game(conn, gamename, gamepass, "", gametype, 0))<0)) {
 				irc_send(conn,ERR_NOSUCHCHANNEL,":JOINGAME failed"); /* FIXME: be more precise; what is the real error code for that? */