diff --git a/build/modules/configRead.o b/build/modules/configRead.o index 42c1791..a046a7a 100644 Binary files a/build/modules/configRead.o and b/build/modules/configRead.o differ diff --git a/build/modules/connection.o b/build/modules/connection.o index 1e110f4..b300b14 100644 Binary files a/build/modules/connection.o and b/build/modules/connection.o differ diff --git a/build/modules/ftpCommandElaborate.o b/build/modules/ftpCommandElaborate.o index 2639eb1..3b53711 100644 Binary files a/build/modules/ftpCommandElaborate.o and b/build/modules/ftpCommandElaborate.o differ diff --git a/build/modules/ftpData.o b/build/modules/ftpData.o index 92a07df..1f2bb30 100644 Binary files a/build/modules/ftpData.o and b/build/modules/ftpData.o differ diff --git a/build/modules/ftpServer.o b/build/modules/ftpServer.o index 2883b45..a1a5f89 100644 Binary files a/build/modules/ftpServer.o and b/build/modules/ftpServer.o differ diff --git a/build/uFTP b/build/uFTP index cbb0d1e..71f1100 100755 Binary files a/build/uFTP and b/build/uFTP differ diff --git a/ftpCommandElaborate.c b/ftpCommandElaborate.c index 40c2694..2467971 100644 --- a/ftpCommandElaborate.c +++ b/ftpCommandElaborate.c @@ -632,12 +632,13 @@ int parseCommandList(ftpDataType * data, int socketId) setDynamicStringDataType(&data->clients[socketId].listPath, data->clients[socketId].login.absolutePath.text, data->clients[socketId].login.absolutePath.textLen, &data->clients[socketId].memoryTable); } - //pthread_mutex_trylock(&data->clients[socketId].workerData.conditionMutex); + pthread_mutex_lock(&data->clients[socketId].conditionMutex); memset(data->clients[socketId].workerData.theCommandReceived, 0, CLIENT_COMMAND_STRING_SIZE); strcpy(data->clients[socketId].workerData.theCommandReceived, data->clients[socketId].theCommandReceived); data->clients[socketId].workerData.commandReceived = 1; - //pthread_mutex_unlock(&data->clients[socketId].workerData.conditionMutex); - pthread_cond_signal(&data->clients[socketId].workerData.conditionVariable); + pthread_cond_signal(&data->clients[socketId].conditionVariable); + pthread_mutex_unlock(&data->clients[socketId].conditionMutex); + return FTP_COMMAND_PROCESSED; } @@ -663,12 +664,14 @@ int parseCommandNlst(ftpDataType * data, int socketId) setDynamicStringDataType(&data->clients[socketId].nlistPath, data->clients[socketId].login.absolutePath.text, data->clients[socketId].login.absolutePath.textLen, &data->clients[socketId].memoryTable); } - //pthread_mutex_trylock(&data->clients[socketId].workerData.conditionMutex); + pthread_mutex_lock(&data->clients[socketId].conditionMutex); + memset(data->clients[socketId].workerData.theCommandReceived, 0, CLIENT_COMMAND_STRING_SIZE); strcpy(data->clients[socketId].workerData.theCommandReceived, data->clients[socketId].theCommandReceived); data->clients[socketId].workerData.commandReceived = 1; - //pthread_mutex_unlock(&data->clients[socketId].workerData.conditionMutex); - pthread_cond_signal(&data->clients[socketId].workerData.conditionVariable); + pthread_cond_signal(&data->clients[socketId].conditionVariable); + pthread_mutex_unlock(&data->clients[socketId].conditionMutex); + return FTP_COMMAND_PROCESSED; } @@ -688,12 +691,14 @@ int parseCommandRetr(ftpDataType * data, int socketId) if (isSafePath == 1 && FILE_IsFile(data->clients[socketId].fileToRetr.text) == 1) { - //pthread_mutex_trylock(&data->clients[socketId].workerData.conditionMutex); + pthread_mutex_lock(&data->clients[socketId].conditionMutex); + memset(data->clients[socketId].workerData.theCommandReceived, 0, CLIENT_COMMAND_STRING_SIZE); strcpy(data->clients[socketId].workerData.theCommandReceived, data->clients[socketId].theCommandReceived); data->clients[socketId].workerData.commandReceived = 1; - //pthread_mutex_unlock(&data->clients[socketId].workerData.conditionMutex); - pthread_cond_signal(&data->clients[socketId].workerData.conditionVariable); + pthread_cond_signal(&data->clients[socketId].conditionVariable); + pthread_mutex_unlock(&data->clients[socketId].conditionMutex); + return FTP_COMMAND_PROCESSED; } else @@ -718,18 +723,19 @@ int parseCommandStor(ftpDataType * data, int socketId) if (isSafePath == 1) { - //pthread_mutex_trylock(&data->clients[socketId].workerData.conditionMutex); + pthread_mutex_lock(&data->clients[socketId].conditionMutex); memset(data->clients[socketId].workerData.theCommandReceived, 0, CLIENT_COMMAND_STRING_SIZE); strcpy(data->clients[socketId].workerData.theCommandReceived, data->clients[socketId].theCommandReceived); data->clients[socketId].workerData.commandReceived = 1; - //pthread_mutex_unlock(&data->clients[socketId].workerData.conditionMutex); - pthread_cond_signal(&data->clients[socketId].workerData.conditionVariable); + pthread_cond_signal(&data->clients[socketId].conditionVariable); + pthread_mutex_unlock(&data->clients[socketId].conditionMutex); + } else { return FTP_COMMAND_NOT_RECONIZED; } - + return FTP_COMMAND_PROCESSED; } diff --git a/ftpData.c b/ftpData.c index e901ad1..a35d3db 100644 --- a/ftpData.c +++ b/ftpData.c @@ -593,9 +593,6 @@ void resetWorkerData(ftpDataType *data, int clientId, int isInitialization) /* wait main for action */ if (isInitialization != 1) { - pthread_mutex_destroy(&data->clients[clientId].workerData.conditionMutex); - pthread_cond_destroy(&data->clients[clientId].workerData.conditionVariable); - if (data->clients[clientId].workerData.theStorFile != NULL) { fclose(data->clients[clientId].workerData.theStorFile); @@ -614,18 +611,6 @@ void resetWorkerData(ftpDataType *data, int clientId, int isInitialization) data->clients[clientId].workerData.threadHasBeenCreated = 0; } - if (pthread_mutex_init(&data->clients[clientId].workerData.conditionMutex, NULL) != 0) - { - // printf("\ndata->clients[clientId].workerData.conditionMutex init failed\n"); - exit(0); - } - - - if (pthread_cond_init(&data->clients[clientId].workerData.conditionVariable, NULL) != 0) - { - // printf("\ndata->clients[clientId].workerData.conditionVariable init failed\n"); - exit(0); - } //Clear the dynamic vector structure int theSize = data->clients[clientId].workerData.directoryInfo.Size; @@ -645,12 +630,14 @@ void resetWorkerData(ftpDataType *data, int clientId, int isInitialization) void resetClientData(ftpDataType *data, int clientId, int isInitialization) { - if (isInitialization != 1) { if (data->clients[clientId].workerData.threadIsAlive == 1) pthread_cancel(data->clients[clientId].workerData.workerThread); + pthread_mutex_destroy(&data->clients[clientId].conditionMutex); + pthread_cond_destroy(&data->clients[clientId].conditionVariable); + pthread_mutex_destroy(&data->clients[clientId].writeMutex); #ifdef OPENSSL_ENABLED @@ -658,6 +645,10 @@ void resetClientData(ftpDataType *data, int clientId, int isInitialization) //SSL_free(data->clients[clientId].workerData.ssl); #endif } + else + { + + } if (pthread_mutex_init(&data->clients[clientId].writeMutex, NULL) != 0) { @@ -665,6 +656,18 @@ void resetClientData(ftpDataType *data, int clientId, int isInitialization) exit(0); } + if (pthread_mutex_init(&data->clients[clientId].conditionMutex, NULL) != 0) + { + printf("\ndata->clients[clientId].workerData.conditionMutex init failed\n"); + exit(0); + } + + if (pthread_cond_init(&data->clients[clientId].conditionVariable, NULL) != 0) + { + printf("\ndata->clients[clientId].workerData.conditionVariable init failed\n"); + exit(0); + } + data->clients[clientId].tlsIsNegotiating = 0; data->clients[clientId].tlsIsEnabled = 0; data->clients[clientId].dataChannelIsTls = 0; diff --git a/ftpData.h b/ftpData.h index 7c1f0aa..8211d16 100644 --- a/ftpData.h +++ b/ftpData.h @@ -148,8 +148,6 @@ struct workerData long long int retrRestartAtByte; /* The PASV thread will wait the signal before start */ - pthread_mutex_t conditionMutex; - pthread_cond_t conditionVariable; ftpCommandDataType ftpCommand; DYNV_VectorGenericDataType directoryInfo; FILE *theStorFile; @@ -207,6 +205,9 @@ struct clientData unsigned long long int connectionTimeStamp; unsigned long long int lastActivityTimeStamp; + pthread_mutex_t conditionMutex; + pthread_cond_t conditionVariable; + DYNMEM_MemoryTable_DataType *memoryTable; } typedef clientDataType; diff --git a/ftpServer.c b/ftpServer.c index aa6d201..ef396e8 100644 --- a/ftpServer.c +++ b/ftpServer.c @@ -264,12 +264,12 @@ void *connectionWorkerHandle(void * socketId) { //printf("\nWorker %d is waiting for commands!", theSocketId); //Conditional lock on tconditionVariablehread actions - pthread_mutex_lock(&ftpData.clients[theSocketId].workerData.conditionMutex); + pthread_mutex_lock(&ftpData.clients[theSocketId].conditionMutex); while (ftpData.clients[theSocketId].workerData.commandReceived == 0) { - pthread_cond_wait(&ftpData.clients[theSocketId].workerData.conditionVariable, &ftpData.clients[theSocketId].workerData.conditionMutex); + pthread_cond_wait(&ftpData.clients[theSocketId].conditionVariable, &ftpData.clients[theSocketId].conditionMutex); } - pthread_mutex_unlock(&ftpData.clients[theSocketId].workerData.conditionMutex); + pthread_mutex_unlock(&ftpData.clients[theSocketId].conditionMutex); //printf("\nWorker %d unlocked", theSocketId);