From 7ea4acaece6073a3027d373c932e001023f54866 Mon Sep 17 00:00:00 2001 From: Anthony Minessale Date: Thu, 3 Apr 2014 23:25:43 +0500 Subject: [PATCH] FS-6426 --resolve --- .../libsofia-sip-ua/tport/tport_type_ws.c | 2 +- libs/sofia-sip/libsofia-sip-ua/tport/ws.c | 145 ++++++++++++------ libs/sofia-sip/libsofia-sip-ua/tport/ws.h | 7 +- 3 files changed, 105 insertions(+), 49 deletions(-) diff --git a/libs/sofia-sip/libsofia-sip-ua/tport/tport_type_ws.c b/libs/sofia-sip/libsofia-sip-ua/tport/tport_type_ws.c index c943ee0317..044014c9ac 100644 --- a/libs/sofia-sip/libsofia-sip-ua/tport/tport_type_ws.c +++ b/libs/sofia-sip/libsofia-sip-ua/tport/tport_type_ws.c @@ -467,7 +467,7 @@ int tport_ws_init_secondary(tport_t *self, int socket, int accepted, memset(&wstp->ws, 0, sizeof(wstp->ws)); - if (ws_init(&wstp->ws, socket, wstp->ws_secure ? wspri->ssl_ctx : NULL, 0) < 0) { + if (ws_init(&wstp->ws, socket, wstp->ws_secure ? wspri->ssl_ctx : NULL, 0, 0) < 0) { ws_destroy(&wstp->ws); wstp->ws_initialized = -1; return *return_reason = "WS_INIT", -1; diff --git a/libs/sofia-sip/libsofia-sip-ua/tport/ws.c b/libs/sofia-sip/libsofia-sip-ua/tport/ws.c index f5534d6175..cdc211e86b 100644 --- a/libs/sofia-sip/libsofia-sip-ua/tport/ws.c +++ b/libs/sofia-sip/libsofia-sip-ua/tport/ws.c @@ -5,6 +5,12 @@ #include #endif +#ifndef _MSC_VER +#define ms_sleep(x) usleep( x * 1000); +#else +#define ms_sleep(x) Sleep( x ); +#endif + #define SHA1_HASH_SIZE 20 struct ws_globals_s ws_globals; @@ -418,11 +424,93 @@ static int restore_socket(ws_socket_t sock) #endif +static int establish_logical_layer(wsh_t *wsh) +{ -int ws_init(wsh_t *wsh, ws_socket_t sock, SSL_CTX *ssl_ctx, int close_sock) + if (!wsh->sanity) { + return -1; + } + + if (wsh->logical_established) { + return 0; + } + + if (wsh->secure && !wsh->secure_established) { + int code; + + if (!wsh->ssl) { + wsh->ssl = SSL_new(wsh->ssl_ctx); + assert(wsh->ssl); + + SSL_set_fd(wsh->ssl, wsh->sock); + } + + do { + code = SSL_accept(wsh->ssl); + + if (code == 1) { + wsh->secure_established = 1; + break; + } + + if (code == 0) { + return -1; + } + + if (code < 0) { + if (code == -1 && SSL_get_error(wsh->ssl, code) != SSL_ERROR_WANT_READ) { + return -1; + } + } + + if (wsh->block) { + ms_sleep(10); + } else { + ms_sleep(1); + } + + wsh->sanity--; + + if (!wsh->block) { + return -2; + } + + } while (wsh->sanity > 0); + + if (!wsh->sanity) { + return -1; + } + + } + + while (!wsh->down && !wsh->handshake) { + int r = ws_handshake(wsh); + + if (r < 0) { + wsh->down = 1; + return -1; + } + + if (!wsh->handshake && !wsh->block) { + return -2; + } + + } + + wsh->logical_established = 1; + + return 0; +} + + +int ws_init(wsh_t *wsh, ws_socket_t sock, SSL_CTX *ssl_ctx, int close_sock, int block) { memset(wsh, 0, sizeof(*wsh)); + wsh->sock = sock; + wsh->block = block; + wsh->sanity = 5000; + wsh->ssl_ctx = ssl_ctx; if (!ssl_ctx) { ssl_ctx = ws_globals.ssl_ctx; @@ -437,52 +525,8 @@ int ws_init(wsh_t *wsh, ws_socket_t sock, SSL_CTX *ssl_ctx, int close_sock) setup_socket(sock); - if (wsh->secure) { - int code; - int sanity = 500; - - wsh->ssl = SSL_new(ssl_ctx); - assert(wsh->ssl); - - SSL_set_fd(wsh->ssl, wsh->sock); - - do { - code = SSL_accept(wsh->ssl); - - if (code == 1) { - break; - } - - if (code == 0) { - return -1; - } - - if (code < 0) { - if (code == -1 && SSL_get_error(wsh->ssl, code) != SSL_ERROR_WANT_READ) { - return -1; - } - } -#ifndef _MSC_VER - usleep(10000); -#else - Sleep(10); -#endif - - } while (--sanity > 0); - - if (!sanity) { - return -1; - } - - } - - while (!wsh->down && !wsh->handshake) { - int r = ws_handshake(wsh); - - if (r < 0) { - wsh->down = 1; - return -1; - } + if (establish_logical_layer(wsh) == -1) { + return -1; } if (wsh->down) { @@ -555,12 +599,19 @@ ssize_t ws_read_frame(wsh_t *wsh, ws_opcode_t *oc, uint8_t **data) ssize_t need = 2; char *maskp; + int ll = 0; again: need = 2; maskp = NULL; *data = NULL; + ll = establish_logical_layer(wsh); + + if (ll < 0) { + return ll; + } + if (wsh->down) { return -1; } diff --git a/libs/sofia-sip/libsofia-sip-ua/tport/ws.h b/libs/sofia-sip/libsofia-sip-ua/tport/ws.h index 7b02b47966..b048df730d 100644 --- a/libs/sofia-sip/libsofia-sip-ua/tport/ws.h +++ b/libs/sofia-sip/libsofia-sip-ua/tport/ws.h @@ -83,6 +83,11 @@ typedef struct wsh_s { uint8_t down; int secure; uint8_t close_sock; + SSL_CTX *ssl_ctx; + int block; + int sanity; + int secure_established; + int logical_established; } wsh_t; ssize_t ws_send_buf(wsh_t *wsh, ws_opcode_t oc); @@ -93,7 +98,7 @@ ssize_t ws_raw_read(wsh_t *wsh, void *data, size_t bytes); ssize_t ws_raw_write(wsh_t *wsh, void *data, size_t bytes); ssize_t ws_read_frame(wsh_t *wsh, ws_opcode_t *oc, uint8_t **data); ssize_t ws_write_frame(wsh_t *wsh, ws_opcode_t oc, void *data, size_t bytes); -int ws_init(wsh_t *wsh, ws_socket_t sock, SSL_CTX *ssl_ctx, int close_sock); +int ws_init(wsh_t *wsh, ws_socket_t sock, SSL_CTX *ssl_ctx, int close_sock, int block); ssize_t ws_close(wsh_t *wsh, int16_t reason); void ws_destroy(wsh_t *wsh); void init_ssl(void);