thread open ssl working

This commit is contained in:
Ugo Cirmignani
2018-12-13 23:05:33 +01:00
parent cd589876b0
commit a122c27bcb
11 changed files with 79 additions and 17 deletions

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -459,22 +459,21 @@ int parseCommandPasv(ftpDataType * data, int socketId)
/* Create worker thread */ /* Create worker thread */
void *pReturn; void *pReturn;
int returnCode; int returnCode;
printf("\n data->clients[%d].workerData.workerThread = %d",socketId, (int)data->clients[socketId].workerData.workerThread); //printf("\n data->clients[%d].workerData.workerThread = %d",socketId, (int)data->clients[socketId].workerData.workerThread);
//if (data->clients[socketId].workerData.threadIsAlive == 1) printf("\n data->clients[%d].workerData.threadHasBeenCreated = %d", socketId, data->clients[socketId].workerData.threadHasBeenCreated);
// {
if (data->clients[socketId].workerData.threadIsAlive == 1) if (data->clients[socketId].workerData.threadIsAlive == 1)
{ {
returnCode = pthread_cancel(data->clients[socketId].workerData.workerThread); returnCode = pthread_cancel(data->clients[socketId].workerData.workerThread);
}
printf("\npasv pthread_cancel = %d", returnCode); printf("\npasv pthread_cancel = %d", returnCode);
//} }
printf("\npasv join ");
if (data->clients[socketId].workerData.threadHasBeenCreated == 1) if (data->clients[socketId].workerData.threadHasBeenCreated == 1)
{
returnCode = pthread_join(data->clients[socketId].workerData.workerThread, &pReturn); returnCode = pthread_join(data->clients[socketId].workerData.workerThread, &pReturn);
printf("\nPasv join ok %d", returnCode);
}
printf("\npasv join ok");
data->clients[socketId].workerData.passiveModeOn = 1; data->clients[socketId].workerData.passiveModeOn = 1;
data->clients[socketId].workerData.activeModeOn = 0; data->clients[socketId].workerData.activeModeOn = 0;
returnCode = pthread_create(&data->clients[socketId].workerData.workerThread, NULL, connectionWorkerHandle, (void *) &data->clients[socketId].clientProgressiveNumber); returnCode = pthread_create(&data->clients[socketId].workerData.workerThread, NULL, connectionWorkerHandle, (void *) &data->clients[socketId].clientProgressiveNumber);
@ -505,7 +504,9 @@ int parseCommandPort(ftpDataType * data, int socketId)
returnCode = pthread_cancel(data->clients[socketId].workerData.workerThread); returnCode = pthread_cancel(data->clients[socketId].workerData.workerThread);
} }
if (data->clients[socketId].workerData.threadHasBeenCreated == 1) if (data->clients[socketId].workerData.threadHasBeenCreated == 1)
{
returnCode = pthread_join(data->clients[socketId].workerData.workerThread, &pReturn); returnCode = pthread_join(data->clients[socketId].workerData.workerThread, &pReturn);
}
data->clients[socketId].workerData.passiveModeOn = 0; data->clients[socketId].workerData.passiveModeOn = 0;
data->clients[socketId].workerData.activeModeOn = 1; data->clients[socketId].workerData.activeModeOn = 1;
returnCode = pthread_create(&data->clients[socketId].workerData.workerThread, NULL, connectionWorkerHandle, (void *) &data->clients[socketId].clientProgressiveNumber); returnCode = pthread_create(&data->clients[socketId].workerData.workerThread, NULL, connectionWorkerHandle, (void *) &data->clients[socketId].clientProgressiveNumber);

View File

@ -603,7 +603,6 @@ void resetWorkerData(ftpDataType *data, int clientId, int isInitialization)
DYNV_VectorGeneric_Init(&data->clients[clientId].workerData.directoryInfo); DYNV_VectorGeneric_Init(&data->clients[clientId].workerData.directoryInfo);
data->clients[clientId].workerData.theStorFile = NULL; data->clients[clientId].workerData.theStorFile = NULL;
data->clients[clientId].workerData.threadHasBeenCreated = 0; data->clients[clientId].workerData.threadHasBeenCreated = 0;
} }
if (pthread_mutex_init(&data->clients[clientId].workerData.conditionMutex, NULL) != 0) if (pthread_mutex_init(&data->clients[clientId].workerData.conditionMutex, NULL) != 0)

View File

