]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
FS-6476 regression where sock would sometimes drop while reading logical frames
authorAnthony Minessale <anthm@freeswitch.org>
Tue, 29 Apr 2014 22:24:59 +0000 (18:24 -0400)
committerAnthony Minessale <anthm@freeswitch.org>
Tue, 29 Apr 2014 22:25:05 +0000 (18:25 -0400)
libs/sofia-sip/.update
libs/sofia-sip/libsofia-sip-ua/tport/ws.c
libs/sofia-sip/libsofia-sip-ua/tport/ws.h

index 1e71bb3dcc92d7e953288469b1bd592fe3f6214b..f98e12036dbc4fe12a8917fd40b602dbb9259670 100644 (file)
@@ -1 +1 @@
-Thu Apr 17 04:32:56 CDT 2014
+Tue Apr 29 18:23:46 EDT 2014
index 98c00032cc54cb566c6af60f404281c1f03aace8..9ac4f447e58242523a8e468bd3fb4560c09946ec 100644 (file)
@@ -11,6 +11,9 @@
 #define ms_sleep(x) Sleep( x );
 #endif                         
 
+#define WS_BLOCK 1
+#define WS_NOBLOCK 0
+
 #define SHA1_HASH_SIZE 20
 struct ws_globals_s ws_globals;
 
@@ -242,7 +245,7 @@ int ws_handshake(wsh_t *wsh)
                return -3;
        }
 
-       while((bytes = ws_raw_read(wsh, wsh->buffer + wsh->datalen, wsh->buflen - wsh->datalen)) > 0) {
+       while((bytes = ws_raw_read(wsh, wsh->buffer + wsh->datalen, wsh->buflen - wsh->datalen, WS_BLOCK)) > 0) {
                wsh->datalen += bytes;
                if (strstr(wsh->buffer, "\r\n\r\n") || strstr(wsh->buffer, "\n\n")) {
                        break;
@@ -315,7 +318,7 @@ int ws_handshake(wsh_t *wsh)
 
 }
 
-ssize_t ws_raw_read(wsh_t *wsh, void *data, size_t bytes)
+ssize_t ws_raw_read(wsh_t *wsh, void *data, size_t bytes, int block)
 {
        ssize_t r;
        int err = 0;
@@ -323,15 +326,13 @@ ssize_t ws_raw_read(wsh_t *wsh, void *data, size_t bytes)
        if (wsh->ssl) {
                do {
                        r = SSL_read(wsh->ssl, data, bytes);
-#ifndef _MSC_VER
-                       if (wsh->x++) usleep(10000);
-#else
-                       if (wsh->x++) Sleep(10);
-#endif
+
+                       ms_sleep(10);
+
                        if (r == -1) {
                                err = SSL_get_error(wsh->ssl, r);
 
-                               if (wsh->handshake && err == SSL_ERROR_WANT_READ) {
+                               if (!block && err == SSL_ERROR_WANT_READ) {
                                        r = -2;
                                        goto end;
                                }
@@ -344,11 +345,7 @@ ssize_t ws_raw_read(wsh_t *wsh, void *data, size_t bytes)
 
        do {
                r = recv(wsh->sock, data, bytes, 0);
-#ifndef _MSC_VER
-               if (wsh->x++) usleep(10000);
-#else
-               if (wsh->x++) Sleep(10);
-#endif
+               ms_sleep(10);
        } while (r == -1 && xp_is_blocking(xp_errno()) && wsh->x < 100);
        
        if (wsh->x >= 100) {
@@ -633,7 +630,7 @@ ssize_t ws_read_frame(wsh_t *wsh, ws_opcode_t *oc, uint8_t **data)
                return ws_close(wsh, WS_PROTO_ERR);
        }
 
-       if ((wsh->datalen = ws_raw_read(wsh, wsh->buffer, 9)) < 0) {
+       if ((wsh->datalen = ws_raw_read(wsh, wsh->buffer, 9, WS_NOBLOCK)) < 0) {
                if (wsh->datalen == -2) {
                        return -2;
                }
@@ -641,7 +638,7 @@ ssize_t ws_read_frame(wsh_t *wsh, ws_opcode_t *oc, uint8_t **data)
        }
        
        if (wsh->datalen < need) {
-               if ((wsh->datalen += ws_raw_read(wsh, wsh->buffer + wsh->datalen, 9 - wsh->datalen)) < need) {
+               if ((wsh->datalen += ws_raw_read(wsh, wsh->buffer + wsh->datalen, 9 - wsh->datalen, WS_BLOCK)) < need) {
                        /* too small - protocol err */
                        return ws_close(wsh, WS_PROTO_ERR);
                }
@@ -733,7 +730,7 @@ ssize_t ws_read_frame(wsh_t *wsh, ws_opcode_t *oc, uint8_t **data)
                        wsh->rplen = wsh->plen - need;
 
                        while(need) {
-                               ssize_t r = ws_raw_read(wsh, wsh->payload + wsh->rplen, need);
+                               ssize_t r = ws_raw_read(wsh, wsh->payload + wsh->rplen, need, WS_BLOCK);
 
                                if (r < 1) {
                                        /* invalid read - protocol err .. */
index b9621b38242a57f23fddd6069aa010739ac910d5..699779b515536c9d477761bbd9170a7453c8cb49 100644 (file)
@@ -95,7 +95,7 @@ ssize_t ws_send_buf(wsh_t *wsh, ws_opcode_t oc);
 ssize_t ws_feed_buf(wsh_t *wsh, void *data, size_t bytes);
 
 
-ssize_t ws_raw_read(wsh_t *wsh, void *data, size_t bytes);
+ssize_t ws_raw_read(wsh_t *wsh, void *data, size_t bytes, int block);
 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);