Skip to content

Commit 6389c1c

Browse files
committed
libvncserver: httpd: early-init I/O hooks to fix NULL dereference
Fixes segfault caused by commit 9113ce5 which added custom I/O hooks to rfbClientRec. The static cl variable in httpd.c needs its hooks initialised early.
1 parent 5277c0e commit 6389c1c

1 file changed

Lines changed: 10 additions & 7 deletions

File tree

src/libvncserver/httpd.c

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,15 @@ rfbHttpInitSockets(rfbScreenInfoPtr rfbScreen)
9999

100100
rfbScreen->httpInitDone = TRUE;
101101

102+
/* Always initialize mutexes regardless of httpDir being set */
103+
INIT_MUTEX(cl.outputMutex);
104+
INIT_MUTEX(cl.refCountMutex);
105+
INIT_MUTEX(cl.sendMutex);
106+
cl.readFromSocket = rfbDefaultReadFromSocket;
107+
cl.peekAtSocket = rfbDefaultPeekAtSocket;
108+
cl.hasPendingOnSocket = rfbDefaultHasPendingOnSocket;
109+
cl.writeToSocket = rfbDefaultWriteToSocket;
110+
102111
if (!rfbScreen->httpDir)
103112
return;
104113

@@ -127,13 +136,6 @@ rfbHttpInitSockets(rfbScreenInfoPtr rfbScreen)
127136
rfbLog("Listening for HTTP connections on TCP6 port %d\n", rfbScreen->http6Port);
128137
rfbLog(" URL http://%s:%d\n",rfbScreen->thisHost,rfbScreen->http6Port);
129138
#endif
130-
INIT_MUTEX(cl.outputMutex);
131-
INIT_MUTEX(cl.refCountMutex);
132-
INIT_MUTEX(cl.sendMutex);
133-
cl.readFromSocket = rfbDefaultReadFromSocket;
134-
cl.peekAtSocket = rfbDefaultPeekAtSocket;
135-
cl.hasPendingOnSocket = rfbDefaultHasPendingOnSocket;
136-
cl.writeToSocket = rfbDefaultWriteToSocket;
137139
}
138140

139141
void rfbHttpShutdownSockets(rfbScreenInfoPtr rfbScreen) {
@@ -167,6 +169,7 @@ void rfbHttpShutdownSockets(rfbScreenInfoPtr rfbScreen) {
167169
TINI_MUTEX(cl.refCountMutex);
168170

169171
memset(&cl, 0, sizeof(rfbClientRec));
172+
rfbScreen->httpInitDone = FALSE;
170173
}
171174

172175
/*

0 commit comments

Comments
 (0)