Skip to content

Commit 74150e9

Browse files
committed
libvncserver: avoid deferUpdateTime overflow
1 parent a0d06dc commit 74150e9

1 file changed

Lines changed: 15 additions & 2 deletions

File tree

src/libvncserver/main.c

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919

2020
#include <stdarg.h>
2121
#include <errno.h>
22+
#include <limits.h>
2223

2324
#ifndef false
2425
#define false 0
@@ -1263,6 +1264,18 @@ static void gettimeofday(struct timeval* tv,char* dummy)
12631264
}
12641265
#endif
12651266

1267+
static long
1268+
rfbDeferUpdateTimeToUsec(rfbScreenInfoPtr screen)
1269+
{
1270+
if(screen->deferUpdateTime <= 0)
1271+
return 0;
1272+
1273+
if(screen->deferUpdateTime > LONG_MAX / 1000L)
1274+
return LONG_MAX;
1275+
1276+
return (long)screen->deferUpdateTime * 1000L;
1277+
}
1278+
12661279
rfbBool
12671280
rfbProcessEvents(rfbScreenInfoPtr screen,long usec)
12681281
{
@@ -1273,7 +1286,7 @@ rfbProcessEvents(rfbScreenInfoPtr screen,long usec)
12731286
rfbGetClientIteratorWithClosed(rfbScreenInfoPtr rfbScreen);
12741287

12751288
if(usec<0)
1276-
usec=screen->deferUpdateTime*1000;
1289+
usec=rfbDeferUpdateTimeToUsec(screen);
12771290

12781291
rfbCheckFds(screen,usec);
12791292
rfbHttpCheckFds(screen);
@@ -1353,7 +1366,7 @@ rfbBool rfbIsActive(rfbScreenInfoPtr screenInfo) {
13531366
void rfbRunEventLoop(rfbScreenInfoPtr screen, long usec, rfbBool runInBackground)
13541367
{
13551368
if(usec<0)
1356-
usec=screen->deferUpdateTime*1000;
1369+
usec=rfbDeferUpdateTimeToUsec(screen);
13571370

13581371
screen->select_timeout_usec = usec;
13591372

0 commit comments

Comments
 (0)