Bug#395994: vino: CoRRE encoding broken in version 2.13.5-3 and 2.16.0-1

Loïc Minier lool at dooz.org
Sun Oct 29 22:23:39 CET 2006


found 395994 2.13.5-3
found 395994 2.16.0-1
tags 395994 + upstream confirmed fixed-upstream patch
stop

        Hi,

On Sun, Oct 29, 2006, Detlef Schmicker wrote:
> Version: 2.13.5-4cvs

 Please fix the version of your bug report before sending it or it wont
 be closed properly.

> The CoRRE encoding is broken. It was fixed in the gnome/vino cvs around 
> 18. Oct 06. Please include this fix.

 Thanks for the report; it would really be nice (perhaps for your next
 reports) to:
 - attach a patch
 - and/or point to the upstream commits/CVS interface with the changes
 - and/or point to the upstream bug #

 Could you please test the attached patch and tell me whether it is
 enough?  There were other fixes around the same date on the same file,
 so I picked these two commits:

----------------------------
revision 1.6
date: 2006/10/18 08:24:49;  author: markmc;  state: Exp;  lines: +68 -122
2006-10-18  Mark McLoughlin  <mark at skynet.ie>

        * server/libvncserver/rfbserver.c: cherry-pick some more
        fixes from upstream libvncserver.
----------------------------
revision 1.5
date: 2006/10/18 08:24:30;  author: markmc;  state: Exp;  lines: +6 -0
2006-10-18  Mark McLoughlin  <mark at skynet.ie>

        Fix issue with the CoRRE encoding saying its only sending
        a single rectangle, but sending lots more. Problem identified
        by Detlef Schmicker <d.schmicker at physik.de>

        Fix is backported from libvncserver upstream.

        * server/libvncserver/rfbserver.c:
        (rfbSendFramebufferUpdate): handle maxRectsPerUpdate for
        CoRRE and Zlib encodings.

 Perhaps the cherry-picking part isn't needed, but if this patch works
 for you, I'll keep it.

   Thanks in advance,
-- 
Loïc Minier <lool at dooz.org>
-------------- next part --------------
Index: server/libvncserver/rfbserver.c
===================================================================
RCS file: /cvs/gnome/vino/server/libvncserver/rfbserver.c,v
retrieving revision 1.4
retrieving revision 1.6
diff -u -r1.4 -r1.6
--- server/libvncserver/rfbserver.c	16 Oct 2006 14:14:19 -0000	1.4
+++ server/libvncserver/rfbserver.c	18 Oct 2006 08:24:49 -0000	1.6
@@ -166,9 +166,8 @@
  */
 
 void
