summaryrefslogtreecommitdiffstats
path: root/libvncserver
diff options
context:
space:
mode:
Diffstat (limited to 'libvncserver')
-rw-r--r--libvncserver/cargs.c4
-rw-r--r--libvncserver/cursor.c8
-rw-r--r--libvncserver/httpd.c2
-rw-r--r--libvncserver/rfbserver.c18
-rw-r--r--libvncserver/sockets.c6
-rw-r--r--libvncserver/tableinit24.c11
-rw-r--r--libvncserver/tight.c7
-rw-r--r--libvncserver/tightvnc-filetransfer/filetransfermsg.c14
-rw-r--r--libvncserver/tightvnc-filetransfer/filetransfermsg.h3
-rw-r--r--libvncserver/tightvnc-filetransfer/handlefiletransferrequest.c20
-rw-r--r--libvncserver/tightvnc-filetransfer/rfbtightproto.h1
-rw-r--r--libvncserver/tightvnc-filetransfer/rfbtightserver.c7
-rw-r--r--libvncserver/ultra.c4
-rw-r--r--libvncserver/websockets.c21
-rw-r--r--libvncserver/ws_decode.h4
-rw-r--r--libvncserver/zlib.c7
16 files changed, 83 insertions, 54 deletions
diff --git a/libvncserver/cargs.c b/libvncserver/cargs.c
index 4da04b5..85b937d 100644
--- a/libvncserver/cargs.c
+++ b/libvncserver/cargs.c
@@ -43,6 +43,10 @@ rfbUsage(void)
"new non-shared\n"
" connection comes in (refuse new connection "
"instead)\n");
+#ifdef LIBVNCSERVER_WITH_WEBSOCKETS
+ fprintf(stderr, "-sslkeyfile path set path to private key file for encrypted WebSockets connections\n");
+ fprintf(stderr, "-sslcertfile path set path to certificate file for encrypted WebSockets connections\n");
+#endif
fprintf(stderr, "-httpdir dir-path enable http server using dir-path home\n");
fprintf(stderr, "-httpport portnum use portnum for http connection\n");
#ifdef LIBVNCSERVER_IPv6
diff --git a/libvncserver/cursor.c b/libvncserver/cursor.c
index c071dd9..8779470 100644
--- a/libvncserver/cursor.c
+++ b/libvncserver/cursor.c
@@ -456,10 +456,10 @@ void rfbMakeRichCursorFromXCursor(rfbScreenInfoPtr rfbScreen,rfbCursorPtr cursor
fore+=4-bpp;
}
- background=cursor->backRed<<format->redShift|
- cursor->backGreen<<format->greenShift|cursor->backBlue<<format->blueShift;
- foreground=cursor->foreRed<<format->redShift|
- cursor->foreGreen<<format->greenShift|cursor->foreBlue<<format->blueShift;
+ background=(uint32_t)cursor->backRed<<format->redShift|
+ (uint32_t)cursor->backGreen<<format->greenShift|(uint32_t)cursor->backBlue<<format->blueShift;
+ foreground=(uint32_t)cursor->foreRed<<format->redShift|
+ (uint32_t)cursor->foreGreen<<format->greenShift|(uint32_t)cursor->foreBlue<<format->blueShift;
for(j=0;j<cursor->height;j++)
for(i=0,bit=0x80;i<cursor->width;i++,bit=(bit&1)?0x80:bit>>1,cp+=bpp)
diff --git a/libvncserver/httpd.c b/libvncserver/httpd.c
index 26d49af..efb97b3 100644
--- a/libvncserver/httpd.c
+++ b/libvncserver/httpd.c
@@ -462,6 +462,8 @@ httpProcessInput(rfbScreenInfoPtr rfbScreen)
contentType = "Content-Type: text/css\r\n";
else if(ext && strcasecmp(ext, ".svg") == 0)
contentType = "Content-Type: image/svg+xml\r\n";
+ else if(ext && strcasecmp(ext, ".js") == 0)
+ contentType = "Content-Type: application/javascript\r\n";
rfbWriteExact(&cl, contentType, strlen(contentType));
/* end the header */
rfbWriteExact(&cl, "\r\n", 2);
diff --git a/libvncserver/rfbserver.c b/libvncserver/rfbserver.c
index f13050d..7af8490 100644
--- a/libvncserver/rfbserver.c
+++ b/libvncserver/rfbserver.c
@@ -463,9 +463,7 @@ rfbNewTCPOrUDPClient(rfbScreenInfoPtr rfbScreen,
#ifdef LIBVNCSERVER_WITH_WEBSOCKETS
/*
- * Wait a few ms for the client to send one of:
- * - Flash policy request
- * - WebSockets connection (TLS/SSL or plain)
+ * Wait a few ms for the client to send WebSockets connection (TLS/SSL or plain)
*/
if (!webSocketsCheck(cl)) {
/* Error reporting handled in webSocketsHandshake */
@@ -1468,11 +1466,21 @@ char *rfbProcessFileTransferReadBuffer(rfbClientPtr cl, uint32_t length)
int n=0;
FILEXFER_ALLOWED_OR_CLOSE_AND_RETURN("", cl, NULL);
+
/*
- rfbLog("rfbProcessFileTransferReadBuffer(%dlen)\n", length);
+ We later alloc length+1, which might wrap around on 32-bit systems if length equals
+ 0XFFFFFFFF, i.e. SIZE_MAX for 32-bit systems. On 64-bit systems, a length of 0XFFFFFFFF
+ will safely be allocated since this check will never trigger and malloc() can digest length+1
+ without problems as length is a uint32_t.
*/
+ if(length == SIZE_MAX) {
+ rfbErr("rfbProcessFileTransferReadBuffer: too big file transfer length requested: %u", (unsigned int)length);
+ rfbCloseClient(cl);
+ return NULL;
+ }
+
if (length>0) {
- buffer=malloc(length+1);
+ buffer=malloc((size_t)length+1);
if (buffer!=NULL) {
if ((n = rfbReadExact(cl, (char *)buffer, length)) <= 0) {
if (n != 0)
diff --git a/libvncserver/sockets.c b/libvncserver/sockets.c
index bbc3d90..fe54a37 100644
--- a/libvncserver/sockets.c
+++ b/libvncserver/sockets.c
@@ -109,7 +109,13 @@ int deny_severity=LOG_WARNING;
#pragma warning (disable: 4018 4761)
#endif
#define read(sock,buf,len) recv(sock,buf,len,0)
+#ifdef EWOULDBLOCK
+#undef EWOULDBLOCK
+#endif
#define EWOULDBLOCK WSAEWOULDBLOCK
+#ifdef ETIMEDOUT
+#undef ETIMEDOUT
+#endif
#define ETIMEDOUT WSAETIMEDOUT
#define write(sock,buf,len) send(sock,buf,len,0)
#else
diff --git a/libvncserver/tableinit24.c b/libvncserver/tableinit24.c
index 39e9920..5c5823c 100644
--- a/libvncserver/tableinit24.c
+++ b/libvncserver/tableinit24.c
@@ -147,11 +147,12 @@ rfbInitOneRGBTable24 (uint8_t *table, int inMax, int outMax, int outShift,
for (i = 0; i < nEntries; i++) {
outValue = ((i * outMax + inMax / 2) / inMax) << outShift;
*(uint32_t *)&table[3*i] = outValue;
- if(!rfbEndianTest)
+ if(!rfbEndianTest) {
memmove(table+3*i,table+3*i+1,3);
- if (swap) {
- c = table[3*i]; table[3*i] = table[3*i+2];
- table[3*i+2] = c;
- }
+ }
+ if (swap) {
+ c = table[3*i]; table[3*i] = table[3*i+2];
+ table[3*i+2] = c;
+ }
}
}
diff --git a/libvncserver/tight.c b/libvncserver/tight.c
index 1081c8f..d6f4749 100644
--- a/libvncserver/tight.c
+++ b/libvncserver/tight.c
@@ -57,10 +57,11 @@
* that we resort to using thread local storage instead of having
* per-client data.
*/
-#if LIBVNCSERVER_HAVE_LIBPTHREAD && LIBVNCSERVER_HAVE_TLS && !defined(TLS) && defined(__linux__)
+#if defined(__GNUC__)
#define TLS __thread
-#endif
-#ifndef TLS
+#elif defined(_MSC_VER)
+#define TLS __declspec(thread)
+#else
#define TLS
#endif
diff --git a/libvncserver/tightvnc-filetransfer/filetransfermsg.c b/libvncserver/tightvnc-filetransfer/filetransfermsg.c
index 5f84e7f..0003b11 100644
--- a/libvncserver/tightvnc-filetransfer/filetransfermsg.c
+++ b/libvncserver/tightvnc-filetransfer/filetransfermsg.c
@@ -672,7 +672,7 @@ ChkFileUploadWriteErr(rfbClientPtr cl, rfbTightClientPtr rtcp, char* pBuf)
char reason[] = "Error writing file data";
int reasonLen = strlen(reason);
ftm = CreateFileUploadErrMsg(reason, reasonLen);
- CloseUndoneFileTransfer(cl, rtcp);
+ CloseUndoneFileUpload(cl, rtcp);
}
return ftm;
}
@@ -735,7 +735,7 @@ CreateFileUploadErrMsg(char* reason, unsigned int reasonLen)
******************************************************************************/
void
-CloseUndoneFileTransfer(rfbClientPtr cl, rfbTightClientPtr rtcp)
+CloseUndoneFileUpload(rfbClientPtr cl, rfbTightClientPtr rtcp)
{
/* TODO :: File Upload case is not handled currently */
/* TODO :: In case of concurrency we need to use Critical Section */
@@ -759,9 +759,19 @@ CloseUndoneFileTransfer(rfbClientPtr cl, rfbTightClientPtr rtcp)
memset(rtcp->rcft.rcfu.fName, 0 , PATH_MAX);
}
+}
+
+
+void
+CloseUndoneFileDownload(rfbClientPtr cl, rfbTightClientPtr rtcp)
+{
+ if(cl == NULL)
+ return;
if(rtcp->rcft.rcfd.downloadInProgress == TRUE) {
rtcp->rcft.rcfd.downloadInProgress = FALSE;
+ /* the thread will return if downloadInProgress is FALSE */
+ pthread_join(rtcp->rcft.rcfd.downloadThread, NULL);
if(rtcp->rcft.rcfd.downloadFD != -1) {
close(rtcp->rcft.rcfd.downloadFD);
diff --git a/libvncserver/tightvnc-filetransfer/filetransfermsg.h b/libvncserver/tightvnc-filetransfer/filetransfermsg.h
index 3b27bd0..bbb9148 100644
--- a/libvncserver/tightvnc-filetransfer/filetransfermsg.h
+++ b/libvncserver/tightvnc-filetransfer/filetransfermsg.h
@@ -51,7 +51,8 @@ FileTransferMsg ChkFileUploadWriteErr(rfbClientPtr cl, rfbTightClientPtr data, c
void CreateDirectory(char* dirName);
void FileUpdateComplete(rfbClientPtr cl, rfbTightClientPtr data);
-void CloseUndoneFileTransfer(rfbClientPtr cl, rfbTightClientPtr data);
+void CloseUndoneFileUpload(rfbClientPtr cl, rfbTightClientPtr data);
+void CloseUndoneFileDownload(rfbClientPtr cl, rfbTightClientPtr data);
void FreeFileTransferMsg(FileTransferMsg ftm);
diff --git a/libvncserver/tightvnc-filetransfer/handlefiletransferrequest.c b/libvncserver/tightvnc-filetransfer/handlefiletransferrequest.c
index c511eed..71fb085 100644
--- a/libvncserver/tightvnc-filetransfer/handlefiletransferrequest.c
+++ b/libvncserver/tightvnc-filetransfer/handlefiletransferrequest.c
@@ -489,12 +489,6 @@ RunFileDownloadThread(void* client)
if(rfbWriteExact(cl, fileDownloadMsg.data, fileDownloadMsg.length) < 0) {
rfbLog("File [%s]: Method [%s]: Error while writing to socket \n"
, __FILE__, __FUNCTION__);
-
- if(cl != NULL) {
- rfbCloseClient(cl);
- CloseUndoneFileTransfer(cl, rtcp);
- }
-
FreeFileTransferMsg(fileDownloadMsg);
return NULL;
}
@@ -508,7 +502,6 @@ RunFileDownloadThread(void* client)
void
HandleFileDownload(rfbClientPtr cl, rfbTightClientPtr rtcp)
{
- pthread_t fileDownloadThread;
FileTransferMsg fileDownloadMsg;
memset(&fileDownloadMsg, 0, sizeof(FileTransferMsg));
@@ -518,10 +511,9 @@ HandleFileDownload(rfbClientPtr cl, rfbTightClientPtr rtcp)
FreeFileTransferMsg(fileDownloadMsg);
return;
}
- rtcp->rcft.rcfd.downloadInProgress = FALSE;
- rtcp->rcft.rcfd.downloadFD = -1;
+ CloseUndoneFileDownload(cl, rtcp);
- if(pthread_create(&fileDownloadThread, NULL, RunFileDownloadThread, (void*)
+ if(pthread_create(&rtcp->rcft.rcfd.downloadThread, NULL, RunFileDownloadThread, (void*)
cl) != 0) {
FileTransferMsg ftm = GetFileDownLoadErrMsg();
@@ -585,13 +577,15 @@ HandleFileDownloadCancelRequest(rfbClientPtr cl, rfbTightClientPtr rtcp)
"FileDownloadCancelMsg\n", __FILE__, __FUNCTION__);
rfbCloseClient(cl);
+ free(reason);
+ return;
}
rfbLog("File [%s]: Method [%s]: File Download Cancel Request received:"
" reason <%s>\n", __FILE__, __FUNCTION__, reason);
pthread_mutex_lock(&fileDownloadMutex);
- CloseUndoneFileTransfer(cl, rtcp);
+ CloseUndoneFileDownload(cl, rtcp);
pthread_mutex_unlock(&fileDownloadMutex);
if(reason != NULL) {
@@ -834,7 +828,7 @@ HandleFileUploadDataRequest(rfbClientPtr cl, rfbTightClientPtr rtcp)
FreeFileTransferMsg(ftm);
}
- CloseUndoneFileTransfer(cl, rtcp);
+ CloseUndoneFileUpload(cl, rtcp);
if(pBuf != NULL) {
free(pBuf);
@@ -934,7 +928,7 @@ HandleFileUploadFailedRequest(rfbClientPtr cl, rfbTightClientPtr rtcp)
rfbLog("File [%s]: Method [%s]: File Upload Failed Request received:"
" reason <%s>\n", __FILE__, __FUNCTION__, reason);
- CloseUndoneFileTransfer(cl, rtcp);
+ CloseUndoneFileUpload(cl, rtcp);
if(reason != NULL) {
free(reason);
diff --git a/libvncserver/tightvnc-filetransfer/rfbtightproto.h b/libvncserver/tightvnc-filetransfer/rfbtightproto.h
index d0fe642..30fc5f5 100644
--- a/libvncserver/tightvnc-filetransfer/rfbtightproto.h
+++ b/libvncserver/tightvnc-filetransfer/rfbtightproto.h
@@ -148,6 +148,7 @@ typedef struct _rfbClientFileDownload {
int downloadInProgress;
unsigned long mTime;
int downloadFD;
+ pthread_t downloadThread;
} rfbClientFileDownload ;
typedef struct _rfbClientFileUpload {
diff --git a/libvncserver/tightvnc-filetransfer/rfbtightserver.c b/libvncserver/tightvnc-filetransfer/rfbtightserver.c
index 67d4cb5..651d8fb 100644
--- a/libvncserver/tightvnc-filetransfer/rfbtightserver.c
+++ b/libvncserver/tightvnc-filetransfer/rfbtightserver.c
@@ -26,6 +26,7 @@
#include <rfb/rfb.h>
#include "rfbtightproto.h"
#include "handlefiletransferrequest.h"
+#include "filetransfermsg.h"
/*
* Get my data!
@@ -448,9 +449,11 @@ rfbTightExtensionMsgHandler(struct _rfbClientRec* cl, void* data,
void
rfbTightExtensionClientClose(rfbClientPtr cl, void* data) {
- if(data != NULL)
+ if(data != NULL) {
+ CloseUndoneFileUpload(cl, data);
+ CloseUndoneFileDownload(cl, data);
free(data);
-
+ }
}
void
diff --git a/libvncserver/ultra.c b/libvncserver/ultra.c
index 83bddaa..cd625a5 100644
--- a/libvncserver/ultra.c
+++ b/libvncserver/ultra.c
@@ -8,7 +8,11 @@
*/
#include <rfb/rfb.h>
+#ifdef LIBVNCSERVER_HAVE_LZO
+#include <lzo/lzo1x.h>
+#else
#include "minilzo.h"
+#endif
/*
* cl->beforeEncBuf contains pixel data in the client's format.
diff --git a/libvncserver/websockets.c b/libvncserver/websockets.c
index 4ebff72..616c81c 100644
--- a/libvncserver/websockets.c
+++ b/libvncserver/websockets.c
@@ -61,9 +61,6 @@ static int gettid() {
}
#endif
-#define FLASH_POLICY_RESPONSE "<cross-domain-policy><allow-access-from domain=\"*\" to-ports=\"*\" /></cross-domain-policy>\n"
-#define SZ_FLASH_POLICY_RESPONSE 93
-
/*
* draft-ietf-hybi-thewebsocketprotocol-10
* 5.2.2. Sending the Server's Opening Handshake
@@ -144,13 +141,6 @@ webSocketsCheck (rfbClientPtr cl)
if (strncmp(bbuf, "RFB ", 4) == 0) {
rfbLog("Normal socket connection\n");
return TRUE;
- } else if (strncmp(bbuf, "<", 1) == 0) {
- rfbLog("Got Flash policy request, sending response\n");
- if (rfbWriteExact(cl, FLASH_POLICY_RESPONSE,
- SZ_FLASH_POLICY_RESPONSE) < 0) {
- rfbErr("webSocketsHandshake: failed sending Flash policy response");
- }
- return FALSE;
} else if (strncmp(bbuf, "\x16", 1) == 0 || strncmp(bbuf, "\x80", 1) == 0) {
rfbLog("Got TLS/SSL WebSockets connection\n");
if (-1 == rfbssl_init(cl)) {
@@ -208,12 +198,15 @@ webSocketsHandshake(rfbClientPtr cl, char *scheme)
if ((n < 0) && (errno == ETIMEDOUT)) {
break;
}
- if (n == 0)
+ if (n == 0) {
rfbLog("webSocketsHandshake: client gone\n");
- else
+ }
+ else {
rfbLogPerror("webSocketsHandshake: read");
- free(response);
- free(buf);
+ }
+
+ free(response);
+ free(buf);
return FALSE;
}
diff --git a/libvncserver/ws_decode.h b/libvncserver/ws_decode.h
index 709477a..eb774a4 100644
--- a/libvncserver/ws_decode.h
+++ b/libvncserver/ws_decode.h
@@ -110,7 +110,7 @@ typedef struct ws_header_data_s {
unsigned char fin;
} ws_header_data_t;
-typedef struct ws_ctx_s {
+struct ws_ctx_s {
char codeBufDecode[2048 + WSHLENMAX]; /* base64 + maximum frame header length */
char codeBufEncode[B64LEN(UPDATE_BUF_SIZE) + WSHLENMAX]; /* base64 + maximum frame header length */
char *writePos;
@@ -126,7 +126,7 @@ typedef struct ws_ctx_s {
wsEncodeFunc encode;
wsDecodeFunc decode;
ctxInfo_t ctxInfo;
-} ws_ctx_t;
+};
enum
{
diff --git a/libvncserver/zlib.c b/libvncserver/zlib.c
index 45a1314..6fee4df 100644
--- a/libvncserver/zlib.c
+++ b/libvncserver/zlib.c
@@ -45,10 +45,11 @@
* tight. N.B. ZRLE does it the traditional way with per-client storage
* (and so at least ZRLE will work threaded on older systems.)
*/
-#if LIBVNCSERVER_HAVE_LIBPTHREAD && LIBVNCSERVER_HAVE_TLS && !defined(TLS) && defined(__linux__)
+#if defined(__GNUC__)
#define TLS __thread
-#endif
-#ifndef TLS
+#elif defined(_MSC_VER)
+#define TLS __declspec(thread)
+#else
#define TLS
#endif