Skip to content

Commit fa40867

Browse files
committed
Adds lastError to rfbClientRec, adds 'error changed' callback
New rfbClientSetErr() function is only being called in auth.c, when simple password authentication fails.
1 parent b44665c commit fa40867

File tree

4 files changed

+46
-1
lines changed

4 files changed

+46
-1
lines changed

include/rfb/rfb.h

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -138,6 +138,9 @@ typedef int (*rfbFileTransferPermitted) (struct _rfbClientRec* cl);
138138
/** Handle the textchat messages */
139139
typedef void (*rfbSetTextChat) (struct _rfbClientRec* cl, int length, char *string);
140140

141+
/* error handling (server side) */
142+
typedef void (*ClientErrorChangedProc)(struct _rfbClientRec *client);
143+
141144
typedef struct {
142145
uint32_t count;
143146
rfbBool is16; /**< is the data format short? */
@@ -302,6 +305,8 @@ typedef struct _rfbScreenInfo
302305
rfbFileTransferPermitted getFileTransferPermission;
303306
rfbSetTextChat setTextChat;
304307

308+
ClientErrorChangedProc clientErrorChanged;
309+
305310
/** newClientHook is called just after a new client is created */
306311
rfbNewClientHookPtr newClientHook;
307312
/** displayHook is called just before a frame buffer update */
@@ -440,6 +445,13 @@ typedef struct _rfbClientRec {
440445
* This is useful if the IO functions have to behave client specific.
441446
*/
442447
void* clientData;
448+
449+
/**
450+
* error handling
451+
*/
452+
453+
char* lastError;
454+
443455
ClientGoneHookPtr clientGoneHook;
444456

445457
rfbSocket sock;
@@ -1017,6 +1029,8 @@ extern rfbBool rfbProcessSizeArguments(int* width,int* height,int* bpp,int* argc
10171029

10181030
extern void rfbLogEnable(int enabled);
10191031
typedef void (*rfbLogProc)(const char *format, ...);
1032+
typedef void (*rfbClientSetErrProc)(rfbClientPtr cl, const char *format, ...);
1033+
extern rfbClientSetErrProc rfbClientSetErr;
10201034
extern rfbLogProc rfbLog, rfbErr;
10211035
extern void rfbLogPerror(const char *str);
10221036

src/libvncserver/auth.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -382,6 +382,7 @@ rfbAuthProcessClientMessage(rfbClientPtr cl)
382382

383383
if(!cl->screen->passwordCheck(cl,(const char*)response,CHALLENGESIZE)) {
384384
rfbErr("rfbAuthProcessClientMessage: password check failed\n");
385+
rfbClientSetErr(cl, "rfbAuthProcessClientMessage: password check failed");
385386
authResult = Swap32IfLE(rfbVncAuthFailed);
386387
if (rfbWriteExact(cl, (char *)&authResult, 4) < 0) {
387388
rfbLogPerror("rfbAuthProcessClientMessage: write");

src/libvncserver/main.c

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -260,8 +260,36 @@ rfbDefaultLog(const char *format, ...)
260260
UNLOCK(logMutex);
261261
}
262262

263+
static void rfbDefaultClientSetErr(rfbClientPtr cl, const char *format, ...) {
264+
// props to josemr goudetalvim (@josealvim) for this logic
265+
va_list ap;
266+
va_start(ap, format);
267+
size_t len = (size_t)vsnprintf(NULL, 0, format, ap);
268+
va_end(ap);
269+
270+
char *buffer = malloc(len + 1);
271+
if (!buffer)
272+
return;
273+
274+
va_start(ap, format);
275+
vsprintf(buffer, format, ap);
276+
277+
va_end(ap);
278+
279+
char *oldError = cl->lastError;
280+
cl->lastError = buffer;
281+
282+
// call the callback if it exists
283+
if (cl->screen->clientErrorChanged != NULL)
284+
cl->screen->clientErrorChanged(cl);
285+
286+
if (oldError)
287+
free(oldError);
288+
}
289+
263290
rfbLogProc rfbLog=rfbDefaultLog;
264291
rfbLogProc rfbErr=rfbDefaultLog;
292+
rfbClientSetErrProc rfbClientSetErr = rfbDefaultClientSetErr;
265293

266294
void rfbLogPerror(const char *str)
267295
{

src/libvncserver/rfbserver.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -715,7 +715,9 @@ rfbProcessClientProtocolVersion(rfbClientPtr cl)
715715
pv[sz_rfbProtocolVersionMsg] = 0;
716716
if (sscanf(pv,rfbProtocolVersionFormat,&major_,&minor_) != 2) {
717717
rfbErr("rfbProcessClientProtocolVersion: not a valid RFB client: %s\n", pv);
718-
rfbCloseClient(cl);
718+
rfbClientSetErr(
719+
cl, "rfbProcessClientProtocolVersion: not a valid RFB client: %s\n", pv);
720+
rfbCloseClient(cl);
719721
return;
720722
}
721723
rfbLog("Client Protocol Version %d.%d\n", major_, minor_);

0 commit comments

Comments
 (0)