@ -119,6 +119,7 @@ void *connectionWorkerHandle(void * socketId)
int theSocketId = *(int *)socketId; int theSocketId = *(int *)socketId;
pthread_cleanup_push(workerCleanup, (void *) &theSocketId); pthread_cleanup_push(workerCleanup, (void *) &theSocketId);
ftpData.clients[theSocketId].workerData.threadIsAlive = 1; ftpData.clients[theSocketId].workerData.threadIsAlive = 1;
ftpData.clients[theSocketId].workerData.threadHasBeenCreated = 1;
int returnCode; int returnCode;
printf("\nWORKER CREATED!"); printf("\nWORKER CREATED!");

View File

@ -630,7 +630,7 @@ int evaluateClientSocketConnection(ftpDataType * ftpData)
//Errors while accepting, socket will be closed //Errors while accepting, socket will be closed
ftpData->clients[availableSocketIndex].closeTheClient = 1; ftpData->clients[availableSocketIndex].closeTheClient = 1;
printf("\n2 Errno = %d", errno); printf("\n2 Errno = %d", errno);
return 0; return 1;
} }
} }
else else
@ -644,15 +644,10 @@ int evaluateClientSocketConnection(ftpDataType * ftpData)
write(socketRefuseFd, messageToWrite, strlen(messageToWrite)); write(socketRefuseFd, messageToWrite, strlen(messageToWrite));
shutdown(socketRefuseFd, SHUT_RDWR); shutdown(socketRefuseFd, SHUT_RDWR);
close(socketRefuseFd); close(socketRefuseFd);
}
return 0; return 0;
} }
else
{
ftpData->clients[availableSocketIndex].closeTheClient = 1;
printf("\n3 Errno = %d", errno);
return 1;
}
}
} }
else else
{ {

View File

@ -33,6 +33,19 @@
#include "openSsl.h" #include "openSsl.h"
#include "fileManagement.h" #include "fileManagement.h"
#define MUTEX_TYPE pthread_mutex_t
#define MUTEX_SETUP(x) pthread_mutex_init(&(x), NULL)
#define MUTEX_CLEANUP(x) pthread_mutex_destroy(&(x))
#define MUTEX_LOCK(x) pthread_mutex_lock(&(x))
#define MUTEX_UNLOCK(x) pthread_mutex_unlock(&(x))
#define THREAD_ID pthread_self()
/* This array will store all of the mutexes available to OpenSSL. */
static MUTEX_TYPE *mutex_buf = NULL;
void initOpenssl() void initOpenssl()
{ {
OpenSSL_add_all_algorithms(); /* Load cryptos, et.al. */ OpenSSL_add_all_algorithms(); /* Load cryptos, et.al. */
@ -40,11 +53,14 @@ void initOpenssl()
ERR_load_BIO_strings(); ERR_load_BIO_strings();
ERR_load_crypto_strings(); ERR_load_crypto_strings();
SSL_library_init(); SSL_library_init();
thread_setup();
} }
void cleanupOpenssl() void cleanupOpenssl()
{ {
thread_cleanup();
EVP_cleanup(); EVP_cleanup();
} }
SSL_CTX *createServerContext() SSL_CTX *createServerContext()
@ -162,4 +178,54 @@ void ShowCerts(SSL* ssl)
} }
void handle_error(const char *file, int lineno, const char *msg)
{
fprintf(stderr, "** %s:%d %s\n", file, lineno, msg);
ERR_print_errors_fp(stderr);
/* exit(-1); */
}
static void locking_function(int mode, int n, const char *file, int line)
{
if(mode & CRYPTO_LOCK)
MUTEX_LOCK(mutex_buf[n]);
else
MUTEX_UNLOCK(mutex_buf[n]);
}
static unsigned long id_function(void)
{
return ((unsigned long)THREAD_ID);
}
int thread_setup(void)
{
int i;
mutex_buf = malloc(CRYPTO_num_locks() * sizeof(MUTEX_TYPE));
if(!mutex_buf)
return 0;
for(i = 0; i < CRYPTO_num_locks(); i++)
MUTEX_SETUP(mutex_buf[i]);
CRYPTO_set_id_callback(id_function);
CRYPTO_set_locking_callback(locking_function);
return 1;
}
int thread_cleanup(void)
{
int i;
if(!mutex_buf)
return 0;
CRYPTO_set_id_callback(NULL);
CRYPTO_set_locking_callback(NULL);
for(i = 0; i < CRYPTO_num_locks(); i++)
MUTEX_CLEANUP(mutex_buf[i]);
free(mutex_buf);
mutex_buf = NULL;
return 1;
}
#endif #endif