From 1da7872784a78446284b4e8ef71691458296026c Mon Sep 17 00:00:00 2001
From: gbdj <gbdj@users.noreply.github.com>
Date: Sat, 23 Apr 2016 14:42:49 +0400
Subject: libvncclient/tls_gnutls.c: Add hooks to WriteToTLS() for optional
 protection by mutex. Fix upstream issue #100

Squashed commit of the pull request #101 :
commit 1c7e01e81862bc46508e675e83c74cc6d63224b0
commit 1e749b094d6696380d3f0540a00138d7e3427874
---
 libvncclient/tls_gnutls.c | 21 +++++++++++++++++++++
 libvncclient/vncviewer.c  |  2 ++
 2 files changed, 23 insertions(+)

(limited to 'libvncclient')

diff --git a/libvncclient/tls_gnutls.c b/libvncclient/tls_gnutls.c
index 3daa416..91cea67 100644
--- a/libvncclient/tls_gnutls.c
+++ b/libvncclient/tls_gnutls.c
@@ -480,6 +480,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));
@@ -488,10 +496,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;
-- 
cgit v1.2.1