I propose the following patch to support BIG-REQUESTS. Please review.
Cheers, Paul
Paul Szabo [email protected] http://www.maths.usyd.edu.au/u/psz/
School of Mathematics and Statistics University of Sydney Australia
--- ClientChannel.C-prePSz 2007-02-03 01:25:48.000000000 +1100
+++ ClientChannel.C 2014-10-20 06:34:40.000000000 +1100
@@ -87,9 +87,28 @@
{
clientCache_.lastRequestSequenceNum++;
unsigned char opcode = *buffer;
+ // Support BIG-REQUESTS
+ // This code "traditionally" used buffer for the whole request,
+ // starting with the header and then the data at (buffer+4).
+ // We now pick out the header so later do not need to reference
+ // the first four bytes, and use datbuf pointing to the data.
+ // For BIG-REQUESTS we advance datbuf by four bytes, so it still
+ // points to the data.
+ // We use datsiz, the size of datbuf in 4-byte units, so normally
+ // datsiz = (size/4 - 1) but for BIG-REQUESTS it is (size/4 - 2).
+ unsigned char datbyte = buffer[1];
+ unsigned int buffer2 = GetUINT(buffer + 2, bigEndian_);
+ unsigned int datsiz = buffer2 - 1;
+ const unsigned char* datbuf = buffer+4;
+ if (buffer2 == 0)
+ {
+ // BIG-REQUESTS
+ datsiz = GetULONG(datbuf, bigEndian_) - 2;
+ datbuf += 4;
+ }
if ((opcode == X_PolyFillRectangle) &&
- (GetUINT(buffer + 2, bigEndian_) == 3))
+ (buffer2 == 3))
{
opcode = X_NoOperation;
}
@@ -105,9 +124,9 @@
case X_AllocColor:
{
encodeBuffer.
- encodeCachedValue(GetULONG(buffer + 4, bigEndian_),
+ encodeCachedValue(GetULONG(datbuf, bigEndian_),
29, clientCache_.colormapCache, 9);
- const unsigned char *nextSrc = buffer + 8;
+ const unsigned char *nextSrc = datbuf + 4;
unsigned int colorData[3];
for (unsigned int i = 0; i < 3; i++)
@@ -129,30 +148,30 @@
break;
case X_ChangeProperty:
{
- unsigned char format = buffer[16];
+ unsigned char format = datbuf[12];
encodeBuffer.encodeCachedValue(format, 8,
clientCache_.
changePropertyFormatCache);
unsigned int dataLength =
- GetULONG(buffer + 20, bigEndian_);
+ GetULONG(datbuf + 16, bigEndian_);
encodeBuffer.encodeValue(dataLength, 32, 6);
- encodeBuffer.encodeValue(buffer[1], 2);
- encodeBuffer.encodeCachedValue(GetULONG(buffer + 4,
+ encodeBuffer.encodeValue(datbyte, 2);
+ encodeBuffer.encodeCachedValue(GetULONG(datbuf,
bigEndian_), 29,
clientCache_.windowCache,
9);
encodeBuffer.
- encodeCachedValue(GetULONG(buffer + 8, bigEndian_),
+ encodeCachedValue(GetULONG(datbuf + 4, bigEndian_),
29,
clientCache_.
changePropertyPropertyCache, 9);
encodeBuffer.
- encodeCachedValue(GetULONG(buffer + 12, bigEndian_),
+ encodeCachedValue(GetULONG(datbuf + 8, bigEndian_),
29,
clientCache_.
changePropertyTypeCache, 9);
- const unsigned char *nextSrc = buffer + 24;
+ const unsigned char *nextSrc = datbuf + 20;
if (format == 8)
{
@@ -163,6 +182,7 @@
}
else if (format == 32)
{
+ // Wonder if ChangeProperty format=32 is compressed also?
for (unsigned int i = 0; i < dataLength; i++)
{
encodeBuffer.encodeCachedValue(GetULONG(nextSrc,
@@ -186,17 +206,17 @@
break;
case X_ChangeWindowAttributes:
{
- encodeBuffer.encodeValue((size - 12) >> 2, 4);
- encodeBuffer.encodeCachedValue(GetULONG(buffer + 4,
+ encodeBuffer.encodeValue(datsiz-2, 4);
+ encodeBuffer.encodeCachedValue(GetULONG(datbuf,
bigEndian_), 29,
clientCache_.windowCache,
9);
- unsigned int bitmask = GetULONG(buffer + 8, bigEndian_);
+ unsigned int bitmask = GetULONG(datbuf + 4, bigEndian_);
encodeBuffer.encodeCachedValue(bitmask, 15,
clientCache_.
createWindowBitmaskCache);
- const unsigned char *nextSrc = buffer + 12;
+ const unsigned char *nextSrc = datbuf + 8;
unsigned int mask = 0x1;
for (unsigned int j = 0; j < 15; j++)
@@ -217,12 +237,12 @@
break;
case X_ClearArea:
{
- encodeBuffer.encodeValue((unsigned int) buffer[1], 1);
- encodeBuffer.encodeCachedValue(GetULONG(buffer + 4,
+ encodeBuffer.encodeValue((unsigned int) datbyte, 1);
+ encodeBuffer.encodeCachedValue(GetULONG(datbuf,
bigEndian_), 29,
clientCache_.windowCache,
9);
- const unsigned char *nextSrc = buffer + 8;
+ const unsigned char *nextSrc = datbuf + 4;
for (unsigned int i = 0; i < 4; i++)
{
@@ -238,7 +258,7 @@
break;
case X_CloseFont:
{
- unsigned int font = GetULONG(buffer + 4, bigEndian_);
+ unsigned int font = GetULONG(datbuf, bigEndian_);
encodeBuffer.encodeValue(font - clientCache_.lastFont,
29, 5);
@@ -247,17 +267,17 @@
break;
case X_ConfigureWindow:
{
- encodeBuffer.encodeCachedValue(GetULONG(buffer + 4,
+ encodeBuffer.encodeCachedValue(GetULONG(datbuf,
bigEndian_), 29,
clientCache_.windowCache,
9);
- unsigned int bitmask = GetUINT(buffer + 8, bigEndian_);
+ unsigned int bitmask = GetUINT(datbuf + 4, bigEndian_);
encodeBuffer.encodeCachedValue(bitmask, 7,
clientCache_.
configureWindowBitmaskCache);
unsigned int mask = 0x1;
- const unsigned char *nextSrc = buffer + 12;
+ const unsigned char *nextSrc = datbuf + 8;
for (unsigned int i = 0; i < 7; i++)
{
@@ -279,11 +299,11 @@
case X_ConvertSelection:
{
encodeBuffer.
- encodeCachedValue(GetULONG(buffer + 4, bigEndian_),
+ encodeCachedValue(GetULONG(datbuf, bigEndian_),
29,
clientCache_.
convertSelectionRequestorCache, 9);
- const unsigned char *nextSrc = buffer + 8;
+ const unsigned char *nextSrc = datbuf + 4;
for (unsigned int i = 0; i < 3; i++)
{
@@ -306,17 +326,17 @@
break;
case X_CopyArea:
{
- encodeBuffer.encodeCachedValue(GetULONG(buffer + 4,
+ encodeBuffer.encodeCachedValue(GetULONG(datbuf,
bigEndian_), 29,
clientCache_.drawableCache,
9);
encodeBuffer.
- encodeCachedValue(GetULONG(buffer + 8, bigEndian_),
+ encodeCachedValue(GetULONG(datbuf + 4, bigEndian_),
29, clientCache_.drawableCache, 9);
encodeBuffer.
- encodeCachedValue(GetULONG(buffer + 12, bigEndian_),
+ encodeCachedValue(GetULONG(datbuf + 8, bigEndian_),
29, clientCache_.gcCache, 9);
- const unsigned char *nextSrc = buffer + 16;
+ const unsigned char *nextSrc = datbuf + 12;
for (unsigned int i = 0; i < 6; i++)
{
@@ -332,31 +352,31 @@
break;
case X_CopyGC:
{
- encodeBuffer.encodeCachedValue(GetULONG(buffer + 4,
+ encodeBuffer.encodeCachedValue(GetULONG(datbuf,
bigEndian_), 29,
clientCache_.gcCache, 9);
encodeBuffer.
- encodeCachedValue(GetULONG(buffer + 8, bigEndian_),
+ encodeCachedValue(GetULONG(datbuf + 4, bigEndian_),
29, clientCache_.gcCache, 9);
encodeBuffer.
- encodeCachedValue(GetULONG(buffer + 12, bigEndian_),
+ encodeCachedValue(GetULONG(datbuf + 8, bigEndian_),
23,
clientCache_.createGCBitmaskCache);
}
break;
case X_CopyPlane:
{
- encodeBuffer.encodeCachedValue(GetULONG(buffer + 4,
+ encodeBuffer.encodeCachedValue(GetULONG(datbuf,
bigEndian_), 29,
clientCache_.drawableCache,
9);
encodeBuffer.
- encodeCachedValue(GetULONG(buffer + 8, bigEndian_),
+ encodeCachedValue(GetULONG(datbuf + 4, bigEndian_),
29, clientCache_.drawableCache, 9);
encodeBuffer.
- encodeCachedValue(GetULONG(buffer + 12, bigEndian_),
+ encodeCachedValue(GetULONG(datbuf + 8, bigEndian_),
29, clientCache_.gcCache, 9);
- const unsigned char *nextSrc = buffer + 16;
+ const unsigned char *nextSrc = datbuf + 12;
for (unsigned int i = 0; i < 6; i++)
{
@@ -368,7 +388,7 @@
8);
nextSrc += 2;
}
- encodeBuffer.encodeCachedValue(GetULONG(buffer + 28,
+ encodeBuffer.encodeCachedValue(GetULONG(datbuf + 24,
bigEndian_), 32,
clientCache_.
copyPlaneBitPlaneCache,
@@ -378,14 +398,14 @@
case X_CreateGC:
case X_ChangeGC:
{
- encodeBuffer.encodeCachedValue(GetULONG(buffer + 4,
+ encodeBuffer.encodeCachedValue(GetULONG(datbuf,
bigEndian_), 29,
clientCache_.gcCache, 9);
- const unsigned char *nextSrc = buffer + 8;
+ const unsigned char *nextSrc = datbuf + 4;
if (opcode == X_CreateGC)
{
- encodeBuffer.encodeCachedValue(GetULONG(buffer + 8,
+ encodeBuffer.encodeCachedValue(GetULONG(datbuf + 4,
bigEndian_),
29,
clientCache_.
@@ -428,9 +448,9 @@
break;
case X_CreatePixmap:
{
- encodeBuffer.encodeCachedValue(buffer[1], 8,
+ encodeBuffer.encodeCachedValue(datbyte, 8,
clientCache_.depthCache);
- unsigned int pixmap = GetULONG(buffer + 4, bigEndian_);
+ unsigned int pixmap = GetULONG(datbuf, bigEndian_);
unsigned int diff = pixmap -
clientCache_.createPixmapLastPixmap;
if (diff == 0)
@@ -441,32 +461,32 @@
encodeBuffer.encodeValue(diff, 29, 4);
clientCache_.createPixmapLastPixmap = pixmap;
}
- encodeBuffer.encodeCachedValue(GetULONG(buffer + 8,
+ encodeBuffer.encodeCachedValue(GetULONG(datbuf + 4,
bigEndian_), 29,
clientCache_.drawableCache,
9);
encodeBuffer.
- encodeCachedValue(GetUINT(buffer + 12, bigEndian_),
+ encodeCachedValue(GetUINT(datbuf + 8, bigEndian_),
16, clientCache_.createPixmapXCache,
8);
encodeBuffer.
- encodeCachedValue(GetUINT(buffer + 14, bigEndian_),
+ encodeCachedValue(GetUINT(datbuf + 10, bigEndian_),
16, clientCache_.createPixmapYCache,
8);
}
break;
case X_CreateWindow:
{
- encodeBuffer.encodeCachedValue((unsigned int) buffer[1],
+ encodeBuffer.encodeCachedValue((unsigned int) datbyte,
8,
clientCache_.depthCache);
encodeBuffer.
- encodeCachedValue(GetULONG(buffer + 8, bigEndian_),
+ encodeCachedValue(GetULONG(datbuf + 4, bigEndian_),
29, clientCache_.windowCache, 9);
encodeBuffer.
- encodeCachedValue(GetULONG(buffer + 4, bigEndian_),
+ encodeCachedValue(GetULONG(datbuf, bigEndian_),
29, clientCache_.windowCache, 9);
- const unsigned char *nextSrc = buffer + 12;
+ const unsigned char *nextSrc = datbuf + 8;
for (unsigned int i = 0; i < 6; i++)
{
@@ -478,15 +498,15 @@
[i], 8);
nextSrc += 2;
}
- encodeBuffer.encodeCachedValue(GetULONG(buffer + 24,
+ encodeBuffer.encodeCachedValue(GetULONG(datbuf + 20,
bigEndian_), 29,
clientCache_.visualCache);
- unsigned int bitmask = GetULONG(buffer + 28, bigEndian_);
+ unsigned int bitmask = GetULONG(datbuf + 24, bigEndian_);
encodeBuffer.encodeCachedValue(bitmask, 15,
clientCache_.
createWindowBitmaskCache);
- nextSrc = buffer + 32;
+ nextSrc = datbuf + 28;
unsigned int mask = 0x1;
for (unsigned int j = 0; j < 15; j++)
@@ -508,29 +528,29 @@
case X_DeleteProperty:
{
encodeBuffer.
- encodeCachedValue(GetULONG(buffer + 4, bigEndian_),
+ encodeCachedValue(GetULONG(datbuf, bigEndian_),
29, clientCache_.windowCache, 9);
- encodeBuffer.encodeValue(GetULONG(buffer + 8, bigEndian_),
+ encodeBuffer.encodeValue(GetULONG(datbuf + 4, bigEndian_),
29, 9);
}
break;
case X_FillPoly:
{
- unsigned int numPoints = ((size - 16) >> 2);
+ unsigned int numPoints = datsiz - 3;
encodeBuffer.encodeCachedValue(numPoints, 14,
clientCache_.
fillPolyNumPointsCache, 4);
encodeBuffer.
- encodeCachedValue(GetULONG(buffer + 4, bigEndian_),
+ encodeCachedValue(GetULONG(datbuf, bigEndian_),
29, clientCache_.drawableCache, 9);
encodeBuffer.
- encodeCachedValue(GetULONG(buffer + 8, bigEndian_),
+ encodeCachedValue(GetULONG(datbuf + 4, bigEndian_),
29, clientCache_.gcCache, 9);
- encodeBuffer.encodeValue((unsigned int) buffer[12], 2);
- encodeBuffer.encodeValue((unsigned int) buffer[13], 1);
- int relativeCoordMode = (buffer[13] != 0);
- const unsigned char *nextSrc = buffer + 16;
+ encodeBuffer.encodeValue((unsigned int) datbuf[8], 2);
+ encodeBuffer.encodeValue((unsigned int) datbuf[9], 1);
+ int relativeCoordMode = (datbuf[9] != 0);
+ const unsigned char *nextSrc = datbuf + 12;
unsigned int pointIndex = 0;
for (unsigned int i = 0; i < numPoints; i++)
@@ -602,15 +622,14 @@
break;
case X_FreeColors:
{
- unsigned int numPixels =
- GetUINT(buffer + 2, bigEndian_) - 3;
- encodeBuffer.encodeValue(numPixels, 16, 4);
+ unsigned int numPixels = datsiz - 2;
+ encodeBuffer.encodeValue(numPixels, 32, 4);
encodeBuffer.
- encodeCachedValue(GetULONG(buffer + 4, bigEndian_),
+ encodeCachedValue(GetULONG(datbuf, bigEndian_),
29, clientCache_.colormapCache, 9);
- encodeBuffer.encodeValue(GetULONG(buffer + 8, bigEndian_),
+ encodeBuffer.encodeValue(GetULONG(datbuf + 4, bigEndian_),
32, 4);
- const unsigned char *nextSrc = buffer + 12;
+ const unsigned char *nextSrc = datbuf + 8;
while (numPixels)
{
@@ -624,20 +643,20 @@
case X_FreeCursor:
{
encodeBuffer.
- encodeCachedValue(GetULONG(buffer + 4, bigEndian_),
+ encodeCachedValue(GetULONG(datbuf, bigEndian_),
29, clientCache_.cursorCache, 9);
}
break;
case X_FreeGC:
{
- encodeBuffer.encodeCachedValue(GetULONG(buffer + 4,
+ encodeBuffer.encodeCachedValue(GetULONG(datbuf,
bigEndian_), 29,
clientCache_.gcCache, 9);
}
break;
case X_FreePixmap:
{
- unsigned int pixmap = GetULONG(buffer + 4, bigEndian_);
+ unsigned int pixmap = GetULONG(datbuf, bigEndian_);
unsigned int diff = pixmap -
clientCache_.createPixmapLastPixmap;
if (diff == 0)
@@ -652,7 +671,7 @@
break;
case X_GetAtomName:
{
- encodeBuffer.encodeValue(GetULONG(buffer + 4, bigEndian_),
+ encodeBuffer.encodeValue(GetULONG(datbuf, bigEndian_),
29, 9);
sequenceNumQueue_.push(clientCache_.
lastRequestSequenceNum, opcode);
@@ -660,7 +679,7 @@
break;
case X_GetGeometry:
{
- encodeBuffer.encodeCachedValue(GetULONG(buffer + 4,
+ encodeBuffer.encodeCachedValue(GetULONG(datbuf,
bigEndian_), 29,
clientCache_.drawableCache,
9);
@@ -677,28 +696,28 @@
break;
case X_GetKeyboardMapping:
{
- encodeBuffer.encodeValue((unsigned int) buffer[4], 8);
- encodeBuffer.encodeValue((unsigned int) buffer[5], 8);
+ encodeBuffer.encodeValue((unsigned int) datbuf[0], 8);
+ encodeBuffer.encodeValue((unsigned int) datbuf[1], 8);
sequenceNumQueue_.push(clientCache_.
lastRequestSequenceNum, opcode);
}
break;
case X_GetProperty:
{
- encodeBuffer.encodeValue((unsigned int) buffer[1], 1);
- encodeBuffer.encodeCachedValue(GetULONG(buffer + 4,
+ encodeBuffer.encodeValue((unsigned int) datbyte, 1);
+ encodeBuffer.encodeCachedValue(GetULONG(datbuf,
bigEndian_), 29,
clientCache_.windowCache,
9);
- unsigned int property = GetULONG(buffer + 8, bigEndian_);
+ unsigned int property = GetULONG(datbuf + 4, bigEndian_);
encodeBuffer.encodeValue(property, 29, 9);
encodeBuffer.
- encodeValue(GetULONG(buffer + 12, bigEndian_), 29, 9);
+ encodeValue(GetULONG(datbuf + 8, bigEndian_), 29, 9);
encodeBuffer.
- encodeValue(GetULONG(buffer + 16, bigEndian_), 32, 2);
+ encodeValue(GetULONG(datbuf + 12, bigEndian_), 32, 2);
encodeBuffer.
- encodeValue(GetULONG(buffer + 20, bigEndian_), 32, 8);
+ encodeValue(GetULONG(datbuf + 16, bigEndian_), 32, 8);
sequenceNumQueue_.push(clientCache_.
lastRequestSequenceNum, opcode,
property);
@@ -706,7 +725,7 @@
break;
case X_GetSelectionOwner:
{
- encodeBuffer.encodeCachedValue(GetULONG(buffer + 4,
+ encodeBuffer.encodeCachedValue(GetULONG(datbuf,
bigEndian_), 29,
clientCache_.
getSelectionOwnerSelectionCache,
@@ -718,38 +737,38 @@
case X_GrabButton:
case X_GrabPointer:
{
- encodeBuffer.encodeValue((unsigned int) buffer[1], 1);
- encodeBuffer.encodeCachedValue(GetULONG(buffer + 4,
+ encodeBuffer.encodeValue((unsigned int) datbyte, 1);
+ encodeBuffer.encodeCachedValue(GetULONG(datbuf,
bigEndian_), 29,
clientCache_.windowCache,
9);
encodeBuffer.
- encodeCachedValue(GetUINT(buffer + 8, bigEndian_), 16,
+ encodeCachedValue(GetUINT(datbuf + 4, bigEndian_), 16,
clientCache_.
grabButtonEventMaskCache);
- encodeBuffer.encodeValue((unsigned int) buffer[10], 1);
- encodeBuffer.encodeValue((unsigned int) buffer[11], 1);
- encodeBuffer.encodeCachedValue(GetULONG(buffer + 12,
+ encodeBuffer.encodeValue((unsigned int) datbuf[6], 1);
+ encodeBuffer.encodeValue((unsigned int) datbuf[7], 1);
+ encodeBuffer.encodeCachedValue(GetULONG(datbuf + 8,
bigEndian_), 29,
clientCache_.
grabButtonConfineCache, 9);
encodeBuffer.
- encodeCachedValue(GetULONG(buffer + 16, bigEndian_),
+ encodeCachedValue(GetULONG(datbuf + 12, bigEndian_),
29, clientCache_.cursorCache, 9);
if (opcode == X_GrabButton)
{
- encodeBuffer.encodeCachedValue(buffer[20], 8,
+ encodeBuffer.encodeCachedValue(datbuf[16], 8,
clientCache_.
grabButtonButtonCache);
encodeBuffer.
encodeCachedValue(GetUINT
- (buffer + 22, bigEndian_), 16,
+ (datbuf + 18, bigEndian_), 16,
clientCache_.
grabButtonModifierCache);
}
else
{
- unsigned int timestamp = GetULONG(buffer + 20,
+ unsigned int timestamp = GetULONG(datbuf + 16,
bigEndian_);
encodeBuffer.encodeValue(timestamp -
@@ -765,20 +784,20 @@
break;
case X_GrabKeyboard:
{
- encodeBuffer.encodeValue((unsigned int) buffer[1], 1);
- encodeBuffer.encodeCachedValue(GetULONG(buffer + 4,
+ encodeBuffer.encodeValue((unsigned int) datbyte, 1);
+ encodeBuffer.encodeCachedValue(GetULONG(datbuf,
bigEndian_), 29,
clientCache_.windowCache,
9);
- unsigned int timestamp = GetULONG(buffer + 8, bigEndian_);
+ unsigned int timestamp = GetULONG(datbuf + 4, bigEndian_);
encodeBuffer.encodeValue(timestamp -
clientCache_.
grabKeyboardLastTimestamp, 32,
4);
clientCache_.grabKeyboardLastTimestamp = timestamp;
- encodeBuffer.encodeValue((unsigned int) buffer[12], 1);
- encodeBuffer.encodeValue((unsigned int) buffer[13], 1);
+ encodeBuffer.encodeValue((unsigned int) datbuf[8], 1);
+ encodeBuffer.encodeValue((unsigned int) datbuf[9], 1);
sequenceNumQueue_.push(clientCache_.
lastRequestSequenceNum, opcode);
}
@@ -791,31 +810,31 @@
break;
case X_ImageText8:
{
- unsigned int textLength = (unsigned int) buffer[1];
+ unsigned int textLength = (unsigned int) datbyte;
encodeBuffer.encodeValue(textLength, 8);
- encodeBuffer.encodeCachedValue(GetULONG(buffer + 4,
+ encodeBuffer.encodeCachedValue(GetULONG(datbuf,
bigEndian_), 29,
clientCache_.drawableCache,
9);
encodeBuffer.
- encodeCachedValue(GetULONG(buffer + 8, bigEndian_),
+ encodeCachedValue(GetULONG(datbuf + 4, bigEndian_),
29, clientCache_.gcCache, 9);
- unsigned int x = GetUINT(buffer + 12, bigEndian_);
+ unsigned int x = GetUINT(datbuf + 8, bigEndian_);
int xDiff = x - clientCache_.imageText8LastX;
clientCache_.imageText8LastX = x;
encodeBuffer.encodeCachedValue(xDiff, 16,
clientCache_.
imageText8CacheX, 8);
- unsigned int y = GetUINT(buffer + 14, bigEndian_);
+ unsigned int y = GetUINT(datbuf + 10, bigEndian_);
int yDiff = y - clientCache_.imageText8LastY;
clientCache_.imageText8LastY = y;
encodeBuffer.encodeCachedValue(yDiff, 16,
clientCache_.
imageText8CacheY, 8);
- const unsigned char *nextSrc = buffer + 16;
+ const unsigned char *nextSrc = datbuf + 12;
clientCache_.imageText8TextCompressor.reset();
for (unsigned int j = 0; j < textLength; j++)
@@ -825,11 +844,11 @@
break;
case X_InternAtom:
{
- unsigned int nameLength = GetUINT(buffer + 4, bigEndian_);
+ unsigned int nameLength = GetUINT(datbuf, bigEndian_);
encodeBuffer.encodeValue(nameLength, 16, 6);
- encodeBuffer.encodeValue((unsigned int) buffer[1], 1);
- const unsigned char *nextSrc = buffer + 8;
+ encodeBuffer.encodeValue((unsigned int) datbyte, 1);
+ const unsigned char *nextSrc = datbuf + 4;
clientCache_.internAtomTextCompressor.reset();
for (unsigned int i = 0; i < nameLength; i++)
@@ -847,12 +866,12 @@
break;
case X_ListFonts:
{
- unsigned int textLength = GetUINT(buffer + 6, bigEndian_);
+ unsigned int textLength = GetUINT(datbuf + 2, bigEndian_);
encodeBuffer.encodeValue(textLength, 16, 6);
- encodeBuffer.encodeValue(GetUINT(buffer + 4, bigEndian_),
+ encodeBuffer.encodeValue(GetUINT(datbuf, bigEndian_),
16, 6);
- const unsigned char *nextSrc = buffer + 8;
+ const unsigned char *nextSrc = datbuf + 4;
clientCache_.polyText8TextCompressor.reset();
for (unsigned int i = 0; i < textLength; i++)
@@ -867,13 +886,13 @@
{
sequenceNumQueue_.push(clientCache_.
lastRequestSequenceNum, opcode);
- unsigned int textLength = GetUINT(buffer + 8, bigEndian_);
+ unsigned int textLength = GetUINT(datbuf + 4, bigEndian_);
encodeBuffer.encodeValue(textLength, 16, 6);
encodeBuffer.
- encodeCachedValue(GetULONG(buffer + 4, bigEndian_),
+ encodeCachedValue(GetULONG(datbuf, bigEndian_),
29, clientCache_.colormapCache, 9);
- const unsigned char *nextSrc = buffer + 12;
+ const unsigned char *nextSrc = datbuf + 8;
clientCache_.polyText8TextCompressor.reset();
for (unsigned int i = 0; i < textLength; i++)
@@ -890,7 +909,7 @@
case X_QueryPointer:
case X_QueryTree:
{
- encodeBuffer.encodeCachedValue(GetULONG(buffer + 4,
+ encodeBuffer.encodeCachedValue(GetULONG(datbuf,
bigEndian_), 29,
clientCache_.windowCache,
9);
@@ -906,15 +925,15 @@
break;
case X_OpenFont:
{
- unsigned int nameLength = GetUINT(buffer + 8, bigEndian_);
+ unsigned int nameLength = GetUINT(datbuf + 4, bigEndian_);
encodeBuffer.encodeValue(nameLength, 16, 7);
- unsigned int font = GetULONG(buffer + 4, bigEndian_);
+ unsigned int font = GetULONG(datbuf, bigEndian_);
encodeBuffer.encodeValue(font - clientCache_.lastFont,
29, 5);
clientCache_.lastFont = font;
- const unsigned char *nextSrc = buffer + 12;
+ const unsigned char *nextSrc = datbuf + 8;
clientCache_.openFontTextCompressor.reset();
for (; nameLength; nameLength--)
@@ -924,20 +943,20 @@
break;
case X_PolyFillRectangle:
{
- encodeBuffer.encodeCachedValue(GetULONG(buffer + 4,
+ encodeBuffer.encodeCachedValue(GetULONG(datbuf,
bigEndian_), 29,
clientCache_.drawableCache,
9);
encodeBuffer.
- encodeCachedValue(GetULONG(buffer + 8, bigEndian_),
+ encodeCachedValue(GetULONG(datbuf + 4, bigEndian_),
29, clientCache_.gcCache, 9);
unsigned int index = 0;
unsigned int lastX = 0, lastY = 0;
unsigned int lastWidth = 0, lastHeight = 0;
- for (unsigned int i = 12; i < size;)
+ for (unsigned int i = 8; i < (datsiz<<2);)
{
- unsigned int x = GetUINT(buffer + i, bigEndian_);
+ unsigned int x = GetUINT(datbuf + i, bigEndian_);
unsigned int newX = x;
x -= lastX;
@@ -947,7 +966,7 @@
polyFillRectangleCacheX
[index], 8);
i += 2;
- unsigned int y = GetUINT(buffer + i, bigEndian_);
+ unsigned int y = GetUINT(datbuf + i, bigEndian_);
unsigned int newY = y;
y -= lastY;
@@ -957,7 +976,7 @@
polyFillRectangleCacheY
[index], 8);
i += 2;
- unsigned int width = GetUINT(buffer + i, bigEndian_);
+ unsigned int width = GetUINT(datbuf + i, bigEndian_);
unsigned int newWidth = width;
width -= lastWidth;
@@ -967,7 +986,7 @@
polyFillRectangleCacheWidth
[index], 8);
i += 2;
- unsigned int height = GetUINT(buffer + i, bigEndian_);
+ unsigned int height = GetUINT(datbuf + i, bigEndian_);
unsigned int newHeight = height;
height -= lastHeight;
@@ -979,27 +998,26 @@
i += 2;
index = 1;
- encodeBuffer.encodeValue(((i < size) ? 1 : 0), 1);
+ encodeBuffer.encodeValue(((i < (datsiz<<2)) ? 1 : 0), 1);
}
}
break;
case X_PolyPoint:
{
- encodeBuffer.encodeValue(GetUINT(buffer + 2, bigEndian_) -
- 3, 16, 4);
- encodeBuffer.encodeValue((unsigned int) buffer[1], 1);
- encodeBuffer.encodeCachedValue(GetULONG(buffer + 4,
+ encodeBuffer.encodeValue(datsiz - 2, 32, 4);
+ encodeBuffer.encodeValue((unsigned int) datbyte, 1);
+ encodeBuffer.encodeCachedValue(GetULONG(datbuf,
bigEndian_), 29,
clientCache_.drawableCache,
9);
encodeBuffer.
- encodeCachedValue(GetULONG(buffer + 8, bigEndian_),
+ encodeCachedValue(GetULONG(datbuf + 4, bigEndian_),
29, clientCache_.gcCache, 9);
- const unsigned char *nextSrc = buffer + 12;
+ const unsigned char *nextSrc = datbuf + 8;
unsigned int index = 0;
unsigned int lastX = 0, lastY = 0;
- for (unsigned int i = 12; i < size; i += 4)
+ for (unsigned int i = 8; i < (datsiz<<2); i += 4)
{
unsigned int x = GetUINT(nextSrc, bigEndian_);
@@ -1028,21 +1046,20 @@
break;
case X_PolyLine:
{
- encodeBuffer.encodeValue(GetUINT(buffer + 2, bigEndian_) -
- 3, 16, 4);
- encodeBuffer.encodeValue((unsigned int) buffer[1], 1);
- encodeBuffer.encodeCachedValue(GetULONG(buffer + 4,
+ encodeBuffer.encodeValue(datsiz - 2, 32, 4);
+ encodeBuffer.encodeValue((unsigned int) datbyte, 1);
+ encodeBuffer.encodeCachedValue(GetULONG(datbuf,
bigEndian_), 29,
clientCache_.drawableCache,
9);
encodeBuffer.
- encodeCachedValue(GetULONG(buffer + 8, bigEndian_),
+ encodeCachedValue(GetULONG(datbuf + 4, bigEndian_),
29, clientCache_.gcCache, 9);
- const unsigned char *nextSrc = buffer + 12;
+ const unsigned char *nextSrc = datbuf + 8;
unsigned int index = 0;
unsigned int lastX = 0, lastY = 0;
- for (unsigned int i = 12; i < size; i += 4)
+ for (unsigned int i = 8; i < (datsiz<<2); i += 4)
{
unsigned int x = GetUINT(nextSrc, bigEndian_);
@@ -1071,17 +1088,15 @@
break;
case X_PolyRectangle:
{
- encodeBuffer.encodeValue((GetUINT(buffer + 2,
- bigEndian_) - 3) >> 1,
- 16, 3);
+ encodeBuffer.encodeValue((datsiz - 2) >> 1, 32, 3);
encodeBuffer.
- encodeCachedValue(GetULONG(buffer + 4, bigEndian_),
+ encodeCachedValue(GetULONG(datbuf, bigEndian_),
29, clientCache_.drawableCache, 9);
encodeBuffer.
- encodeCachedValue(GetULONG(buffer + 8, bigEndian_),
+ encodeCachedValue(GetULONG(datbuf + 4, bigEndian_),
29, clientCache_.gcCache, 9);
- const unsigned char *end = buffer + size;
- const unsigned char *nextSrc = buffer + 12;
+ const unsigned char *end = datbuf + (datsiz<<2);
+ const unsigned char *nextSrc = datbuf + 8;
while (nextSrc < end)
for (unsigned int i = 0; i < 4; i++)
@@ -1098,17 +1113,15 @@
break;
case X_PolySegment:
{
- encodeBuffer.encodeValue((GetUINT(buffer + 2,
- bigEndian_) - 3) >> 1,
- 16, 4);
+ encodeBuffer.encodeValue((datsiz - 2) >> 1, 32, 4);
encodeBuffer.
- encodeCachedValue(GetULONG(buffer + 4, bigEndian_),
+ encodeCachedValue(GetULONG(datbuf, bigEndian_),
29, clientCache_.drawableCache, 9);
encodeBuffer.
- encodeCachedValue(GetULONG(buffer + 8, bigEndian_),
+ encodeCachedValue(GetULONG(datbuf + 4, bigEndian_),
29, clientCache_.gcCache, 9);
- const unsigned char *end = buffer + size;
- const unsigned char *nextSrc = buffer + 12;
+ const unsigned char *end = datbuf + (datsiz<<2);
+ const unsigned char *nextSrc = datbuf + 8;
// unsigned int index = 0;
// unsigned int lastX1, lastY1, lastX2, lastY2;
@@ -1188,29 +1201,29 @@
break;
case X_PolyText8:
{
- encodeBuffer.encodeCachedValue(GetULONG(buffer + 4,
+ encodeBuffer.encodeCachedValue(GetULONG(datbuf,
bigEndian_), 29,
clientCache_.drawableCache,
9);
encodeBuffer.
- encodeCachedValue(GetULONG(buffer + 8, bigEndian_),
+ encodeCachedValue(GetULONG(datbuf + 4, bigEndian_),
29, clientCache_.gcCache, 9);
- unsigned int x = GetUINT(buffer + 12, bigEndian_);
+ unsigned int x = GetUINT(datbuf + 8, bigEndian_);
int xDiff = x - clientCache_.polyText8LastX;
clientCache_.polyText8LastX = x;
encodeBuffer.encodeCachedValue(xDiff, 16,
clientCache_.
polyText8CacheX, 8);
- unsigned int y = GetUINT(buffer + 14, bigEndian_);
+ unsigned int y = GetUINT(datbuf + 10, bigEndian_);
int yDiff = y - clientCache_.polyText8LastY;
clientCache_.polyText8LastY = y;
encodeBuffer.encodeCachedValue(yDiff, 16,
clientCache_.
polyText8CacheY, 8);
- const unsigned char *end = buffer + size - 1;
- const unsigned char *nextSrc = buffer + 16;
+ const unsigned char *end = datbuf + (datsiz<<2) - 1;
+ const unsigned char *nextSrc = datbuf + 12;
while (nextSrc < end)
{
@@ -1243,57 +1256,56 @@
break;
case X_PutImage:
{
- encodeBuffer.encodeValue(GetUINT(buffer + 2, bigEndian_),
- 16, 8);
- encodeBuffer.encodeValue((unsigned int) buffer[1], 2);
- encodeBuffer.encodeCachedValue(GetULONG(buffer + 4,
+ encodeBuffer.encodeValue(datsiz + 1, 32, 8);
+ encodeBuffer.encodeValue((unsigned int) datbyte, 2);
+ encodeBuffer.encodeCachedValue(GetULONG(datbuf,
bigEndian_), 29,
clientCache_.drawableCache,
9);
encodeBuffer.
- encodeCachedValue(GetULONG(buffer + 8, bigEndian_),
+ encodeCachedValue(GetULONG(datbuf + 4, bigEndian_),
29, clientCache_.gcCache, 9);
- unsigned int width = GetUINT(buffer + 12, bigEndian_);
+ unsigned int width = GetUINT(datbuf + 8, bigEndian_);
encodeBuffer.encodeCachedValue(width, 16,
clientCache_.
putImageWidthCache, 8);
- unsigned int height = GetUINT(buffer + 14, bigEndian_);
+ unsigned int height = GetUINT(datbuf + 10, bigEndian_);
encodeBuffer.encodeCachedValue(height, 16,
clientCache_.
putImageHeightCache, 8);
- unsigned int x = GetUINT(buffer + 16, bigEndian_);
+ unsigned int x = GetUINT(datbuf + 12, bigEndian_);
int xDiff = x - clientCache_.putImageLastX;
clientCache_.putImageLastX = x;
encodeBuffer.encodeCachedValue(xDiff, 16,
clientCache_.
putImageXCache, 8);
- unsigned int y = GetUINT(buffer + 18, bigEndian_);
+ unsigned int y = GetUINT(datbuf + 14, bigEndian_);
int yDiff = y - clientCache_.putImageLastY;
clientCache_.putImageLastY = y;
encodeBuffer.encodeCachedValue(yDiff, 16,
clientCache_.
putImageYCache, 8);
- encodeBuffer.encodeCachedValue(buffer[20], 8,
+ encodeBuffer.encodeCachedValue(datbuf[16], 8,
clientCache_.
putImageOffsetCache);
- encodeBuffer.encodeCachedValue(buffer[21], 8,
+ encodeBuffer.encodeCachedValue(datbuf[17], 8,
clientCache_.depthCache);
- const unsigned char *nextSrc = buffer + 24;
+ const unsigned char *nextSrc = datbuf + 20;
if (!compresser ||
(compresser->
- compressBuffer(nextSrc, size - 24,
+ compressBuffer(nextSrc, (datsiz<<2) - 20,
encodeBuffer) ==
NO_STREAM_COMPRESSION))
{
encodeBuffer.encodeValue(NO_STREAM_COMPRESSION,
COMPRESSION_TYPE_BITS);
- if ((buffer[1] == 0) && (height <= 32) &&
+ if ((datbyte == 0) && (height <= 32) &&
(width > height * PUT_IMAGE_MIN_ASPECT_RATIO))
{
// bitmap that probably contains text;
@@ -1303,8 +1315,8 @@
&& (bitmapBitOrder_ == 0))
{
unsigned char *next =
- (unsigned char *) buffer + 24;
- for (unsigned int i = 24; i < size; i++)
+ (unsigned char *) datbuf + 20;
+ for (unsigned int i = 20; i < ((datsiz)<<2); i++)
{
*next = REVERSED_BYTE[*next];
next++;
@@ -1315,7 +1327,7 @@
if (widthInBits < width)
widthInBits += scanlinePad_;
unsigned int widthInBytes = (widthInBits >> 3);
- const unsigned char *nextSrc = buffer + 24;
+ const unsigned char *nextSrc = datbuf + 20;
unsigned char srcMask = 0x80;
clientCache_.putImageLastPixels.reset();
@@ -1355,7 +1367,7 @@
}
}
}
- else if (buffer[1] == 0)
+ else if (datbyte == 0)
{
// bitmap--use "Modified-Modified-Read" FAX coding
if (width + 2 > clientCache_.putImageLineSize)
@@ -1378,7 +1390,7 @@
{
unsigned int codingLineLength = 0;
const unsigned char *nextSrc =
- buffer + 24 + h * widthInBytes;
+ datbuf + 20 + h * widthInBytes;
unsigned char nextSrcChar = *nextSrc;
if (h)
@@ -1640,9 +1652,9 @@
else
{
// pixmap, not bitmap
- if (buffer[21] == 8)
+ if (datbuf[17] == 8)
{
- for (unsigned int i = 24; i < size; i++)
+ for (unsigned int i = 20; i < ((datsiz)<<2); i++)
encodeBuffer.encodeCachedValue(*nextSrc++,
8,
clientCache_.
@@ -1651,7 +1663,7 @@
}
else
{
- for (unsigned int i = 24; i < size; i++)
+ for (unsigned int i = 20; i < ((datsiz)<<2); i++)
encodeBuffer.
encodeValue((unsigned int) *nextSrc++,
8);
@@ -1662,14 +1674,14 @@
break;
case X_QueryBestSize:
{
- encodeBuffer.encodeValue((unsigned int) buffer[1], 2);
- encodeBuffer.encodeCachedValue(GetULONG(buffer + 4,
+ encodeBuffer.encodeValue((unsigned int) datbyte, 2);
+ encodeBuffer.encodeCachedValue(GetULONG(datbuf,
bigEndian_), 29,
clientCache_.drawableCache,
9);
- encodeBuffer.encodeValue(GetUINT(buffer + 8, bigEndian_),
+ encodeBuffer.encodeValue(GetUINT(datbuf + 4, bigEndian_),
16, 8);
- encodeBuffer.encodeValue(GetUINT(buffer + 10, bigEndian_),
+ encodeBuffer.encodeValue(GetUINT(datbuf + 6, bigEndian_),
16, 8);
sequenceNumQueue_.push(clientCache_.
lastRequestSequenceNum, opcode);
@@ -1677,13 +1689,13 @@
break;
case X_QueryColors:
{
- unsigned int numColors = ((size - 8) >> 2);
+ unsigned int numColors = datsiz - 1;
- encodeBuffer.encodeValue(numColors, 16, 5);
+ encodeBuffer.encodeValue(numColors, 32, 5);
encodeBuffer.
- encodeCachedValue(GetULONG(buffer + 4, bigEndian_),
+ encodeCachedValue(GetULONG(datbuf, bigEndian_),
29, clientCache_.colormapCache, 9);
- const unsigned char *nextSrc = buffer + 8;
+ const unsigned char *nextSrc = datbuf + 4;
unsigned int predictedPixel =
clientCache_.queryColorsLastPixel;
for (unsigned int i = 0; i < numColors; i++)
@@ -1708,10 +1720,10 @@
break;
case X_QueryExtension:
{
- unsigned int nameLength = GetUINT(buffer + 4, bigEndian_);
+ unsigned int nameLength = GetUINT(datbuf, bigEndian_);
encodeBuffer.encodeValue(nameLength, 16, 6);
- const unsigned char *nextSrc = buffer + 8;
+ const unsigned char *nextSrc = datbuf + 4;
for (; nameLength; nameLength--)
encodeBuffer.encodeValue((unsigned int) *nextSrc++,
@@ -1722,7 +1734,7 @@
break;
case X_QueryFont:
{
- unsigned int font = GetULONG(buffer + 4, bigEndian_);
+ unsigned int font = GetULONG(datbuf, bigEndian_);
encodeBuffer.encodeValue(font - clientCache_.lastFont, 29,
5);
@@ -1733,23 +1745,23 @@
break;
case X_SetClipRectangles:
{
- unsigned int numRectangles = ((size - 12) >> 3);
+ unsigned int numRectangles = ((datsiz-2) >> 1);
encodeBuffer.encodeValue(numRectangles, 13, 4);
- encodeBuffer.encodeValue((unsigned int) buffer[1], 2);
+ encodeBuffer.encodeValue((unsigned int) datbyte, 2);
encodeBuffer.
- encodeCachedValue(GetULONG(buffer + 4, bigEndian_),
+ encodeCachedValue(GetULONG(datbuf, bigEndian_),
29, clientCache_.gcCache, 9);
encodeBuffer.
- encodeCachedValue(GetUINT(buffer + 8, bigEndian_), 16,
+ encodeCachedValue(GetUINT(datbuf + 4, bigEndian_), 16,
clientCache_.
setClipRectanglesXCache, 8);
encodeBuffer.
- encodeCachedValue(GetUINT(buffer + 10, bigEndian_),
+ encodeCachedValue(GetUINT(datbuf + 6, bigEndian_),
16,
clientCache_.
setClipRectanglesYCache, 8);
- const unsigned char *nextSrc = buffer + 12;
+ const unsigned char *nextSrc = datbuf + 8;
for (unsigned int i = 0; i < numRectangles; i++)
{
@@ -1768,19 +1780,19 @@
break;
case X_SetDashes:
{
- unsigned int numDashes = GetUINT(buffer + 10, bigEndian_);
+ unsigned int numDashes = GetUINT(datbuf + 6, bigEndian_);
encodeBuffer.encodeCachedValue(numDashes, 16,
clientCache_.
setDashesLengthCache, 5);
encodeBuffer.
- encodeCachedValue(GetULONG(buffer + 4, bigEndian_),
+ encodeCachedValue(GetULONG(datbuf, bigEndian_),
29, clientCache_.gcCache, 9);
encodeBuffer.
- encodeCachedValue(GetUINT(buffer + 8, bigEndian_), 16,
+ encodeCachedValue(GetUINT(datbuf + 4, bigEndian_), 16,
clientCache_.setDashesOffsetCache,
5);
- const unsigned char *nextSrc = buffer + 12;
+ const unsigned char *nextSrc = datbuf + 8;
for (unsigned int i = 0; i < numDashes; i++)
encodeBuffer.encodeCachedValue(*nextSrc++, 8,
@@ -1793,17 +1805,17 @@
case X_SetSelectionOwner:
{
encodeBuffer.
- encodeCachedValue(GetULONG(buffer + 4, bigEndian_),
+ encodeCachedValue(GetULONG(datbuf, bigEndian_),
29,
clientCache_.setSelectionOwnerCache,
9);
encodeBuffer.
- encodeCachedValue(GetULONG(buffer + 8, bigEndian_),
+ encodeCachedValue(GetULONG(datbuf + 4, bigEndian_),
29,
clientCache_.
getSelectionOwnerSelectionCache, 9);
encodeBuffer.
- encodeCachedValue(GetULONG(buffer + 12, bigEndian_),
+ encodeCachedValue(GetULONG(datbuf + 8, bigEndian_),
32,
clientCache_.
setSelectionOwnerTimestampCache, 9);
@@ -1812,22 +1824,22 @@
case X_TranslateCoords:
{
encodeBuffer.
- encodeCachedValue(GetULONG(buffer + 4, bigEndian_),
+ encodeCachedValue(GetULONG(datbuf, bigEndian_),
29,
clientCache_.
translateCoordsSrcCache, 9);
encodeBuffer.
- encodeCachedValue(GetULONG(buffer + 8, bigEndian_),
+ encodeCachedValue(GetULONG(datbuf + 4, bigEndian_),
29,
clientCache_.
translateCoordsDestCache, 9);
encodeBuffer.
- encodeCachedValue(GetUINT(buffer + 12, bigEndian_),
+ encodeCachedValue(GetUINT(datbuf + 8, bigEndian_),
16,
clientCache_.translateCoordsXCache,
8);
encodeBuffer.
- encodeCachedValue(GetUINT(buffer + 14, bigEndian_),
+ encodeCachedValue(GetUINT(datbuf + 10, bigEndian_),
16,
clientCache_.translateCoordsYCache,
8);
@@ -1837,10 +1849,9 @@
break;
default:
{
- encodeBuffer.encodeValue((unsigned int) buffer[1], 8);
- encodeBuffer.encodeValue(GetUINT(buffer + 2, bigEndian_),
- 16, 8);
- const unsigned char *nextSrc = buffer + 4;
+ encodeBuffer.encodeValue((unsigned int) datbyte, 8);
+ encodeBuffer.encodeValue(buffer2, 16, 8);
+ const unsigned char *nextSrc = datbuf;
for (unsigned int i = 4; i < size; i++)
encodeBuffer.encodeValue((unsigned int) *nextSrc++,
--- ClientReadBuffer.C-prePSz 2007-02-03 01:25:48.000000000 +1100
+++ ClientReadBuffer.C 2014-10-20 06:23:51.000000000 +1100
@@ -29,6 +29,21 @@
else
{
dataLength = (GetUINT(start + 2, bigEndian_) << 2);
+ if (dataLength == 0)
+ {
+ // BIG-REQUESTS extension
+ if (size < 8)
+ return 0;
+ dataLength = (GetULONG(start + 4, bigEndian_) << 2);
+ if (dataLength < 8 || dataLength > 1024*1024*1024)
+ {
+ CERR << "BIG-REQUEST with unacceptable dataLength=" << dataLength << ENDL;
+ }
+ else if (dataLength < 4*64*1024)
+ {
+ CERR << "BIG-REQUEST with silly dataLength=" << dataLength << ENDL;
+ }
+ }
}
if (size < dataLength)
--- ServerChannel.C-prePSz 2007-02-03 01:25:48.000000000 +1100
+++ ServerChannel.C 2014-10-20 06:25:42.000000000 +1100
@@ -1302,6 +1302,9 @@
clientCache_.lastRequestSequenceNum++;
unsigned char *outputMessage;
unsigned int outputLength;
+ // outputMessage and outputLength include the 4-byte header,
+ // just "right"(?) for the "plain" (not BIG-REQUESTS) case;
+ // but somewhat unlike the code in ClientChannel.
unsigned int value; // general-purpose temp variable for decoding ints
unsigned char cValue; // general-purpose temp variable for decoding chars
@@ -1863,7 +1866,7 @@
{
unsigned int numPixels;
- decodeBuffer.decodeValue(numPixels, 16, 4);
+ decodeBuffer.decodeValue(numPixels, 32, 4);
outputLength = 12 + (numPixels << 2);
outputMessage = writeBuffer_.addMessage(outputLength);
decodeBuffer.decodeCachedValue(value, 29,
@@ -2308,7 +2311,7 @@
{
unsigned int numPoints;
- decodeBuffer.decodeValue(numPoints, 16, 4);
+ decodeBuffer.decodeValue(numPoints, 32, 4);
outputLength = (numPoints << 2) + 12;
outputMessage = writeBuffer_.addMessage(outputLength);
unsigned int relativeCoordMode;
@@ -2350,7 +2353,7 @@
{
unsigned int numPoints;
- decodeBuffer.decodeValue(numPoints, 16, 4);
+ decodeBuffer.decodeValue(numPoints, 32, 4);
outputLength = (numPoints << 2) + 12;
outputMessage = writeBuffer_.addMessage(outputLength);
unsigned int relativeCoordMode;
@@ -2392,7 +2395,7 @@
{
unsigned int numRectangles;
- decodeBuffer.decodeValue(numRectangles, 16, 3);
+ decodeBuffer.decodeValue(numRectangles, 32, 3);
outputLength = (numRectangles << 3) + 12;
outputMessage = writeBuffer_.addMessage(outputLength);
decodeBuffer.decodeCachedValue(value, 29,
@@ -2420,7 +2423,7 @@
{
unsigned int numSegments;
- decodeBuffer.decodeValue(numSegments, 16, 4);
+ decodeBuffer.decodeValue(numSegments, 32, 4);
outputLength = (numSegments << 3) + 12;
outputMessage = writeBuffer_.addMessage(outputLength);
decodeBuffer.decodeCachedValue(value, 29,
@@ -2555,7 +2558,7 @@
break;
case X_PutImage:
{
- decodeBuffer.decodeValue(value, 16, 8);
+ decodeBuffer.decodeValue(value, 32, 8);
outputLength = (value << 2);
outputMessage = writeBuffer_.addMessage(outputLength);
decodeBuffer.decodeValue(value, 2);
@@ -2979,7 +2982,7 @@
{
unsigned int numColors;
- decodeBuffer.decodeValue(numColors, 16, 5);
+ decodeBuffer.decodeValue(numColors, 32, 5);
outputLength = (numColors << 2) + 8;
outputMessage = writeBuffer_.addMessage(outputLength);
decodeBuffer.decodeCachedValue(value, 29,
@@ -3183,7 +3186,18 @@
}
}
*outputMessage = (unsigned char) opcode;
- PutUINT(outputLength >> 2, outputMessage + 2, bigEndian_);
+ if (outputLength < 4*64*1024)
+ PutUINT(outputLength >> 2, outputMessage + 2, bigEndian_);
+ else
+ {
+ // Handle BIG-REQUEST
+ PutUINT(0, outputMessage + 2, bigEndian_);
+ // Write first four bytes
+ if (WriteAll(fd_, writeBuffer_.getData(), 4) < 0)
+ return 0;
+ // Replace with new 4-byte length
+ PutULONG(1 + (outputLength >> 2), outputMessage, bigEndian_);
+ }
}
}