diff options
Diffstat (limited to 'libvncclient/tls_openssl.c')
| -rw-r--r-- | libvncclient/tls_openssl.c | 68 | 
1 files changed, 47 insertions, 21 deletions
| diff --git a/libvncclient/tls_openssl.c b/libvncclient/tls_openssl.c index 529d476..669913d 100644 --- a/libvncclient/tls_openssl.c +++ b/libvncclient/tls_openssl.c @@ -27,28 +27,57 @@  #include <openssl/rand.h>  #include <openssl/x509.h> +#ifdef _MSC_VER +typedef CRITICAL_SECTION MUTEX_TYPE; +#define MUTEX_INIT(mutex) InitializeCriticalSection(&mutex) +#define MUTEX_FREE(mutex) DeleteCriticalSection(&mutex) +#define MUTEX_LOCK(mutex) EnterCriticalSection(&mutex) +#define MUTEX_UNLOCK(mutex) LeaveCriticalSection(&mutex) +#define CURRENT_THREAD_ID GetCurrentThreadId() +#else +typedef pthread_mutex_t MUTEX_TYPE; +#define MUTEX_INIT(mutex) {\ +	pthread_mutexattr_t mutexAttr;\ +	pthread_mutexattr_init(&mutexAttr);\ +	pthread_mutexattr_settype(&mutexAttr, PTHREAD_MUTEX_RECURSIVE);\ +	pthread_mutex_init(&mutex, &mutexAttr);\ +} +#define MUTEX_FREE(mutex) pthread_mutex_destroy(&mutex) +#define MUTEX_LOCK(mutex) pthread_mutex_lock(&mutex) +#define MUTEX_UNLOCK(mutex) pthread_mutex_unlock(&mutex) +#define CURRENT_THREAD_ID pthread_self() +#endif + +#ifndef _MSC_VER  #include <pthread.h> +#endif  #include "tls.h" +#ifdef _MSC_VER +#include <BaseTsd.h> // That's for SSIZE_T +typedef SSIZE_T ssize_t; +#define snprintf _snprintf +#endif +  static rfbBool rfbTLSInitialized = FALSE; -static pthread_mutex_t *mutex_buf = NULL; +static MUTEX_TYPE *mutex_buf = NULL;  struct CRYPTO_dynlock_value { -	pthread_mutex_t mutex; +	MUTEX_TYPE mutex;  };  static void locking_function(int mode, int n, const char *file, int line)  {  	if (mode & CRYPTO_LOCK) -		pthread_mutex_lock(&mutex_buf[n]); +		MUTEX_LOCK(mutex_buf[n]);  	else -		pthread_mutex_unlock(&mutex_buf[n]); +		MUTEX_UNLOCK(mutex_buf[n]);  }  static unsigned long id_function(void)  { -	return ((unsigned long) pthread_self()); +	return ((unsigned long) CURRENT_THREAD_ID);  }  static struct CRYPTO_dynlock_value *dyn_create_function(const char *file, int line) @@ -59,7 +88,7 @@ static struct CRYPTO_dynlock_value *dyn_create_function(const char *file, int li  		malloc(sizeof(struct CRYPTO_dynlock_value));  	if (!value)  		goto err; -	pthread_mutex_init(&value->mutex, NULL); +	MUTEX_INIT(value->mutex);  	return value; @@ -70,16 +99,16 @@ err:  static void dyn_lock_function (int mode, struct CRYPTO_dynlock_value *l, const char *file, int line)  {  	if (mode & CRYPTO_LOCK) -		pthread_mutex_lock(&l->mutex); +		MUTEX_LOCK(l->mutex);  	else -		pthread_mutex_unlock(&l->mutex); +		MUTEX_UNLOCK(l->mutex);  }  static void  dyn_destroy_function(struct CRYPTO_dynlock_value *l, const char *file, int line)  { -	pthread_mutex_destroy(&l->mutex); +	MUTEX_FREE(l->mutex);  	free(l);  } @@ -117,14 +146,14 @@ InitializeTLS(void)    if (rfbTLSInitialized) return TRUE; -  mutex_buf = malloc(CRYPTO_num_locks() * sizeof(pthread_mutex_t)); +  mutex_buf = malloc(CRYPTO_num_locks() * sizeof(MUTEX_TYPE));    if (mutex_buf == NULL) {      rfbClientLog("Failed to initialized OpenSSL: memory.\n");      return (-1);    }    for (i = 0; i < CRYPTO_num_locks(); i++) -    pthread_mutex_init(&mutex_buf[i], NULL); +    MUTEX_INIT(mutex_buf[i]);    CRYPTO_set_locking_callback(locking_function);    CRYPTO_set_id_callback(id_function); @@ -145,7 +174,6 @@ ssl_verify (int ok, X509_STORE_CTX *ctx)  {    unsigned char md5sum[16], fingerprint[40], *f;    rfbClient *client; -  char *prompt, *cert_str;    int err, i;    unsigned int md5len;    //char buf[257]; @@ -194,7 +222,7 @@ static int sock_read_ready(SSL *ssl, uint32_t ms)  	FD_SET(SSL_get_fd(ssl), &fds);  	tv.tv_sec = ms / 1000; -	tv.tv_usec = (ms % 1000) * 1000; +	tv.tv_usec = (ms % 1000) * ms;  	r = select (SSL_get_fd(ssl) + 1, &fds, NULL, NULL, &tv);  @@ -203,8 +231,6 @@ static int sock_read_ready(SSL *ssl, uint32_t ms)  static int wait_for_data(SSL *ssl, int ret, int timeout)  { -  struct timeval tv; -  fd_set fds;    int err;    int retval = 1; @@ -237,7 +263,6 @@ open_ssl_connection (rfbClient *client, int sockfd, rfbBool anonTLS)    SSL_CTX *ssl_ctx = NULL;    SSL *ssl = NULL;    int n, finished = 0; -  BIO *sbio;    ssl_ctx = SSL_CTX_new (SSLv23_client_method ());    SSL_CTX_set_default_verify_paths (ssl_ctx); @@ -276,8 +301,6 @@ open_ssl_connection (rfbClient *client, int sockfd, rfbBool anonTLS)  static rfbBool  InitializeTLSSession(rfbClient* client, rfbBool anonTLS)  { -  int ret; -    if (client->tlsSession) return TRUE;    client->tlsSession = open_ssl_connection (client, client->sock, anonTLS); @@ -310,7 +333,11 @@ return TRUE;      if (ret != -1)      {        rfbClientLog("TLS handshake blocking.\n"); -      sleep(1); +#ifdef WIN32 +      Sleep(1000); +#else +	  sleep(1); +#endif        timeout--;        continue;      } @@ -415,7 +442,6 @@ HandleVeNCryptAuth(rfbClient* client)    uint32_t authScheme;    rfbBool anonTLS;  //  gnutls_certificate_credentials_t x509_cred = NULL; -  int ret;    if (!InitializeTLS()) return FALSE; @@ -577,7 +603,7 @@ void FreeTLS(rfbClient* client)      CRYPTO_set_id_callback(NULL);      for (i = 0; i < CRYPTO_num_locks(); i++) -      pthread_mutex_destroy(&mutex_buf[i]); +      MUTEX_FREE(mutex_buf[i]);      free(mutex_buf);      mutex_buf = NULL;    } | 
