Skip to content

Commit 9ea8d7f

Browse files
committed
libvncserver: fix HTTP shutdown without httpDir
1 parent 540332b commit 9ea8d7f

3 files changed

Lines changed: 45 additions & 7 deletions

File tree

CMakeLists.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -701,6 +701,7 @@ if(WITH_LIBVNCSERVER)
701701
list(APPEND SIMPLETESTS
702702
cargstest
703703
copyrecttest
704+
http_no_dir_shutdown
704705
)
705706
endif(WITH_LIBVNCSERVER)
706707

@@ -758,6 +759,7 @@ endif(LIBVNCSERVER_WITH_WEBSOCKETS AND WITH_LIBVNCSERVER)
758759

759760
if(WITH_LIBVNCSERVER)
760761
add_test(NAME cargs COMMAND test_cargstest)
762+
add_test(NAME http_no_dir_shutdown COMMAND test_http_no_dir_shutdown)
761763
endif(WITH_LIBVNCSERVER)
762764
if(UNIX)
763765
if(WITH_LIBVNCSERVER)

src/libvncserver/httpd.c

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,13 @@ rfbHttpInitSockets(rfbScreenInfoPtr rfbScreen)
9797
if (rfbScreen->httpInitDone)
9898
return;
9999

100+
INIT_MUTEX(cl.outputMutex);
101+
INIT_MUTEX(cl.refCountMutex);
102+
INIT_MUTEX(cl.sendMutex);
103+
cl.readFromSocket = rfbDefaultReadFromSocket;
104+
cl.peekAtSocket = rfbDefaultPeekAtSocket;
105+
cl.hasPendingOnSocket = rfbDefaultHasPendingOnSocket;
106+
cl.writeToSocket = rfbDefaultWriteToSocket;
100107
rfbScreen->httpInitDone = TRUE;
101108

102109
if (!rfbScreen->httpDir)
@@ -127,16 +134,14 @@ rfbHttpInitSockets(rfbScreenInfoPtr rfbScreen)
127134
rfbLog("Listening for HTTP connections on TCP6 port %d\n", rfbScreen->http6Port);
128135
rfbLog(" URL http://%s:%d\n",rfbScreen->thisHost,rfbScreen->http6Port);
129136
#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;
137137
}
138138

139139
void rfbHttpShutdownSockets(rfbScreenInfoPtr rfbScreen) {
140+
if (!rfbScreen->httpInitDone)
141+
return;
142+
143+
rfbScreen->httpInitDone = FALSE;
144+
140145
if(rfbScreen->httpSock>-1) {
141146
FD_CLR(rfbScreen->httpSock,&rfbScreen->allFds);
142147
rfbCloseSocket(rfbScreen->httpSock);

test/http_no_dir_shutdown.c

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
#include <rfb/rfb.h>
2+
3+
#include <stdlib.h>
4+
5+
int main(int argc, char **argv)
6+
{
7+
rfbScreenInfoPtr screen;
8+
char *fb;
9+
10+
screen = rfbGetScreen(&argc, argv, 16, 16, 8, 3, 4);
11+
if (!screen)
12+
return 1;
13+
14+
fb = (char *)calloc(16 * 16 * 4, 1);
15+
if (!fb) {
16+
rfbScreenCleanup(screen);
17+
return 1;
18+
}
19+
20+
screen->frameBuffer = fb;
21+
screen->port = 0;
22+
screen->ipv6port = 0;
23+
screen->httpDir = NULL;
24+
25+
rfbInitServer(screen);
26+
rfbShutdownServer(screen, TRUE);
27+
rfbScreenCleanup(screen);
28+
free(fb);
29+
30+
return 0;
31+
}

0 commit comments

Comments
 (0)