Proper cleanup on termination of Xvnc/libvnc.so
diff --git a/unix/xserver/hw/vnc/vncExt.c b/unix/xserver/hw/vnc/vncExt.c
index f7ba9fa..fd65eab 100644
--- a/unix/xserver/hw/vnc/vncExt.c
+++ b/unix/xserver/hw/vnc/vncExt.c
@@ -585,6 +585,7 @@
 
 static void vncResetProc(ExtensionEntry* extEntry)
 {
+  vncExtensionClose();
 }
 
 static void vncClientStateChange(CallbackListPtr * l, void * d, void * p)
diff --git a/unix/xserver/hw/vnc/vncExtInit.cc b/unix/xserver/hw/vnc/vncExtInit.cc
index e4135b3..d6f6b74 100644
--- a/unix/xserver/hw/vnc/vncExtInit.cc
+++ b/unix/xserver/hw/vnc/vncExtInit.cc
@@ -262,6 +262,18 @@
   vncRegisterBlockHandlers();
 }
 
+void vncExtensionClose(void)
+{
+  try {
+    for (int scr = 0; scr < vncGetScreenCount(); scr++) {
+      delete desktop[scr];
+      desktop[scr] = NULL;
+    }
+  } catch (rdr::Exception& e) {
+    vncFatalError("vncExtInit: %s",e.str());
+  }
+}
+
 void vncHandleSocketEvent(int fd, int scrIdx, int read, int write)
 {
   desktop[scrIdx]->handleSocketEvent(fd, read, write);
diff --git a/unix/xserver/hw/vnc/vncExtInit.h b/unix/xserver/hw/vnc/vncExtInit.h
index e829434..9414723 100644
--- a/unix/xserver/hw/vnc/vncExtInit.h
+++ b/unix/xserver/hw/vnc/vncExtInit.h
@@ -48,6 +48,7 @@
 extern int vncInetdSock;
 
 void vncExtensionInit(void);
+void vncExtensionClose(void);
 
 void vncHandleSocketEvent(int fd, int scrIdx, int read, int write);
 void vncCallBlockHandlers(int* timeout);