diff options
author | Floris Bos <bos@je-eigen-domein.nl> | 2015-01-17 22:49:48 +0100 |
---|---|---|
committer | Floris Bos <bos@je-eigen-domein.nl> | 2015-01-17 22:49:48 +0100 |
commit | 6836ccb208f8c16824b8c1e330acb077c70c98c6 (patch) | |
tree | 0be8f48f5160109fc10b19f5f9f90fbfd9e97c0e /libvncserver | |
parent | a48035a1ce6b5fa9738e9f1762294ddfe52b8d57 (diff) | |
download | libtdevnc-6836ccb208f8c16824b8c1e330acb077c70c98c6.tar.gz libtdevnc-6836ccb208f8c16824b8c1e330acb077c70c98c6.zip |
Fix handling of multiple VNC commands per websockets frame
- When processing input, check if there is any extra data
pending in the internal websocket frame and SSL buffers.
- Prevents input events lagging behind because they get
stuck in one of the buffers.
Data pending in our own buffers cannot be detected with
select() so was not processed until more input arrives
from the network.
- Closes # 55
Signed-off-by: Floris Bos <bos@je-eigen-domein.nl>
Diffstat (limited to 'libvncserver')
-rw-r--r-- | libvncserver/main.c | 8 | ||||
-rw-r--r-- | libvncserver/sockets.c | 8 | ||||
-rw-r--r-- | libvncserver/websockets.c | 13 |
3 files changed, 29 insertions, 0 deletions
diff --git a/libvncserver/main.c b/libvncserver/main.c index 9839c85..a8458e4 100644 --- a/libvncserver/main.c +++ b/libvncserver/main.c @@ -550,7 +550,15 @@ clientInput(void *data) rfbSendFileTransferChunk(cl); if (FD_ISSET(cl->sock, &rfds) || FD_ISSET(cl->sock, &efds)) + { +#ifdef LIBVNCSERVER_WITH_WEBSOCKETS + do { + rfbProcessClientMessage(cl); + } while (webSocketsHasDataInBuffer(cl)); +#else rfbProcessClientMessage(cl); +#endif + } } /* Get rid of the output thread. */ diff --git a/libvncserver/sockets.c b/libvncserver/sockets.c index a9c5a2c..2bb655e 100644 --- a/libvncserver/sockets.c +++ b/libvncserver/sockets.c @@ -391,7 +391,15 @@ rfbCheckFds(rfbScreenInfoPtr rfbScreen,long usec) if (FD_ISSET(cl->sock, &(rfbScreen->allFds))) { if (FD_ISSET(cl->sock, &fds)) + { +#ifdef LIBVNCSERVER_WITH_WEBSOCKETS + do { + rfbProcessClientMessage(cl); + } while (webSocketsHasDataInBuffer(cl)); +#else rfbProcessClientMessage(cl); +#endif + } else rfbSendFileTransferChunk(cl); } diff --git a/libvncserver/websockets.c b/libvncserver/websockets.c index 34f04d7..3585ed5 100644 --- a/libvncserver/websockets.c +++ b/libvncserver/websockets.c @@ -905,3 +905,16 @@ webSocketCheckDisconnect(rfbClientPtr cl) return FALSE; } +/* returns TRUE if there is data waiting to be read in our internal buffer + * or if is there any pending data in the buffer of the SSL implementation + */ +rfbBool +webSocketsHasDataInBuffer(rfbClientPtr cl) +{ + ws_ctx_t *wsctx = (ws_ctx_t *)cl->wsctx; + + if (wsctx && wsctx->readbuflen) + return TRUE; + + return (cl->sslctx && rfbssl_pending(cl) > 0); +} |