Merge branch 'assert' of https://github.com/CendioOssman/tigervnc
diff --git a/common/rfb/SMsgWriter.cxx b/common/rfb/SMsgWriter.cxx
index 3698cb6..0d61292 100644
--- a/common/rfb/SMsgWriter.cxx
+++ b/common/rfb/SMsgWriter.cxx
@@ -18,7 +18,6 @@
  * USA.
  */
 #include <stdio.h>
-#include <assert.h>
 #include <rdr/OutStream.h>
 #include <rfb/msgTypes.h>
 #include <rfb/fenceTypes.h>
diff --git a/common/rfb/UpdateTracker.cxx b/common/rfb/UpdateTracker.cxx
index 14ac49d..b53b850 100644
--- a/common/rfb/UpdateTracker.cxx
+++ b/common/rfb/UpdateTracker.cxx
@@ -21,8 +21,6 @@
 // Tracks updated regions and a region-copy event, too
 //
 
-#include <assert.h>
-
 #include <rfb/UpdateTracker.h>
 #include <rfb/LogWriter.h>
 
diff --git a/common/rfb/tightDecode.h b/common/rfb/tightDecode.h
index 0089f45..fe18ce8 100644
--- a/common/rfb/tightDecode.h
+++ b/common/rfb/tightDecode.h
@@ -28,7 +28,6 @@
 #include <rdr/ZlibInStream.h>
 #include <rfb/Exception.h>
 #include <rfb/TightConstants.h>
-#include <assert.h>
 
 namespace rfb {
 
diff --git a/unix/vncconfig/vncExt.c b/unix/vncconfig/vncExt.c
index ff5532b..c2e6d3c 100644
--- a/unix/vncconfig/vncExt.c
+++ b/unix/vncconfig/vncExt.c
@@ -109,6 +109,10 @@
   if (rep.success) {
     *len = rep.valueLen;
     *value = (char*) Xmalloc (*len+1);
+    if (!*value) {
+      _XEatData(dpy, (*len+1)&~1);
+      return False;
+    }
     _XReadPad(dpy, *value, *len);
     (*value)[*len] = 0;
   }
@@ -141,6 +145,10 @@
   }
   if (rep.success) {
     desc = (char*)Xmalloc(rep.descLen+1);
+    if (!*desc) {
+      _XEatData(dpy, (rep.descLen+1)&~1);
+      return False;
+    }
     _XReadPad(dpy, desc, rep.descLen);
     desc[rep.descLen] = 0;
   }
@@ -243,6 +251,10 @@
   SyncHandle();
   *len = rep.textLen;
   *str = (char*) Xmalloc (*len+1);
+  if (!*str) {
+    _XEatData(dpy, (*len+1)&~1);
+    return False;
+  }
   _XReadPad(dpy, *str, *len);
   (*str)[*len] = 0;
   return True;
@@ -312,9 +324,15 @@
   SyncHandle();
 
   *addr = Xmalloc(rep.addrLen+1);
+  *user = Xmalloc(rep.userLen+1);
+  if (!*addr || !*user) {
+    Xfree(*addr);
+    Xfree(*user);
+    _XEatData(dpy, (rep.addrLen+1)&~1 + (rep.userLen+1)&~1);
+    return False;
+  }
   _XReadPad(dpy, *addr, rep.addrLen);
   (*addr)[rep.addrLen] = 0;
-  *user = Xmalloc(rep.userLen+1);
   _XReadPad(dpy, *user, rep.userLen);
   (*user)[rep.userLen] = 0;
   *timeout = rep.timeout;
diff --git a/unix/vncconfig/vncconfig.cxx b/unix/vncconfig/vncconfig.cxx
index f70cc71..bffdfbe 100644
--- a/unix/vncconfig/vncconfig.cxx
+++ b/unix/vncconfig/vncconfig.cxx
@@ -215,6 +215,10 @@
       if (cutText)
         XFree(cutText);
       cutText = (char*)malloc(nitems); // assuming XFree() same as free()
