mirror of
https://github.com/warmcat/libwebsockets.git
synced 2025-03-09 00:00:04 +01:00
recv() may not return all data
While performing handshake recv() is called only once. It may return only part of the data and handshake will fail. This patch modifies libwebsocket_service_fd() to ensure that there is not data left in the socket. Signed-off-by: Pavel Borzenkov <pavel.borzenkov@auriga.com>
This commit is contained in:
parent
71ea500081
commit
876534b0d5
2 changed files with 23 additions and 3 deletions
|
@ -34,6 +34,7 @@ libwebsocket_client_connect(struct libwebsocket_context *context,
|
|||
{
|
||||
struct hostent *server_hostent;
|
||||
struct sockaddr_in server_addr;
|
||||
struct timeval tv;
|
||||
char pkt[512];
|
||||
struct pollfd pfd;
|
||||
struct libwebsocket *wsi;
|
||||
|
@ -168,6 +169,12 @@ libwebsocket_client_connect(struct libwebsocket_context *context,
|
|||
/* Disable Nagle */
|
||||
setsockopt(wsi->sock, IPPROTO_TCP, TCP_NODELAY, &opt, sizeof(opt));
|
||||
|
||||
/* Set receiving timeout */
|
||||
tv.tv_sec = 0;
|
||||
tv.tv_usec = 100 * 1000;
|
||||
setsockopt(wsi->sock, SOL_SOCKET, SO_RCVTIMEO, (char *)&tv,
|
||||
sizeof(tv));
|
||||
|
||||
if (connect(wsi->sock, (struct sockaddr *)&server_addr,
|
||||
sizeof(struct sockaddr)) == -1) {
|
||||
fprintf(stderr, "Connect failed\n");
|
||||
|
|
|
@ -614,7 +614,19 @@ user_service:
|
|||
return 0;
|
||||
}
|
||||
|
||||
static ssize_t
|
||||
libwebsocket_recv(int sock, void *buf, size_t len, int flags)
|
||||
{
|
||||
int n, ret = 0;
|
||||
|
||||
while ((len > 0) && (n = recv(sock, (char *)buf + ret, len,
|
||||
flags)) > 0) {
|
||||
ret += n;
|
||||
len -= n;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* libwebsocket_service_fd() - Service polled socket with something waiting
|
||||
|
@ -1008,7 +1020,7 @@ libwebsocket_service_fd(struct libwebsocket_context *context,
|
|||
return 1;
|
||||
}
|
||||
|
||||
n = recv(wsi->sock, pkt, sizeof pkt, 0);
|
||||
n = libwebsocket_recv(wsi->sock, pkt, sizeof pkt, 0);
|
||||
if (n < 0) {
|
||||
libwebsocket_close_and_free_session(context, wsi,
|
||||
LWS_CLOSE_STATUS_NOSTATUS);
|
||||
|
@ -1352,7 +1364,7 @@ issue_hdr:
|
|||
len = SSL_read(wsi->ssl, pkt, sizeof pkt);
|
||||
else
|
||||
#endif
|
||||
len = recv(wsi->sock, pkt, sizeof pkt, 0);
|
||||
len = libwebsocket_recv(wsi->sock, pkt, sizeof pkt, 0);
|
||||
|
||||
if (len < 0) {
|
||||
fprintf(stderr,
|
||||
|
@ -1737,7 +1749,8 @@ bail2:
|
|||
else
|
||||
#endif
|
||||
eff_buf.token_len =
|
||||
recv(pollfd->fd, buf, sizeof buf, 0);
|
||||
libwebsocket_recv(pollfd->fd, buf,
|
||||
sizeof buf, 0);
|
||||
|
||||
if (eff_buf.token_len < 0) {
|
||||
fprintf(stderr, "Socket read returned %d\n",
|
||||
|
|
Loading…
Add table
Reference in a new issue