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