+      if (!cutText) {
+        vlog.error("unable to allocate selection buffer");
+        return;
+      }
       memcpy(cutText, data, nitems);
       cutTextLen = nitems;
       vlog.debug("sending %s selection as server cut text: '%.*s%s'",
diff --git a/vncviewer/OSXPixelBuffer.cxx b/vncviewer/OSXPixelBuffer.cxx
index df82c86..e9100f2 100644
--- a/vncviewer/OSXPixelBuffer.cxx
+++ b/vncviewer/OSXPixelBuffer.cxx
@@ -20,8 +20,6 @@
 #include <config.h>
 #endif
 
-#include <assert.h>
-
 #include <ApplicationServices/ApplicationServices.h>
 
 #include <FL/Fl_Window.H>
@@ -47,16 +45,17 @@
 
   data = new rdr::U8[width * height * format.bpp/8];
   if (data == NULL)
-    throw rfb::Exception(_("Error: Not enough memory for framebuffer"));
+    throw rfb::Exception(_("Not enough memory for framebuffer"));
 
   lut = CGColorSpaceCreateDeviceRGB();
-  assert(lut);
+  if (!lut)
+    throw rfb::Exception(_("Could not create framebuffer device"));
 
   bitmap = CGBitmapContextCreate(data, width, height, 8, width*4, lut,
                                  kCGImageAlphaNoneSkipFirst | kCGBitmapByteOrder32Little);
-  assert(bitmap);
-
   CGColorSpaceRelease(lut);
+  if (!bitmap)
+    throw rfb::Exception(_("Could not create framebuffer bitmap"));
 }
 
 
diff --git a/vncviewer/Viewport.cxx b/vncviewer/Viewport.cxx
index 66a7841..4daff16 100644
--- a/vncviewer/Viewport.cxx
+++ b/vncviewer/Viewport.cxx
@@ -27,6 +27,7 @@
 
 #include <rfb/CMsgWriter.h>
 #include <rfb/LogWriter.h>
+#include <rfb/Exception.h>
 
 // FLTK can pull in the X11 headers on some systems
 #ifndef XK_VoidSymbol
@@ -452,6 +453,8 @@
     fb = new X11PixelBuffer(w, h);
 #endif
   } catch (rdr::Exception& e) {
+    vlog.error(_("Unable to create platform specific framebuffer: %s"), e.str());
+    vlog.error(_("Using platform independent framebuffer"));
     fb = new FLTKPixelBuffer(w, h);
   }
 
diff --git a/vncviewer/Win32PixelBuffer.cxx b/vncviewer/Win32PixelBuffer.cxx
index 4871816..3f82530 100644
--- a/vncviewer/Win32PixelBuffer.cxx
+++ b/vncviewer/Win32PixelBuffer.cxx
@@ -21,7 +21,6 @@
 #include <config.h>
 #endif
 
-#include <assert.h>
 #include <stdlib.h>
 
 #include <windows.h>
diff --git a/vncviewer/X11PixelBuffer.cxx b/vncviewer/X11PixelBuffer.cxx
index b729e80..59b90e2 100644
--- a/vncviewer/X11PixelBuffer.cxx
+++ b/vncviewer/X11PixelBuffer.cxx
@@ -21,7 +21,6 @@
 #include <config.h>
 #endif
 
-#include <assert.h>
 #include <stdlib.h>
 
 #include <FL/x.H>
@@ -57,7 +56,7 @@
     if (format[i].depth == fl_visual->depth) break;
 
   if (i == nformats)
-    throw rfb::Exception(_("Error: display lacks pixmap format for default depth"));
+    throw rfb::Exception(_("Display lacks pixmap format for default depth"));
 
   switch (format[i].bits_per_pixel) {
   case 8:
@@ -66,7 +65,7 @@
     bpp = format[i].bits_per_pixel;
     break;
   default:
-    throw rfb::Exception(_("Error: couldn't find suitable pixmap format"));
+    throw rfb::Exception(_("Couldn't find suitable pixmap format"));
   }
 
   XFree(format);
@@ -75,7 +74,7 @@
   trueColour = (fl_visual->c_class == TrueColor);
 
   if (!trueColour)
-    throw rfb::Exception(_("Error: only true colour displays supported"));
+    throw rfb::Exception(_("Only true colour displays supported"));
 
   vlog.info(_("Using default colormap and visual, %sdepth %d."),
             (fl_visual->c_class == TrueColor) ? "TrueColor, " :
@@ -104,10 +103,12 @@
   if (!setupShm()) {
     xim = XCreateImage(fl_display, fl_visual->visual, fl_visual->depth,
                        ZPixmap, 0, 0, width, height, BitmapPad(fl_display), 0);
-    assert(xim);
+    if (!xim)
+      throw rfb::Exception(_("Could not create framebuffer image"));
 
     xim->data = (char*)malloc(xim->bytes_per_line * xim->height);
-    assert(xim->data);
+    if (!xim->data)
+      throw rfb::Exception(_("Not enough memory for framebuffer"));
   }
 
   data = (rdr::U8*)xim->data;