From 2ccc771825f539640ee4dc15f81ae3b634d5a2d3 Mon Sep 17 00:00:00 2001 From: Anthony Minessale Date: Fri, 25 Jan 2013 17:25:26 -0600 Subject: [PATCH] fix cpu race on ws poll --- libs/sofia-sip/libsofia-sip-ua/tport/tport_type_ws.c | 8 +++++++- libs/sofia-sip/libsofia-sip-ua/tport/ws.c | 7 +++++-- 2 files changed, 12 insertions(+), 3 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 1f923670ca..fabd68e349 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 @@ -205,7 +205,9 @@ int tport_recv_stream_ws(tport_t *self) ws_opcode_t oc; if ( !wstp->ws_initialized ) { - ws_init(ws, self->tp_socket, 65336, wstp->ws_secure ? wspri->ssl_ctx : NULL); + if (ws_init(ws, self->tp_socket, 65336, wstp->ws_secure ? wspri->ssl_ctx : NULL) == -2) { + return 2; + } wstp->ws_initialized = 1; self->tp_pre_framed = 1; return 1; @@ -213,6 +215,10 @@ int tport_recv_stream_ws(tport_t *self) N = ws_read_frame(ws, &oc, &data); + if (N == -2) { + return 2; + } + if (N == -1000) { if (self->tp_msg) msg_recv_commit(self->tp_msg, 0, 1); diff --git a/libs/sofia-sip/libsofia-sip-ua/tport/ws.c b/libs/sofia-sip/libsofia-sip-ua/tport/ws.c index b612cf596f..bdbef0aebc 100644 --- a/libs/sofia-sip/libsofia-sip-ua/tport/ws.c +++ b/libs/sofia-sip/libsofia-sip-ua/tport/ws.c @@ -283,18 +283,21 @@ int ws_handshake(wsh_t *wsh) ssize_t ws_raw_read(wsh_t *wsh, void *data, size_t bytes) { ssize_t r; + int x = 0; if (wsh->ssl) { do { r = SSL_read(wsh->ssl, data, bytes); - } while (r == -1 && SSL_get_error(wsh->ssl, r) == SSL_ERROR_WANT_READ); + if (x++) {usleep(10000); + } while (r == -1 && SSL_get_error(wsh->ssl, r) == SSL_ERROR_WANT_READ && x < 100); return r; } do { r = recv(wsh->sock, data, bytes, 0); - } while (r == -1 && (errno == EAGAIN || errno == EINTR)); + if (x++) {usleep(10000); + } while (r == -1 && (errno == EAGAIN || errno == EINTR) && x < 100); if (r<0) { //printf("READ FAIL: %s\n", strerror(errno));