Fix memory leaks
diff --git a/unix/tx/TXWindow.cxx b/unix/tx/TXWindow.cxx
index a681917..6129840 100644
--- a/unix/tx/TXWindow.cxx
+++ b/unix/tx/TXWindow.cxx
@@ -24,6 +24,7 @@
 #include <list>
 #include <stdio.h>
 #include <stdlib.h>
+#include <vector>
 #include <rfb/util.h>
 
 std::list<TXWindow*> windows;
@@ -132,20 +133,20 @@
 
 void TXWindow::getColours(Display* dpy, XColor* cols, int nCols)
 {
-  bool* got = new bool[nCols];
+  std::vector<bool> got;
+
   bool failed = false;
   int i;
   for (i = 0; i < nCols; i++) {
     if (XAllocColor(dpy, cmap, &cols[i])) {
-      got[i] = true;
+      got.push_back(true);
     } else {
-      got[i] = false;
+      got.push_back(false);
       failed = true;
     }
   }
 
   if (!failed) {
-    delete [] got;
     return;
   }
 
@@ -168,12 +169,13 @@
   int cmapSize = DisplayCells(dpy,DefaultScreen(dpy));
 
   XColor* cm = new XColor[cmapSize];
-  bool* shared = new bool[cmapSize];
-  bool* usedAsNearest = new bool[cmapSize];
+  std::vector<bool> shared;
+  std::vector<bool> usedAsNearest;
 
   for (i = 0; i < cmapSize; i++) {
     cm[i].pixel = i;
-    shared[i] = usedAsNearest[i] = false;
+    shared.push_back(false);
+    usedAsNearest.push_back(false);
   }
 
   XQueryColors(dpy, cmap, cm, cmapSize);
diff --git a/unix/vncpasswd/vncpasswd.cxx b/unix/vncpasswd/vncpasswd.cxx
index 8bd4e48..3055223 100644
--- a/unix/vncpasswd/vncpasswd.cxx
+++ b/unix/vncpasswd/vncpasswd.cxx
@@ -134,7 +134,7 @@
     } else if (argv[i][0] == '-') {
       usage();
     } else if (!fname) {
-      fname = argv[i];
+      fname = strDup(argv[i]);
     } else {
       usage();
     }
@@ -165,24 +165,37 @@
     FILE* fp = fopen(fname,"w");
     if (!fp) {
       fprintf(stderr,"Couldn't open %s for writing\n",fname);
+      delete [] fname;
+      delete obfuscated;
+      delete obfuscatedReadOnly;
       exit(1);
     }
     chmod(fname, S_IRUSR|S_IWUSR);
 
     if (fwrite(obfuscated->buf, obfuscated->length, 1, fp) != 1) {
       fprintf(stderr,"Writing to %s failed\n",fname);
+      delete [] fname;
+      delete obfuscated;
+      delete obfuscatedReadOnly;
       exit(1);
     }
 
+    delete obfuscated;
+
     if (obfuscatedReadOnly) {
       if (fwrite(obfuscatedReadOnly->buf, obfuscatedReadOnly->length, 1, fp) != 1) {
         fprintf(stderr,"Writing to %s failed\n",fname);
+        delete [] fname;
+        delete obfuscatedReadOnly;
         exit(1);
       }
     }
 
     fclose(fp);
 
+    delete [] fname;
+    delete obfuscatedReadOnly;
+
     return 0;
   }
 }
diff --git a/unix/xserver/hw/vnc/vncExtInit.cc b/unix/xserver/hw/vnc/vncExtInit.cc
index d6f6b74..7ca71d9 100644
--- a/unix/xserver/hw/vnc/vncExtInit.cc
+++ b/unix/xserver/hw/vnc/vncExtInit.cc
@@ -184,7 +184,7 @@
             listeners.push_back(new network::TcpListener(vncInetdSock));
             vlog.info("inetd wait");
           }
-        } else if (rfbunixpath.getValueStr()[0] != '\0') {
+        } else if (((const char*)rfbunixpath)[0] != '\0') {
           char path[PATH_MAX];
           int mode = (int)rfbunixmode;
 
@@ -192,7 +192,7 @@
             strncpy(path, rfbunixpath, sizeof(path));
           else
             snprintf(path, sizeof(path), "%s.%d",
-                     rfbunixpath.getValueStr(), scr);
+                     (const char*)rfbunixpath, scr);
           path[sizeof(path)-1] = '\0';
 
           listeners.push_back(new network::UnixListener(path, mode));