diff options
author | Christian Beier <dontmind@freeshell.org> | 2015-01-18 15:49:52 +0100 |
---|---|---|
committer | Christian Beier <dontmind@freeshell.org> | 2015-01-18 15:49:52 +0100 |
commit | 1f5f1679a9858818dcbbcff59beda5f85d304f04 (patch) | |
tree | a64172c5ec33b61310f0ddb65619caab203a3996 /libvncserver | |
parent | b568db93b9f27877deec89c5bc434c71bb30a16d (diff) | |
parent | 6836ccb208f8c16824b8c1e330acb077c70c98c6 (diff) | |
download | libtdevnc-1f5f1679a9858818dcbbcff59beda5f85d304f04.tar.gz libtdevnc-1f5f1679a9858818dcbbcff59beda5f85d304f04.zip |
Merge pull request #57 from maxnet/master
Fix handling of multiple VNC commands per websockets frame
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); +} |