From c032aa7dad8080dc0af08ccbdb99155b37d5c7d7 Mon Sep 17 00:00:00 2001 From: Barry Kane Date: Thu, 13 Apr 2023 02:25:43 +0100 Subject: [PATCH] Fix a segfault that happens when a client fails a handshake. --- src/server/SilverMUDServer.c | 58 +++++++++++++++++++++--------------- 1 file changed, 34 insertions(+), 24 deletions(-) diff --git a/src/server/SilverMUDServer.c b/src/server/SilverMUDServer.c index c921de2..27dec85 100644 --- a/src/server/SilverMUDServer.c +++ b/src/server/SilverMUDServer.c @@ -40,7 +40,7 @@ int main(int argc, char ** argv) time_t currentTime; unsigned delay = 800; int socketFileDesc, connectionFileDesc, length, clientsAmount, - socketCheck, activityCheck, returnVal; + socketCheck, activityCheck; fd_set connectedClients; pthread_t gameLogicThread, outputThread, schemeThread; int clientSockets[PLAYERCOUNT]; @@ -280,36 +280,46 @@ int main(int argc, char ** argv) } // See if we can put in the client: for (int index = 0; index < PLAYERCOUNT; index++) - { + { + printf("Checking for slot: %d\n", index); // When there is an empty slot, pop it in: if (clientSockets[index] == 0) - { - clientSockets[index] = connectionFileDesc; - //printf("Adding to list of sockets as %d.\n", index); + { + volatile int handshakeReturnValue = 0; + clientSockets[index] = connectionFileDesc; gnutls_transport_set_int(tlssessions[index], clientSockets[index]); do { - returnVal = gnutls_handshake(tlssessions[index]); + handshakeReturnValue = gnutls_handshake(tlssessions[index]); + } while (handshakeReturnValue < 0 && gnutls_error_is_fatal(handshakeReturnValue) == 0); + + // If it's good, send them the welcome message: + if(handshakeReturnValue == 0) + { + // Send a greeting message: + memcpy(sendBuffer.senderName, "\0 Login > \0", 11); + strcpy(sendBuffer.messageContent, "Welcome to the server!"); + messageSend(tlssessions[index], &sendBuffer); + strcpy(receiveBuffer.messageContent, "/look"); + + // Allocate the memory for a new input message: + inputMessage * newMessage = malloc(sizeof(inputMessage)); + newMessage->content = malloc(sizeof(userMessage)); + + // Copy in the correct data: + memcpy(newMessage->content, &receiveBuffer, sizeof(userMessage)); + newMessage->sender = &connectedPlayers[index]; + + // Push the new message onto the queue: + pushQueue(inputQueue, newMessage, INPUT_MESSAGE); + break; } - while (returnVal < 0 && gnutls_error_is_fatal(returnVal) == 0); - - // Send a greeting message: - memcpy(sendBuffer.senderName, "\0 Login > \0", 11); - strcpy(sendBuffer.messageContent, "Welcome to the server!"); - messageSend(tlssessions[index], &sendBuffer); - strcpy(receiveBuffer.messageContent, "/look"); - // Allocate the memory for a new input message: - inputMessage * newMessage = malloc(sizeof(inputMessage)); - newMessage->content = malloc(sizeof(userMessage)); - - // Copy in the correct data: - memcpy(newMessage->content, &receiveBuffer, sizeof(userMessage)); - newMessage->sender = &connectedPlayers[index]; - - // Push the new message onto the queue: - pushQueue(inputQueue, newMessage, INPUT_MESSAGE); - break; + // If it's not good, close it, we don't want it: + shutdown(clientSockets[index], 2); + close(clientSockets[index]); + clientSockets[index] = 0; + break; } } }