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
pull/1/head
gbdj 8 years ago
parent 5b322f523f
commit 1da7872784

@ -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;
}

@ -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;

@ -182,6 +182,8 @@ typedef void (*BellProc)(struct _rfbClient* client);
*/
typedef void (*GotCursorShapeProc)(struct _rfbClient* client, int xhot, int yhot, int width, int height, int bytesPerPixel);
typedef void (*GotCopyRectProc)(struct _rfbClient* client, int src_x, int src_y, int w, int h, int dest_x, int dest_y);
typedef rfbBool (*LockWriteToTLSProc)(struct _rfbClient* client);
typedef rfbBool (*UnlockWriteToTLSProc)(struct _rfbClient* client);
typedef struct _rfbClient {
uint8_t* frameBuffer;
@ -361,6 +363,10 @@ typedef struct _rfbClient {
/* Output Window ID. When set, client application enables libvncclient to perform direct rendering in its window */
unsigned long outputWindow;
/** Hooks for optional protection WriteToTLS() by mutex */
LockWriteToTLSProc LockWriteToTLS;
UnlockWriteToTLSProc UnlockWriteToTLS;
} rfbClient;
/* cursor.c */

Loading…
Cancel
Save