diff options
Diffstat (limited to 'libvncserver')
| -rw-r--r-- | libvncserver/Makefile.am | 3 | ||||
| -rw-r--r-- | libvncserver/main.c | 8 | ||||
| -rw-r--r-- | libvncserver/rfbcrypto_included.c | 2 | ||||
| -rw-r--r-- | libvncserver/rfbserver.c | 27 | ||||
| -rw-r--r-- | libvncserver/rfbssl_gnutls.c | 2 | ||||
| -rw-r--r-- | libvncserver/sockets.c | 8 | ||||
| -rw-r--r-- | libvncserver/tight.c | 6 | ||||
| -rw-r--r-- | libvncserver/websockets.c | 13 |
8 files changed, 56 insertions, 13 deletions
diff --git a/libvncserver/Makefile.am b/libvncserver/Makefile.am index cb38c64..de87ef3 100644 --- a/libvncserver/Makefile.am +++ b/libvncserver/Makefile.am @@ -37,7 +37,7 @@ include_HEADERS=../rfb/rfb.h ../rfb/rfbconfig.h ../rfb/rfbint.h \ noinst_HEADERS=../common/d3des.h ../rfb/default8x16.h zrleoutstream.h \ zrlepalettehelper.h zrletypes.h private.h scale.h rfbssl.h rfbcrypto.h \ - ../common/minilzo.h ../common/lzoconf.h ../common/lzodefs.h ../common/md5.h ../common/sha1.h \ + ../common/minilzo.h ../common/lzoconf.h ../common/lzodefs.h ../common/md5.h ../common/sha.h ../common/sha-private.h \ $(TIGHTVNCFILETRANSFERHDRS) EXTRA_DIST=tableinit24.c tableinittctemplate.c tabletranstemplate.c \ @@ -61,6 +61,7 @@ libvncserver_la_SOURCES=$(LIB_SRCS) libvncserver_la_LIBADD=$(WEBSOCKETSSSLLIBS) lib_LTLIBRARIES=libvncserver.la +libvncserver_la_LDFLAGS = -version-info 1:0:0 if HAVE_RPM $(PACKAGE)-$(VERSION).tar.gz: dist 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/rfbcrypto_included.c b/libvncserver/rfbcrypto_included.c index 58c2e93..7feff61 100644 --- a/libvncserver/rfbcrypto_included.c +++ b/libvncserver/rfbcrypto_included.c @@ -23,7 +23,7 @@ #include <string.h> #include "md5.h" -#include "sha1.h" +#include "sha.h" #include "rfbcrypto.h" void digestmd5(const struct iovec *iov, int iovcnt, void *dest) diff --git a/libvncserver/rfbserver.c b/libvncserver/rfbserver.c index f1c7c94..34e1c06 100644 --- a/libvncserver/rfbserver.c +++ b/libvncserver/rfbserver.c @@ -98,13 +98,15 @@ #endif #ifdef WIN32 +#include <direct.h> #ifdef __MINGW32__ #define mkdir(path, perms) mkdir(path) /* Omit the perms argument to match POSIX signature */ #else /* MSVC and other windows compilers */ #define mkdir(path, perms) _mkdir(path) /* Omit the perms argument to match POSIX signature */ #endif /* __MINGW32__ else... */ +#ifndef S_ISDIR #define S_ISDIR(m) (((m) & S_IFDIR) == S_IFDIR) -#include <direct.h> +#endif #endif #ifdef LIBVNCSERVER_HAVE_LIBJPEG @@ -953,7 +955,6 @@ rfbSendSupportedMessages(rfbClientPtr cl) /*rfbSetBit(msgs.client2server, rfbSetSW); */ /*rfbSetBit(msgs.client2server, rfbTextChat); */ rfbSetBit(msgs.client2server, rfbPalmVNCSetScaleFactor); - rfbSetBit(msgs.client2server, rfbXvp); rfbSetBit(msgs.server2client, rfbFramebufferUpdate); rfbSetBit(msgs.server2client, rfbSetColourMapEntries); @@ -961,7 +962,11 @@ rfbSendSupportedMessages(rfbClientPtr cl) rfbSetBit(msgs.server2client, rfbServerCutText); rfbSetBit(msgs.server2client, rfbResizeFrameBuffer); rfbSetBit(msgs.server2client, rfbPalmVNCReSizeFrameBuffer); - rfbSetBit(msgs.server2client, rfbXvp); + + if (cl->screen->xvpHook) { + rfbSetBit(msgs.client2server, rfbXvp); + rfbSetBit(msgs.server2client, rfbXvp); + } memcpy(&cl->updateBuf[cl->ublen], (char *)&msgs, sz_rfbSupportedMessages); cl->ublen += sz_rfbSupportedMessages; @@ -2214,13 +2219,15 @@ rfbProcessClientNormalMessage(rfbClientPtr cl) cl->enableServerIdentity = TRUE; } break; - case rfbEncodingXvp: - rfbLog("Enabling Xvp protocol extension for client " - "%s\n", cl->host); - if (!rfbSendXvp(cl, 1, rfbXvp_Init)) { - rfbCloseClient(cl); - return; - } + case rfbEncodingXvp: + if (cl->screen->xvpHook) { + rfbLog("Enabling Xvp protocol extension for client " + "%s\n", cl->host); + if (!rfbSendXvp(cl, 1, rfbXvp_Init)) { + rfbCloseClient(cl); + return; + } + } break; default: #if defined(LIBVNCSERVER_HAVE_LIBZ) || defined(LIBVNCSERVER_HAVE_LIBPNG) diff --git a/libvncserver/rfbssl_gnutls.c b/libvncserver/rfbssl_gnutls.c index cf60cdc..e58cdad 100644 --- a/libvncserver/rfbssl_gnutls.c +++ b/libvncserver/rfbssl_gnutls.c @@ -109,6 +109,8 @@ struct rfbssl_ctx *rfbssl_init_global(char *key, char *cert) gnutls_global_set_log_function(rfbssl_log_func); gnutls_global_set_log_level(1); gnutls_certificate_set_dh_params(ctx->x509_cred, ctx->dh_params); + /* newly allocated memory should be initialized, at least where it is important */ + ctx->peekstart = ctx->peeklen = 0; return ctx; } 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/tight.c b/libvncserver/tight.c index 276a2e3..89a7f25 100644 --- a/libvncserver/tight.c +++ b/libvncserver/tight.c @@ -163,7 +163,11 @@ void rfbTightCleanup (rfbScreenInfoPtr screen) tightAfterBufSize = 0; tightAfterBuf = NULL; } - if (j) tjDestroy(j); + if (j) { + tjDestroy(j); + /* Set freed resource handle to 0! */ + j = 0; + } } 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); +} |