-rfbNewClientConnection(rfbScreen,sock)
-    rfbScreenInfoPtr rfbScreen;
-    int sock;
+rfbNewClientConnection(rfbScreenInfoPtr rfbScreen,
+                       int sock)
 {
     rfbClientPtr cl;
 
@@ -182,9 +181,8 @@
  */
 
 rfbClientPtr
-rfbNewClient(rfbScreen,sock)
-    rfbScreenInfoPtr rfbScreen;
-    int sock;
+rfbNewClient(rfbScreenInfoPtr rfbScreen,
+             int sock)
 {
     rfbProtocolVersionMsg pv;
     rfbClientIteratorPtr iterator;
@@ -244,7 +242,7 @@
       cl->correMaxWidth = 48;
       cl->correMaxHeight = 48;
 #ifdef HAVE_LIBZ
-      cl->zrleData = 0;
+      cl->zrleData = NULL;
 #endif
 
       cl->copyRegion = sraRgnCreate();
@@ -303,10 +301,7 @@
       if (WriteExact(cl, pv, sz_rfbProtocolVersionMsg) < 0) {
         rfbLogPerror("rfbNewClient: write");
         rfbCloseClient(cl);
-	/* TODO: memory leak here (cl is never freed)
-	 * can rfbClientConnectionGone called at this time?
-	 * tim at tjansen.de
-	 */
+        rfbClientConnectionGone(cl);
         return NULL;
       }
     }
@@ -338,8 +333,7 @@
  */
 
 void
-rfbClientConnectionGone(cl)
-     rfbClientPtr cl;
+rfbClientConnectionGone(rfbClientPtr cl)
 {
     int i;
 
@@ -352,6 +346,9 @@
     if (cl->next)
         cl->next->prev = cl->prev;
 
+    if(cl->sock>0)
+        close(cl->sock);
+
 #ifdef HAVE_LIBZ
     FreeZrleData(cl);
 #endif
@@ -404,7 +401,9 @@
     TINI_COND(cl->updateCond);
     TINI_MUTEX(cl->updateMutex);
 
+    /* make sure outputMutex is unlocked before destroying */
     LOCK(cl->outputMutex);
+    UNLOCK(cl->outputMutex);
     TINI_MUTEX(cl->outputMutex);
 
     rfbPrintStats(cl);
@@ -418,8 +417,7 @@
  */
 
 void
-rfbProcessClientMessage(cl)
-     rfbClientPtr cl;
+rfbProcessClientMessage(rfbClientPtr cl)
 {
     switch (cl->state) {
     case RFB_PROTOCOL_VERSION:
@@ -458,12 +456,10 @@
  */
 
 static void
-rfbProcessClientProtocolVersion(cl)
-    rfbClientPtr cl;
+rfbProcessClientProtocolVersion(rfbClientPtr cl)
 {
     rfbProtocolVersionMsg pv;
     int n, major_, minor_;
-    char failureReason[256];
 
     if ((n = ReadExact(cl, pv, sz_rfbProtocolVersionMsg)) <= 0) {
         if (n == 0)
@@ -477,7 +473,7 @@
     pv[sz_rfbProtocolVersionMsg] = 0;
     if (sscanf(pv,rfbProtocolVersionFormat,&major_,&minor_) != 2) {
         char name[1024]; 
-	if(sscanf(pv,"RFB %03d.%03d %1024s\n",&major_,&minor_,name) != 3) {
+	if(sscanf(pv,"RFB %03d.%03d %1023s\n",&major_,&minor_,name) != 3) {
 	    rfbErr("rfbProcessClientProtocolVersion: not a valid RFB client\n");
 	    rfbCloseClient(cl);
 	    return;
@@ -485,14 +481,13 @@
 	free(cl->host);
 	cl->host=strdup(name);
     }
-    rfbLog("Protocol version %d.%d\n", major_, minor_);
+    rfbLog("Client Protocol Version %d.%d\n", major_, minor_);
 
     if (major_ != rfbProtocolMajorVersion) {
-        /* Major version mismatch - send a ConnFailed message */
-        sprintf(failureReason,
-                "RFB protocol version mismatch - server %d.%d, client %d.%d",
-                rfbProtocolMajorVersion,rfbProtocolMinorVersion7,major_,minor_);
-        rfbClientConnFailed(cl, failureReason);
+        rfbErr("RFB protocol version mismatch - server %d.%d, client %d.%d",
+                rfbProtocolMajorVersion, rfbProtocolMinorVersion7,
+                major_,minor_);
+        rfbCloseClient(cl);
         return;
     }
 
@@ -520,19 +515,13 @@
  */
 
 void
-rfbClientConnFailed(cl, reason)
-    rfbClientPtr cl;
-    char *reason;
+rfbClientConnFailed(rfbClientPtr cl,
+                    char *reason)
 {
     char *buf;
     int len = strlen(reason);
 
-    rfbErr("Connection failed: %s\n", reason);
-
-    /* Note, for version 3.7 of the protocol, rfbConnFailed should
-     * be encoded in a single byte ... but we only send this message
-     * when we get an unknown major version so um ...
-     */
+    rfbLog("rfbClientConnFailed(\"%s\")\n", reason);
 
     buf = (char *)malloc(8 + len);
     ((uint32_t *)buf)[0] = 0;
@@ -542,6 +531,7 @@
     if (WriteExact(cl, buf, 8 + len) < 0)
         rfbLogPerror("rfbClientConnFailed: write");
     free(buf);
+
     rfbCloseClient(cl);
 }
 
@@ -552,8 +542,7 @@
  */
 
 void
-rfbProcessClientInitMessage(cl)
-    rfbClientPtr cl;
+rfbProcessClientInitMessage(rfbClientPtr cl)
 {
     rfbClientInitMsg ci;
     char buf[256];
@@ -571,6 +560,8 @@
         return;
     }
 
+    memset(buf,0,sizeof(buf));
+
     si->framebufferWidth = Swap16IfLE(cl->screen->width);
     si->framebufferHeight = Swap16IfLE(cl->screen->height);
     si->format = cl->screen->rfbServerFormat;
@@ -578,10 +569,7 @@
     si->format.greenMax = Swap16IfLE(si->format.greenMax);
     si->format.blueMax = Swap16IfLE(si->format.blueMax);
 
-    if (strlen(cl->screen->desktopName) > 128)      /* sanity check on desktop name len */
-        ((char*)cl->screen->desktopName)[128] = 0;
-
-    strcpy(buf + sz_rfbServerInitMsg, cl->screen->desktopName);
+    strncpy(buf + sz_rfbServerInitMsg, cl->screen->desktopName, 127);
     len = strlen(buf + sz_rfbServerInitMsg);
     si->nameLength = Swap32IfLE(len);
 
@@ -628,8 +616,7 @@
  */
 
 static void
-rfbProcessClientNormalMessage(cl)
-    rfbClientPtr cl;
+rfbProcessClientNormalMessage(rfbClientPtr cl)
 {
     int n=0;
     rfbClientToServerMsg msg;
@@ -727,51 +714,22 @@
 		cl->useCopyRect = TRUE;
                 break;
             case rfbEncodingRaw:
-                if (cl->preferredEncoding == -1) {
-                    cl->preferredEncoding = enc;
-                    rfbLog("Using raw encoding for client %s\n",
-                           cl->host);
-                }
-                break;
             case rfbEncodingRRE:
-                if (cl->preferredEncoding == -1) {
-                    cl->preferredEncoding = enc;
-                    rfbLog("Using rre encoding for client %s\n",
-                           cl->host);
-                }
-                break;
             case rfbEncodingCoRRE:
-                if (cl->preferredEncoding == -1) {
-                    cl->preferredEncoding = enc;
-                    rfbLog("Using CoRRE encoding for client %s\n",
-                           cl->host);
-                }
-                break;
             case rfbEncodingHextile:
-                if (cl->preferredEncoding == -1) {
-                    cl->preferredEncoding = enc;
-                    rfbLog("Using hextile encoding for client %s\n",
-                           cl->host);
-                }
-                break;
 #ifdef HAVE_LIBZ
 	    case rfbEncodingZlib:
-		if (cl->preferredEncoding == -1) {
-		    cl->preferredEncoding = enc;
-		    rfbLog("Using zlib encoding for client %s\n",
-			   cl->host);
-		}
-              break;
+            case rfbEncodingZRLE:
 #ifdef HAVE_LIBJPEG
 	    case rfbEncodingTight:
-		if (cl->preferredEncoding == -1) {
-		    cl->preferredEncoding = enc;
-		    rfbLog("Using tight encoding for client %s\n",
-			   cl->host);
-		}
-		break;
 #endif
 #endif
+            /* The first supported encoding is the 'preferred' encoding */
+                if (cl->preferredEncoding == -1)
+                    cl->preferredEncoding = enc;
+
+
+                break;
 	    case rfbEncodingXCursor:
 		enableCursorShapeUpdates = TRUE;
 		break;
@@ -796,15 +754,6 @@
 		    cl->useNewFBSize = TRUE;
 		}
 		break;
-#ifdef HAVE_LIBZ
-           case rfbEncodingZRLE:
-               if (cl->preferredEncoding == -1) {
-                   cl->preferredEncoding = enc;
-                   rfbLog("Using ZRLE encoding for client %s\n",
-                          cl->host);
-               }
-               break;
-#endif
             default:
 #ifdef HAVE_LIBZ
 		if ( enc >= (uint32_t)rfbEncodingCompressLevel0 &&
@@ -947,23 +896,23 @@
 	    return;
 	}
 
-	if(!cl->viewOnly) {
-	    msg.cct.length = Swap32IfLE(msg.cct.length);
+	msg.cct.length = Swap32IfLE(msg.cct.length);
 
-	    str = (char *)malloc(msg.cct.length);
+	str = (char *)malloc(msg.cct.length);
 
-	    if ((n = ReadExact(cl, str, msg.cct.length)) <= 0) {
-		if (n != 0)
-		    rfbLogPerror("rfbProcessClientNormalMessage: read");
-		free(str);
-		rfbCloseClient(cl);
-		return;
-	    }
+	if ((n = ReadExact(cl, str, msg.cct.length)) <= 0) {
+	    if (n != 0)
+	        rfbLogPerror("rfbProcessClientNormalMessage: read");
+	    free(str);
+	    rfbCloseClient(cl);
+	    return;
+	}
 
+	if(!cl->viewOnly) {
 	    if (cl->screen->setXCutText)
 	      cl->screen->setXCutText(str, msg.cct.length, cl);
-	    free(str);
 	}
+	free(str);
 
         return;
 
@@ -987,11 +936,10 @@
  */
 
 rfbBool
-rfbSendFramebufferUpdate(cl, givenUpdateRegion)
-     rfbClientPtr cl;
-     sraRegionPtr givenUpdateRegion;
+rfbSendFramebufferUpdate(rfbClientPtr cl,
+                         sraRegionPtr givenUpdateRegion)
 {
-    sraRectangleIterator* i = NULL;
+    sraRectangleIterator* i=NULL;
     sraRect rect;
     int nUpdateRegionRects;
     rfbFramebufferUpdateMsg *fu = (rfbFramebufferUpdateMsg *)cl->updateBuf;
@@ -1077,7 +1025,7 @@
     /*
      * The client is interested in the region requestedRegion.  The region
      * which should be updated now is the intersection of requestedRegion
-     * and the union of givenUpdateRegion and copyRegion.  If it's empty then
+     * and the union of modifiedRegion and copyRegion.  If it's empty then
      * no update is needed.
      */
 
@@ -1147,7 +1095,6 @@
      * carry over a copyRegion for a future update.
      */
 
-
      sraRgnOr(cl->modifiedRegion,cl->copyRegion);
      sraRgnSubtract(cl->modifiedRegion,updateRegion);
      sraRgnSubtract(cl->modifiedRegion,updateCopyRegion);
@@ -1214,10 +1161,16 @@
     fu->type = rfbFramebufferUpdate;
     if (nUpdateRegionRects != 0xFFFF) {
 	if(cl->screen->maxRectsPerUpdate>0
+	   /* CoRRE splits the screen into smaller squares */
+	   && cl->preferredEncoding != rfbEncodingCoRRE
+#ifdef HAVE_LIBZ
+	   /* Zlib encoding splits rectangles up into smaller chunks */
+	   && cl->preferredEncoding != rfbEncodingZlib
 #ifdef HAVE_LIBJPEG
 	   /* Tight encoding counts the rectangles differently */
 	   && cl->preferredEncoding != rfbEncodingTight
 #endif
+#endif /* HAVE_LIBZ */
 	   && nUpdateRegionRects>cl->screen->maxRectsPerUpdate) {
 	    sraRegion* newUpdateRegion = sraRgnBBox(updateRegion);
 	    sraRgnDestroy(updateRegion);
@@ -1335,10 +1288,10 @@
  */
 
 rfbBool
-rfbSendCopyRegion(cl, reg, dx, dy)
-    rfbClientPtr cl;
-    sraRegionPtr reg;
-    int dx, dy;
+rfbSendCopyRegion(rfbClientPtr cl,
+                  sraRegionPtr reg,
+                  int dx,
+                  int dy)
 {
     int x, y, w, h;
     rfbFramebufferUpdateRectHeader rect;
@@ -1385,9 +1338,11 @@
  */
 
 rfbBool
-rfbSendRectEncodingRaw(cl, x, y, w, h)
-    rfbClientPtr cl;
-    int x, y, w, h;
+rfbSendRectEncodingRaw(rfbClientPtr cl,
+                       int x,
+                       int y,
+                       int w,
+                       int h)
 {
     rfbFramebufferUpdateRectHeader rect;
     int nlines;
@@ -1458,8 +1413,7 @@
  */
 
 rfbBool
-rfbSendLastRectMarker(cl)
-    rfbClientPtr cl;
+rfbSendLastRectMarker(rfbClientPtr cl)
 {
     rfbFramebufferUpdateRectHeader rect;
 
@@ -1490,9 +1444,9 @@
  */
 
 rfbBool
-rfbSendNewFBSize(cl, w, h)
-    rfbClientPtr cl;
-    int w, h;
+rfbSendNewFBSize(rfbClientPtr cl,
+                 int w,
+                 int h)
 {
     rfbFramebufferUpdateRectHeader rect;
 
@@ -1524,8 +1478,7 @@
  */
 
 rfbBool
-rfbSendUpdateBuf(cl)
-    rfbClientPtr cl;
+rfbSendUpdateBuf(rfbClientPtr cl)
 {
     if(cl->sock<0)
       return FALSE;
@@ -1546,10 +1499,9 @@
  */
 
 rfbBool
-rfbSendSetColourMapEntries(cl, firstColour, nColours)
-    rfbClientPtr cl;
-    int firstColour;
-    int nColours;
+rfbSendSetColourMapEntries(rfbClientPtr cl,
+                           int firstColour,
+                           int nColours)
 {
     char buf[sz_rfbSetColourMapEntriesMsg + 256 * 3 * 2];
     rfbSetColourMapEntriesMsg *scme = (rfbSetColourMapEntriesMsg *)buf;
-------------- next part --------------
Index: debian/patches/10_fix-corre-encoding.patch
===================================================================
--- debian/patches/10_fix-corre-encoding.patch	(révision 0)
+++ debian/patches/10_fix-corre-encoding.patch	(révision 0)
@@ -0,0 +1,444 @@
+Index: server/libvncserver/rfbserver.c
+===================================================================
+RCS file: /cvs/gnome/vino/server/libvncserver/rfbserver.c,v
+retrieving revision 1.4
+retrieving revision 1.6
+diff -u -r1.4 -r1.6
+--- server/libvncserver/rfbserver.c	16 Oct 2006 14:14:19 -0000	1.4
++++ server/libvncserver/rfbserver.c	18 Oct 2006 08:24:49 -0000	1.6
+@@ -166,9 +166,8 @@
+  */
+ 
+ void
+-rfbNewClientConnection(rfbScreen,sock)
+-    rfbScreenInfoPtr rfbScreen;
+-    int sock;
++rfbNewClientConnection(rfbScreenInfoPtr rfbScreen,
++                       int sock)
+ {
+     rfbClientPtr cl;
+ 
+@@ -182,9 +181,8 @@
+  */
+ 
+ rfbClientPtr
+-rfbNewClient(rfbScreen,sock)
+-    rfbScreenInfoPtr rfbScreen;
+-    int sock;
++rfbNewClient(rfbScreenInfoPtr rfbScreen,
++             int sock)
+ {
+     rfbProtocolVersionMsg pv;
+     rfbClientIteratorPtr iterator;
+@@ -244,7 +242,7 @@
+       cl->correMaxWidth = 48;
+       cl->correMaxHeight = 48;
+ #ifdef HAVE_LIBZ
+-      cl->zrleData = 0;
++      cl->zrleData = NULL;
+ #endif
+ 
+       cl->copyRegion = sraRgnCreate();
+@@ -303,10 +301,7 @@
+       if (WriteExact(cl, pv, sz_rfbProtocolVersionMsg) < 0) {
+         rfbLogPerror("rfbNewClient: write");
+         rfbCloseClient(cl);
+-	/* TODO: memory leak here (cl is never freed)
+-	 * can rfbClientConnectionGone called at this time?
+-	 * tim at tjansen.de
+-	 */
++        rfbClientConnectionGone(cl);
+         return NULL;
+       }
+     }
+@@ -338,8 +333,7 @@
+  */
+ 
+ void
+-rfbClientConnectionGone(cl)
+-     rfbClientPtr cl;
++rfbClientConnectionGone(rfbClientPtr cl)
+ {
+     int i;
+ 
+@@ -352,6 +346,9 @@
+     if (cl->next)
+         cl->next->prev = cl->prev;
+ 
++    if(cl->sock>0)
++        close(cl->sock);
++
+ #ifdef HAVE_LIBZ
+     FreeZrleData(cl);
+ #endif
+@@ -404,7 +401,9 @@
+     TINI_COND(cl->updateCond);
+     TINI_MUTEX(cl->updateMutex);
+ 
++    /* make sure outputMutex is unlocked before destroying */
+     LOCK(cl->outputMutex);
++    UNLOCK(cl->outputMutex);
+     TINI_MUTEX(cl->outputMutex);
+ 
+     rfbPrintStats(cl);
+@@ -418,8 +417,7 @@
+  */
+ 
+ void
+-rfbProcessClientMessage(cl)
+-     rfbClientPtr cl;
++rfbProcessClientMessage(rfbClientPtr cl)
+ {
+     switch (cl->state) {
+     case RFB_PROTOCOL_VERSION:
+@@ -458,12 +456,10 @@
+  */
+ 
+ static void
+-rfbProcessClientProtocolVersion(cl)
+-    rfbClientPtr cl;
++rfbProcessClientProtocolVersion(rfbClientPtr cl)
+ {
+     rfbProtocolVersionMsg pv;
+     int n, major_, minor_;
+-    char failureReason[256];
+ 
+     if ((n = ReadExact(cl, pv, sz_rfbProtocolVersionMsg)) <= 0) {
+         if (n == 0)
+@@ -477,7 +473,7 @@
+     pv[sz_rfbProtocolVersionMsg] = 0;
+     if (sscanf(pv,rfbProtocolVersionFormat,&major_,&minor_) != 2) {
+         char name[1024]; 
+-	if(sscanf(pv,"RFB %03d.%03d %1024s\n",&major_,&minor_,name) != 3) {
++	if(sscanf(pv,"RFB %03d.%03d %1023s\n",&major_,&minor_,name) != 3) {
+ 	    rfbErr("rfbProcessClientProtocolVersion: not a valid RFB client\n");
+ 	    rfbCloseClient(cl);
+ 	    return;
+@@ -485,14 +481,13 @@
+ 	free(cl->host);
+ 	cl->host=strdup(name);
+     }
+-    rfbLog("Protocol version %d.%d\n", major_, minor_);
++    rfbLog("Client Protocol Version %d.%d\n", major_, minor_);
+ 
+     if (major_ != rfbProtocolMajorVersion) {
+-        /* Major version mismatch - send a ConnFailed message */
+-        sprintf(failureReason,
+-                "RFB protocol version mismatch - server %d.%d, client %d.%d",
+-                rfbProtocolMajorVersion,rfbProtocolMinorVersion7,major_,minor_);
+-        rfbClientConnFailed(cl, failureReason);
++        rfbErr("RFB protocol version mismatch - server %d.%d, client %d.%d",
++                rfbProtocolMajorVersion, rfbProtocolMinorVersion7,
++                major_,minor_);
++        rfbCloseClient(cl);
+         return;
+     }
+ 
+@@ -520,19 +515,13 @@
+  */
+ 
+ void
+-rfbClientConnFailed(cl, reason)
+-    rfbClientPtr cl;
+-    char *reason;
++rfbClientConnFailed(rfbClientPtr cl,
++                    char *reason)
+ {
+     char *buf;
+     int len = strlen(reason);
+ 
+-    rfbErr("Connection failed: %s\n", reason);
+-
+-    /* Note, for version 3.7 of the protocol, rfbConnFailed should
+-     * be encoded in a single byte ... but we only send this message
+-     * when we get an unknown major version so um ...
+-     */
++    rfbLog("rfbClientConnFailed(\"%s\")\n", reason);
+ 
+     buf = (char *)malloc(8 + len);
+     ((uint32_t *)buf)[0] = 0;
+@@ -542,6 +531,7 @@
+     if (WriteExact(cl, buf, 8 + len) < 0)
+         rfbLogPerror("rfbClientConnFailed: write");
+     free(buf);
++
+     rfbCloseClient(cl);
+ }
+ 
+@@ -552,8 +542,7 @@
+  */
+ 
+ void
+-rfbProcessClientInitMessage(cl)
+-    rfbClientPtr cl;
++rfbProcessClientInitMessage(rfbClientPtr cl)
+ {
+     rfbClientInitMsg ci;
+     char buf[256];
+@@ -571,6 +560,8 @@
+         return;
+     }
+ 
++    memset(buf,0,sizeof(buf));
++
+     si->framebufferWidth = Swap16IfLE(cl->screen->width);
+     si->framebufferHeight = Swap16IfLE(cl->screen->height);
+     si->format = cl->screen->rfbServerFormat;
+@@ -578,10 +569,7 @@
+     si->format.greenMax = Swap16IfLE(si->format.greenMax);
+     si->format.blueMax = Swap16IfLE(si->format.blueMax);
+ 
+-    if (strlen(cl->screen->desktopName) > 128)      /* sanity check on desktop name len */
+-        ((char*)cl->screen->desktopName)[128] = 0;
+-
+-    strcpy(buf + sz_rfbServerInitMsg, cl->screen->desktopName);
++    strncpy(buf + sz_rfbServerInitMsg, cl->screen->desktopName, 127);
+     len = strlen(buf + sz_rfbServerInitMsg);
+     si->nameLength = Swap32IfLE(len);
+ 
+@@ -628,8 +616,7 @@
+  */
+ 
+ static void
+-rfbProcessClientNormalMessage(cl)
+-    rfbClientPtr cl;
++rfbProcessClientNormalMessage(rfbClientPtr cl)
+ {
+     int n=0;
+     rfbClientToServerMsg msg;
+@@ -727,51 +714,22 @@
+ 		cl->useCopyRect = TRUE;
+                 break;
+             case rfbEncodingRaw:
+-                if (cl->preferredEncoding == -1) {
+-                    cl->preferredEncoding = enc;
+-                    rfbLog("Using raw encoding for client %s\n",
+-                           cl->host);
+-                }
+-                break;
+             case rfbEncodingRRE:
+-                if (cl->preferredEncoding == -1) {
+-                    cl->preferredEncoding = enc;
+-                    rfbLog("Using rre encoding for client %s\n",
+-                           cl->host);
+-                }
+-                break;
+             case rfbEncodingCoRRE:
+-                if (cl->preferredEncoding == -1) {
+-                    cl->preferredEncoding = enc;
+-                    rfbLog("Using CoRRE encoding for client %s\n",
+-                           cl->host);
+-                }
+-                break;
+             case rfbEncodingHextile:
+-                if (cl->preferredEncoding == -1) {
+-                    cl->preferredEncoding = enc;
+-                    rfbLog("Using hextile encoding for client %s\n",
+-                           cl->host);
+-                }
+-                break;
+ #ifdef HAVE_LIBZ
+ 	    case rfbEncodingZlib:
+-		if (cl->preferredEncoding == -1) {
+-		    cl->preferredEncoding = enc;
+-		    rfbLog("Using zlib encoding for client %s\n",
+-			   cl->host);
+-		}
+-              break;
++            case rfbEncodingZRLE:
+ #ifdef HAVE_LIBJPEG
+ 	    case rfbEncodingTight:
+-		if (cl->preferredEncoding == -1) {
+-		    cl->preferredEncoding = enc;
+-		    rfbLog("Using tight encoding for client %s\n",
+-			   cl->host);
+-		}
+-		break;
+ #endif
+ #endif
++            /* The first supported encoding is the 'preferred' encoding */
++                if (cl->preferredEncoding == -1)
++                    cl->preferredEncoding = enc;
++
++
++                break;
+ 	    case rfbEncodingXCursor:
+ 		enableCursorShapeUpdates = TRUE;
+ 		break;
+@@ -796,15 +754,6 @@
+ 		    cl->useNewFBSize = TRUE;
+ 		}
+ 		break;
+-#ifdef HAVE_LIBZ
+-           case rfbEncodingZRLE:
+-               if (cl->preferredEncoding == -1) {
+-                   cl->preferredEncoding = enc;
+-                   rfbLog("Using ZRLE encoding for client %s\n",
+-                          cl->host);
+-               }
+-               break;
+-#endif
+             default:
+ #ifdef HAVE_LIBZ
+ 		if ( enc >= (uint32_t)rfbEncodingCompressLevel0 &&
+@@ -947,23 +896,23 @@
+ 	    return;
+ 	}
+ 
+-	if(!cl->viewOnly) {
+-	    msg.cct.length = Swap32IfLE(msg.cct.length);
++	msg.cct.length = Swap32IfLE(msg.cct.length);
+ 
+-	    str = (char *)malloc(msg.cct.length);
++	str = (char *)malloc(msg.cct.length);
+ 
+-	    if ((n = ReadExact(cl, str, msg.cct.length)) <= 0) {
+-		if (n != 0)
+-		    rfbLogPerror("rfbProcessClientNormalMessage: read");
+-		free(str);
+-		rfbCloseClient(cl);
+-		return;
+-	    }
++	if ((n = ReadExact(cl, str, msg.cct.length)) <= 0) {
++	    if (n != 0)
++	        rfbLogPerror("rfbProcessClientNormalMessage: read");
++	    free(str);
++	    rfbCloseClient(cl);
++	    return;
++	}
+ 
++	if(!cl->viewOnly) {
+ 	    if (cl->screen->setXCutText)
+ 	      cl->screen->setXCutText(str, msg.cct.length, cl);
+-	    free(str);
+ 	}
++	free(str);
+ 
+         return;
+ 
+@@ -987,11 +936,10 @@
+  */
+ 
+ rfbBool
+-rfbSendFramebufferUpdate(cl, givenUpdateRegion)
+-     rfbClientPtr cl;
+-     sraRegionPtr givenUpdateRegion;
++rfbSendFramebufferUpdate(rfbClientPtr cl,
++                         sraRegionPtr givenUpdateRegion)
+ {
+-    sraRectangleIterator* i = NULL;
++    sraRectangleIterator* i=NULL;
+     sraRect rect;
+     int nUpdateRegionRects;
+     rfbFramebufferUpdateMsg *fu = (rfbFramebufferUpdateMsg *)cl->updateBuf;
+@@ -1077,7 +1025,7 @@
+     /*
+      * The client is interested in the region requestedRegion.  The region
+      * which should be updated now is the intersection of requestedRegion
+-     * and the union of givenUpdateRegion and copyRegion.  If it's empty then
++     * and the union of modifiedRegion and copyRegion.  If it's empty then
+      * no update is needed.
+      */
+ 
+@@ -1147,7 +1095,6 @@
+      * carry over a copyRegion for a future update.
+      */
+ 
+-
+      sraRgnOr(cl->modifiedRegion,cl->copyRegion);
+      sraRgnSubtract(cl->modifiedRegion,updateRegion);
+      sraRgnSubtract(cl->modifiedRegion,updateCopyRegion);
+@@ -1214,10 +1161,16 @@
+     fu->type = rfbFramebufferUpdate;
+     if (nUpdateRegionRects != 0xFFFF) {
+ 	if(cl->screen->maxRectsPerUpdate>0
++	   /* CoRRE splits the screen into smaller squares */
++	   && cl->preferredEncoding != rfbEncodingCoRRE
++#ifdef HAVE_LIBZ
++	   /* Zlib encoding splits rectangles up into smaller chunks */
++	   && cl->preferredEncoding != rfbEncodingZlib
+ #ifdef HAVE_LIBJPEG
+ 	   /* Tight encoding counts the rectangles differently */
+ 	   && cl->preferredEncoding != rfbEncodingTight
+ #endif
++#endif /* HAVE_LIBZ */
+ 	   && nUpdateRegionRects>cl->screen->maxRectsPerUpdate) {
+ 	    sraRegion* newUpdateRegion = sraRgnBBox(updateRegion);
+ 	    sraRgnDestroy(updateRegion);
+@@ -1335,10 +1288,10 @@
+  */
+ 
+ rfbBool
+-rfbSendCopyRegion(cl, reg, dx, dy)
+-    rfbClientPtr cl;
+-    sraRegionPtr reg;
+-    int dx, dy;
++rfbSendCopyRegion(rfbClientPtr cl,
++                  sraRegionPtr reg,
++                  int dx,
++                  int dy)
+ {
+     int x, y, w, h;
+     rfbFramebufferUpdateRectHeader rect;
+@@ -1385,9 +1338,11 @@
+  */
+ 
+ rfbBool
+-rfbSendRectEncodingRaw(cl, x, y, w, h)
+-    rfbClientPtr cl;
+-    int x, y, w, h;
++rfbSendRectEncodingRaw(rfbClientPtr cl,
++                       int x,
++                       int y,
++                       int w,
++                       int h)
+ {
+     rfbFramebufferUpdateRectHeader rect;
+     int nlines;
+@@ -1458,8 +1413,7 @@
+  */
+ 
+ rfbBool
+-rfbSendLastRectMarker(cl)
+-    rfbClientPtr cl;
++rfbSendLastRectMarker(rfbClientPtr cl)
+ {
+     rfbFramebufferUpdateRectHeader rect;
+ 
+@@ -1490,9 +1444,9 @@
+  */
+ 
+ rfbBool
+-rfbSendNewFBSize(cl, w, h)
+-    rfbClientPtr cl;
+-    int w, h;
++rfbSendNewFBSize(rfbClientPtr cl,
++                 int w,
++                 int h)
+ {
+     rfbFramebufferUpdateRectHeader rect;
+ 
+@@ -1524,8 +1478,7 @@
+  */
+ 
+ rfbBool
+-rfbSendUpdateBuf(cl)
+-    rfbClientPtr cl;
++rfbSendUpdateBuf(rfbClientPtr cl)
+ {
+     if(cl->sock<0)
+       return FALSE;
+@@ -1546,10 +1499,9 @@
+  */
+ 
+ rfbBool
+-rfbSendSetColourMapEntries(cl, firstColour, nColours)
+-    rfbClientPtr cl;
+-    int firstColour;
+-    int nColours;
++rfbSendSetColourMapEntries(rfbClientPtr cl,
++                           int firstColour,
++                           int nColours)
+ {
+     char buf[sz_rfbSetColourMapEntriesMsg + 256 * 3 * 2];
+     rfbSetColourMapEntriesMsg *scme = (rfbSetColourMapEntriesMsg *)buf;
Index: debian/changelog
===================================================================
--- debian/changelog	(révision 7809)
+++ debian/changelog	(copie de travail)
@@ -1,3 +1,11 @@
+vino (2.16.0-2) UNRELEASED; urgency=low
+
+  * New patch, 10_fix-corre-encoding, to fix an issue with the CoRRE encoding
+    saying its only sending a single rectangle, but sending lots more; thanks
+    Detlef Schmicker; from upstream CVS; closes: #395994.
+
+ -- Loic Minier <lool at dooz.org>  Sun, 29 Oct 2006 22:20:58 +0100
+
 vino (2.16.0-1) unstable; urgency=low
 
   * New upstream release.


More information about the Pkg-gnome-maintainers mailing list