]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
FS-6426 --resolve
authorAnthony Minessale <anthm@freeswitch.org>
Thu, 3 Apr 2014 18:25:43 +0000 (23:25 +0500)
committerAnthony Minessale <anthm@freeswitch.org>
Thu, 3 Apr 2014 18:25:48 +0000 (23:25 +0500)
libs/sofia-sip/libsofia-sip-ua/tport/tport_type_ws.c
libs/sofia-sip/libsofia-sip-ua/tport/ws.c
libs/sofia-sip/libsofia-sip-ua/tport/ws.h

index c943ee0317bc9a5de310d88d19976cd566abfe67..044014c9ac9cd088e19e1e301ca3c979f131c2da 100644 (file)
@@ -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;
index f5534d61756f5b15274f34ab4a50986812fb40bb..cdc211e86b71bc3b86a4bfef4bd726c89fc4ffd0 100644 (file)
@@ -5,6 +5,12 @@
 #include <fcntl.h>
 #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,38 +424,32 @@ static int restore_socket(ws_socket_t sock)
 #endif
 
 
-
-int ws_init(wsh_t *wsh, ws_socket_t sock, SSL_CTX *ssl_ctx, int close_sock)
+static int establish_logical_layer(wsh_t *wsh)
 {
-       memset(wsh, 0, sizeof(*wsh));
-       wsh->sock = sock;
 
-       if (!ssl_ctx) {
-               ssl_ctx = ws_globals.ssl_ctx;
+       if (!wsh->sanity) {
+               return -1;
        }
 
-       if (close_sock) {
-               wsh->close_sock = 1;
+       if (wsh->logical_established) {
+               return 0;
        }
 
-       wsh->buflen = sizeof(wsh->buffer);
-       wsh->secure = ssl_ctx ? 1 : 0;
-
-       setup_socket(sock);
-
-       if (wsh->secure) {
+       if (wsh->secure && !wsh->secure_established) {
                int code;
-               int sanity = 500;
-               
-               wsh->ssl = SSL_new(ssl_ctx);
-               assert(wsh->ssl);
 
-               SSL_set_fd(wsh->ssl, wsh->sock);
+               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;
                        }
 
@@ -462,15 +462,22 @@ int ws_init(wsh_t *wsh, ws_socket_t sock, SSL_CTX *ssl_ctx, int close_sock)
                                        return -1;
                                }
                        }
-#ifndef _MSC_VER
-                               usleep(10000);
-#else
-                               Sleep(10);
-#endif                         
-                               
-               } while (--sanity > 0);
+
+                       if (wsh->block) {
+                               ms_sleep(10);
+                       } else {
+                               ms_sleep(1);
+                       }
+
+                       wsh->sanity--;
+
+                       if (!wsh->block) {
+                               return -2;
+                       }
+
+               } while (wsh->sanity > 0);
                
-               if (!sanity) {
+               if (!wsh->sanity) {
                        return -1;
                }
                
@@ -483,6 +490,43 @@ int ws_init(wsh_t *wsh, ws_socket_t sock, SSL_CTX *ssl_ctx, int close_sock)
                        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;
+       }
+
+       if (close_sock) {
+               wsh->close_sock = 1;
+       }
+
+       wsh->buflen = sizeof(wsh->buffer);
+       wsh->secure = ssl_ctx ? 1 : 0;
+
+       setup_socket(sock);
+
+       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;
        }
index 7b02b47966686ab54148e088b4ec474b4bca16e6..b048df730d82f37de0ff07aea751434952d93106 100644 (file)
@@ -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);