Skip to content

Commit 697c009

Browse files
address issues with error handling in chat_api:
- detect server connection error messages before blindly moving to user login (crash fix) - detect read errors and fail accordingly (crash fix) - allow server disconnect to run even if we aren't connected (cleanup & reset)
1 parent 1f918fd commit 697c009

File tree

1 file changed

+32
-7
lines changed

1 file changed

+32
-7
lines changed

code/network/chat_api.cpp

Lines changed: 32 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
#include "globalincs/pstypes.h"
1111
#include "network/chat_api.h"
1212
#include "network/psnet2.h"
13+
#include "network/multi_log.h"
1314

1415
#ifdef SCP_UNIX
1516
#include <sys/time.h>
@@ -34,7 +35,7 @@ typedef int socklen_t;
3435

3536
#define MAXCHATBUFFER 500
3637

37-
SOCKET Chatsock;
38+
SOCKET Chatsock = INVALID_SOCKET;
3839
static SOCKADDR_STORAGE Chataddr;
3940
int Socket_connecting = 0;
4041
char Nick_name[33];
@@ -148,7 +149,6 @@ int ConnectToChatServer(char *serveraddr, char *nickname, char *trackerid)
148149

149150
if ( !psnet_get_addr(nullptr, static_cast<uint16_t>(0), &Chataddr) )
150151
{
151-
printf("bail!\n");
152152
return -1;
153153
}
154154

@@ -216,6 +216,14 @@ int ConnectToChatServer(char *serveraddr, char *nickname, char *trackerid)
216216
return 0;
217217
}
218218

219+
// check for server error messages
220+
const char *msg = ChatGetString();
221+
222+
if (msg && !strcmp(msg, "ERROR"))
223+
{
224+
return -1;
225+
}
226+
219227
Socket_connected = 1;
220228
memset(signon_str, 0, sizeof(signon_str));
221229
sprintf_safe(signon_str, NOX("/USER %s %s %s :%s"), NOX("user"), NOX("user"), NOX("user"), Chat_tracker_id);
@@ -245,10 +253,18 @@ int ConnectToChatServer(char *serveraddr, char *nickname, char *trackerid)
245253
*/
246254
void DisconnectFromChatServer()
247255
{
248-
if(!Socket_connected) return;
249-
SendChatString(NOX("/QUIT"),1);
250-
shutdown(Chatsock,2);
251-
closesocket(Chatsock);
256+
if (Socket_connected)
257+
{
258+
SendChatString(NOX("/QUIT"), 1);
259+
}
260+
261+
if (Chatsock != INVALID_SOCKET)
262+
{
263+
shutdown(Chatsock, 2);
264+
closesocket(Chatsock);
265+
}
266+
267+
Chatsock = INVALID_SOCKET;
252268
Socket_connecting = 0;
253269
Socket_connected = 0;
254270
Input_chat_buffer[0] = '\0';
@@ -466,7 +482,7 @@ char *ChatGetString(void)
466482
FD_ZERO(&read_fds);
467483
FD_SET(Chatsock,&read_fds);
468484
//Writable -- that means it's connected
469-
while ( select(static_cast<int>(Chatsock+1), &read_fds, nullptr, nullptr, &timeout) )
485+
while ( select(static_cast<int>(Chatsock+1), &read_fds, nullptr, nullptr, &timeout) > 0 )
470486
{
471487
bytesread = recv(Chatsock,ch,1,0);
472488
if(bytesread)
@@ -777,6 +793,15 @@ char * ParseIRCMessage(char *Line, int iMode)
777793
return NULL;
778794
}
779795

796+
if(stricmp(szCmd,NOX("ERROR"))==0)
797+
{
798+
// Server reported errors
799+
ml_printf("Chat ERROR: %s", szRemLine);
800+
AddChatCommandToQueue(CC_DISCONNECTED, nullptr, 0);
801+
strcpy_s(szResponse, "ERROR");
802+
return szResponse;
803+
}
804+
780805
if(stricmp(szCmd,NOX("NOTICE"))==0)
781806
{
782807

0 commit comments

Comments
 (0)