summaryrefslogtreecommitdiffstats
path: root/libvncclient
diff options
context:
space:
mode:
Diffstat (limited to 'libvncclient')
-rw-r--r--libvncclient/listen.c9
-rw-r--r--libvncclient/rfbproto.c6
-rw-r--r--libvncclient/tls_gnutls.c21
-rw-r--r--libvncclient/vncviewer.c2
4 files changed, 30 insertions, 8 deletions
diff --git a/libvncclient/listen.c b/libvncclient/listen.c
index 739cd9f..e989d6a 100644
--- a/libvncclient/listen.c
+++ b/libvncclient/listen.c
@@ -30,9 +30,6 @@
#ifdef WIN32
#define close closesocket
#include <winsock2.h>
-#ifdef _MINGW32
-#undef max
-#endif // #ifdef _MINGW32
#else // #ifdef WIN32
#include <sys/wait.h>
#include <sys/utsname.h>
@@ -99,7 +96,7 @@ listenForIncomingConnections(rfbClient* client)
if(listen6Socket >= 0)
FD_SET(listen6Socket, &fds);
- r = select(max(listenSocket, listen6Socket)+1, &fds, NULL, NULL, NULL);
+ r = select(rfbMax(listenSocket, listen6Socket)+1, &fds, NULL, NULL, NULL);
if (r > 0) {
if (FD_ISSET(listenSocket, &fds))
@@ -195,9 +192,9 @@ listenForIncomingConnectionsNoFork(rfbClient* client, int timeout)
FD_SET(client->listen6Sock, &fds);
if (timeout < 0)
- r = select(max(client->listenSock, client->listen6Sock) +1, &fds, NULL, NULL, NULL);
+ r = select(rfbMax(client->listenSock, client->listen6Sock) +1, &fds, NULL, NULL, NULL);
else
- r = select(max(client->listenSock, client->listen6Sock) +1, &fds, NULL, NULL, &to);
+ r = select(rfbMax(client->listenSock, client->listen6Sock) +1, &fds, NULL, NULL, &to);
if (r > 0)
{
diff --git a/libvncclient/rfbproto.c b/libvncclient/rfbproto.c
index 187a56a..94b9bdb 100644
--- a/libvncclient/rfbproto.c
+++ b/libvncclient/rfbproto.c
@@ -1492,7 +1492,8 @@ SetFormatAndEncodings(rfbClient* client)
if(e->encodings) {
int* enc;
for(enc = e->encodings; *enc; enc++)
- encs[se->nEncodings++] = rfbClientSwap32IfLE(*enc);
+ if(se->nEncodings < MAX_ENCODINGS)
+ encs[se->nEncodings++] = rfbClientSwap32IfLE(*enc);
}
len = sz_rfbSetEncodingsMsg + se->nEncodings * 4;
@@ -1962,7 +1963,8 @@ HandleRFBServerMessage(rfbClient* client)
y += linesToRead;
}
- } break;
+ break;
+ }
case rfbEncodingCopyRect:
{
diff --git a/libvncclient/tls_gnutls.c b/libvncclient/tls_gnutls.c
index a5a5610..b9ffe89 100644
--- a/libvncclient/tls_gnutls.c
+++ b/libvncclient/tls_gnutls.c
@@ -491,6 +491,14 @@ WriteToTLS(rfbClient* client, char *buf, unsigned int n)
unsigned int offset = 0;
ssize_t ret;
+ if (client->LockWriteToTLS)
+ {
+ if (!client->LockWriteToTLS(client))
+ {
+ rfbClientLog("Callback to get lock in WriteToTLS() failed\n");
+ return -1;
+ }
+ }
while (offset < n)
{
ret = gnutls_record_send((gnutls_session_t)client->tlsSession, buf+offset, (size_t)(n-offset));
@@ -499,10 +507,23 @@ WriteToTLS(rfbClient* client, char *buf, unsigned int n)
{
if (ret == GNUTLS_E_AGAIN || ret == GNUTLS_E_INTERRUPTED) continue;
rfbClientLog("Error writing to TLS: %s.\n", gnutls_strerror(ret));
+ if (client->UnlockWriteToTLS)
+ {
+ if (!client->UnlockWriteToTLS(client))
+ rfbClientLog("Callback to unlock WriteToTLS() failed\n");
+ }
return -1;
}
offset += (unsigned int)ret;
}
+ if (client->UnlockWriteToTLS)
+ {
+ if (!client->UnlockWriteToTLS(client))
+ {
+ rfbClientLog("Callback to unlock WriteToTLS() failed\n");
+ return -1;
+ }
+ }
return offset;
}
diff --git a/libvncclient/vncviewer.c b/libvncclient/vncviewer.c
index af0a50b..d81e298 100644
--- a/libvncclient/vncviewer.c
+++ b/libvncclient/vncviewer.c
@@ -220,6 +220,8 @@ rfbClient* rfbGetClient(int bitsPerSample,int samplesPerPixel,
client->subAuthScheme = 0;
client->GetCredential = NULL;
client->tlsSession = NULL;
+ client->LockWriteToTLS = NULL;
+ client->UnlockWriteToTLS = NULL;
client->sock = -1;
client->listenSock = -1;
client->listenAddress = NULL;