summaryrefslogtreecommitdiffstats
path: root/libvncserver
diff options
context:
space:
mode:
Diffstat (limited to 'libvncserver')
-rw-r--r--libvncserver/Makefile.am3
-rw-r--r--libvncserver/main.c8
-rw-r--r--libvncserver/rfbcrypto_included.c2
-rw-r--r--libvncserver/rfbserver.c27
-rw-r--r--libvncserver/rfbssl_gnutls.c2
-rw-r--r--libvncserver/sockets.c8
-rw-r--r--libvncserver/tight.c6
-rw-r--r--libvncserver/websockets.c13
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);
+}