Fix for NPE when zero width or height alpha cursor is sent
diff --git a/java/com/tigervnc/rfb/CMsgReader.java b/java/com/tigervnc/rfb/CMsgReader.java
index a5cc267..a79cf84 100644
--- a/java/com/tigervnc/rfb/CMsgReader.java
+++ b/java/com/tigervnc/rfb/CMsgReader.java
@@ -314,7 +314,8 @@
       new ManagedPixelBuffer(rgbaPF, width, height);
     PixelFormat origPF;
 
-    DataBufferInt buf;
+    ByteBuffer buf =
+      ByteBuffer.allocate(pb.area()*4).order(rgbaPF.getByteOrder());;
 
     encoding = is.readS32();
 
@@ -323,28 +324,26 @@
     handler.readAndDecodeRect(pb.getRect(), encoding, pb);
     handler.cp.setPF(origPF);
 
-    if (pb.getRect().area() == 0)
-      return;
-
     // ARGB with pre-multiplied alpha works best for BufferedImage
-    buf = (DataBufferInt)pb.getBufferRW(pb.getRect()).getDataBuffer();
-    ByteBuffer bbuf =
-      ByteBuffer.allocate(pb.area()*4).order(rgbaPF.getByteOrder());
-    bbuf.asIntBuffer().put(buf.getData()).flip().mark();
-
-    for (int i = 0;i < pb.area();i++) {
-      byte alpha = bbuf.get(bbuf.position()+3);
-
-      bbuf.put(i*4+3, (byte)(bbuf.get(i*4+2)));
-      bbuf.put(i*4+2, (byte)(bbuf.get(i*4+1)));
-      bbuf.put(i*4+1, (byte)(bbuf.get(i*4+0))); 
-      bbuf.put(i*4+0, (byte)alpha);
-
-      bbuf.position(bbuf.position() + 4);
+    if (pb.area() > 0) {
+      // Sometimes a zero width or height cursor is sent.
+      DataBuffer db = pb.getBuffer(pb.getRect()).getDataBuffer();
+      for (int i = 0;i < pb.area();i++)
+        buf.asIntBuffer().put(i, db.getElem(i));
     }
 
-    handler.setCursor(width, height, hotspot,
-                      bbuf.array());
+    for (int i = 0;i < pb.area();i++) {
+      byte alpha = buf.get(buf.position()+3);
+
+      buf.put(i*4+3, buf.get(i*4+2));
+      buf.put(i*4+2, buf.get(i*4+1));
+      buf.put(i*4+1, buf.get(i*4+0));
+      buf.put(i*4+0, alpha);
+
+      buf.position(buf.position() + 4);
+    }
+
+    handler.setCursor(width, height, hotspot, buf.array());
   }
 
   protected void readSetDesktopName(int x, int y, int w, int h)
diff --git a/java/com/tigervnc/rfb/ManagedPixelBuffer.java b/java/com/tigervnc/rfb/ManagedPixelBuffer.java
index 6e14b92..028eadc 100644
--- a/java/com/tigervnc/rfb/ManagedPixelBuffer.java
+++ b/java/com/tigervnc/rfb/ManagedPixelBuffer.java
@@ -18,6 +18,8 @@
 
 package com.tigervnc.rfb;
 
+import java.awt.image.*;
+
 public class ManagedPixelBuffer extends FullFramePixelBuffer {
 
   public ManagedPixelBuffer() {
@@ -43,9 +45,15 @@
   final void checkDataSize() {
     int new_datasize = width_ * height_;
     if (datasize < new_datasize) {
-      vlog.debug("reallocating managed buffer ("+width_+"x"+height_+")");
-      if (format != null)
-        data = PixelFormat.getColorModel(format).createCompatibleWritableRaster(width_, height_);
+      if (data != null) {
+        datasize = 0; data = null;
+      }
+      if (new_datasize > 0) {
+        ColorModel cm = format.getColorModel();
+        data = cm.createCompatibleWritableRaster(width_, height_);
+        image = new BufferedImage(cm, data, cm.isAlphaPremultiplied(), null);
+        datasize = new_datasize;
+      }
     }
   }