Merge pull request #118 from gbdj/threadsafe-100-squash

libvncclient/tls_gnutls.c: Add hooks to WriteToTLS() for optional protection by mutex. (Squashed)
pull/1/head
Christian Beier 9 years ago
commit fc3dfdd9c5

@ -480,6 +480,14 @@ WriteToTLS(rfbClient* client, char *buf, unsigned int n)
unsigned int offset = 0; unsigned int offset = 0;
ssize_t ret; ssize_t ret;
if (client->LockWriteToTLS)
{
if (!client->LockWriteToTLS(client))
{
rfbClientLog("Callback to get lock in WriteToTLS() failed\n");
return -1;
}
}
while (offset < n) while (offset < n)
{ {
ret = gnutls_record_send((gnutls_session_t)client->tlsSession, buf+offset, (size_t)(n-offset)); 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; if (ret == GNUTLS_E_AGAIN || ret == GNUTLS_E_INTERRUPTED) continue;
rfbClientLog("Error writing to TLS: %s.\n", gnutls_strerror(ret)); 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; return -1;
} }
offset += (unsigned int)ret; offset += (unsigned int)ret;
} }
if (client->UnlockWriteToTLS)
{
if (!client->UnlockWriteToTLS(client))
{
rfbClientLog("Callback to unlock WriteToTLS() failed\n");
return -1;
}
}
return offset; return offset;
} }

@ -220,6 +220,8 @@ rfbClient* rfbGetClient(int bitsPerSample,int samplesPerPixel,
client->subAuthScheme = 0; client->subAuthScheme = 0;
client->GetCredential = NULL; client->GetCredential = NULL;
client->tlsSession = NULL; client->tlsSession = NULL;
client->LockWriteToTLS = NULL;
client->UnlockWriteToTLS = NULL;
client->sock = -1; client->sock = -1;
client->listenSock = -1; client->listenSock = -1;
client->listenAddress = NULL; 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 (*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 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 { typedef struct _rfbClient {
uint8_t* frameBuffer; 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 */ /* Output Window ID. When set, client application enables libvncclient to perform direct rendering in its window */
unsigned long outputWindow; unsigned long outputWindow;
/** Hooks for optional protection WriteToTLS() by mutex */
LockWriteToTLSProc LockWriteToTLS;
UnlockWriteToTLSProc UnlockWriteToTLS;
} rfbClient; } rfbClient;
/* cursor.c */ /* cursor.c */

Loading…
Cancel
Save