summaryrefslogtreecommitdiffstats
path: root/libvncclient
diff options
context:
space:
mode:
authorChristian Beier <[email protected]>2016-04-24 17:00:08 +0200
committerChristian Beier <[email protected]>2016-04-24 17:00:08 +0200
commitfc3dfdd9c59a6a36f7add3255aaad50d56228c59 (patch)
tree1f67155bd18492eb8dbbf0b059a66b0c62fdee68 /libvncclient
parent2893c2b057dfddd25efdbda21ff9d2522763489a (diff)
parent1da7872784a78446284b4e8ef71691458296026c (diff)
downloadlibtdevnc-fc3dfdd9c59a6a36f7add3255aaad50d56228c59.tar.gz
libtdevnc-fc3dfdd9c59a6a36f7add3255aaad50d56228c59.zip
Merge pull request #118 from gbdj/threadsafe-100-squash
libvncclient/tls_gnutls.c: Add hooks to WriteToTLS() for optional protection by mutex. (Squashed)
Diffstat (limited to 'libvncclient')
-rw-r--r--libvncclient/tls_gnutls.c21
-rw-r--r--libvncclient/vncviewer.c2
2 files changed, 23 insertions, 0 deletions
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;