From 9ea8d7f16b1d31d33d48dd5d970f3eacd920c4fb Mon Sep 17 00:00:00 2001 From: Marco Fortina Date: Sun, 7 Jun 2026 01:10:16 +0200 Subject: [PATCH] libvncserver: fix HTTP shutdown without httpDir --- CMakeLists.txt | 2 ++ src/libvncserver/httpd.c | 19 ++++++++++++------- test/http_no_dir_shutdown.c | 31 +++++++++++++++++++++++++++++++ 3 files changed, 45 insertions(+), 7 deletions(-) create mode 100644 test/http_no_dir_shutdown.c diff --git a/CMakeLists.txt b/CMakeLists.txt index d9709c809..500c473d7 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -701,6 +701,7 @@ if(WITH_LIBVNCSERVER) list(APPEND SIMPLETESTS cargstest copyrecttest + http_no_dir_shutdown ) endif(WITH_LIBVNCSERVER) @@ -758,6 +759,7 @@ endif(LIBVNCSERVER_WITH_WEBSOCKETS AND WITH_LIBVNCSERVER) if(WITH_LIBVNCSERVER) add_test(NAME cargs COMMAND test_cargstest) + add_test(NAME http_no_dir_shutdown COMMAND test_http_no_dir_shutdown) endif(WITH_LIBVNCSERVER) if(UNIX) if(WITH_LIBVNCSERVER) diff --git a/src/libvncserver/httpd.c b/src/libvncserver/httpd.c index 02f85b314..0a19ab159 100644 --- a/src/libvncserver/httpd.c +++ b/src/libvncserver/httpd.c @@ -97,6 +97,13 @@ rfbHttpInitSockets(rfbScreenInfoPtr rfbScreen) if (rfbScreen->httpInitDone) return; + INIT_MUTEX(cl.outputMutex); + INIT_MUTEX(cl.refCountMutex); + INIT_MUTEX(cl.sendMutex); + cl.readFromSocket = rfbDefaultReadFromSocket; + cl.peekAtSocket = rfbDefaultPeekAtSocket; + cl.hasPendingOnSocket = rfbDefaultHasPendingOnSocket; + cl.writeToSocket = rfbDefaultWriteToSocket; rfbScreen->httpInitDone = TRUE; if (!rfbScreen->httpDir) @@ -127,16 +134,14 @@ rfbHttpInitSockets(rfbScreenInfoPtr rfbScreen) rfbLog("Listening for HTTP connections on TCP6 port %d\n", rfbScreen->http6Port); rfbLog(" URL http://%s:%d\n",rfbScreen->thisHost,rfbScreen->http6Port); #endif - INIT_MUTEX(cl.outputMutex); - INIT_MUTEX(cl.refCountMutex); - INIT_MUTEX(cl.sendMutex); - cl.readFromSocket = rfbDefaultReadFromSocket; - cl.peekAtSocket = rfbDefaultPeekAtSocket; - cl.hasPendingOnSocket = rfbDefaultHasPendingOnSocket; - cl.writeToSocket = rfbDefaultWriteToSocket; } void rfbHttpShutdownSockets(rfbScreenInfoPtr rfbScreen) { + if (!rfbScreen->httpInitDone) + return; + + rfbScreen->httpInitDone = FALSE; + if(rfbScreen->httpSock>-1) { FD_CLR(rfbScreen->httpSock,&rfbScreen->allFds); rfbCloseSocket(rfbScreen->httpSock); diff --git a/test/http_no_dir_shutdown.c b/test/http_no_dir_shutdown.c new file mode 100644 index 000000000..41dd5b253 --- /dev/null +++ b/test/http_no_dir_shutdown.c @@ -0,0 +1,31 @@ +#include + +#include + +int main(int argc, char **argv) +{ + rfbScreenInfoPtr screen; + char *fb; + + screen = rfbGetScreen(&argc, argv, 16, 16, 8, 3, 4); + if (!screen) + return 1; + + fb = (char *)calloc(16 * 16 * 4, 1); + if (!fb) { + rfbScreenCleanup(screen); + return 1; + } + + screen->frameBuffer = fb; + screen->port = 0; + screen->ipv6port = 0; + screen->httpDir = NULL; + + rfbInitServer(screen); + rfbShutdownServer(screen, TRUE); + rfbScreenCleanup(screen); + free(fb); + + return 0; +}