diff options
Diffstat (limited to 'debian/patches')
-rw-r--r-- | debian/patches/401_nxcomp_big-requests.full+lite.patch | 453 | ||||
-rw-r--r-- | debian/patches/series | 1 |
2 files changed, 0 insertions, 454 deletions
diff --git a/debian/patches/401_nxcomp_big-requests.full+lite.patch b/debian/patches/401_nxcomp_big-requests.full+lite.patch deleted file mode 100644 index ede490d0c..000000000 --- a/debian/patches/401_nxcomp_big-requests.full+lite.patch +++ /dev/null @@ -1,453 +0,0 @@ ---- a/nxcomp/ClientChannel.cpp -+++ b/nxcomp/ClientChannel.cpp -@@ -447,6 +447,26 @@ - } - } - -+ // Get other bits of the header, so will not need to refer to them again -+ unsigned char inputDataByte = inputMessage[1]; -+ unsigned int buffer2 = GetUINT(inputMessage + 2, bigEndian_); -+ unsigned int inputDataSize = buffer2 - 1; -+ if (buffer2 == 0) -+ { -+ // BIG-REQUESTS -+ inputMessage += 4; -+ inputLength -= 4; -+ inputDataSize = GetULONG(inputMessage, bigEndian_) - 2; -+ } -+ if (inputLength != (4 * (inputDataSize + 1))) -+ { -+ #ifdef WARNING -+ *logofs << "handleRead: inputLength=" << inputLength -+ << " mismatch inputDataSize=" << inputDataSize -+ << ".\n" << logofs_flush; -+ #endif -+ } -+ - // - // Go to the message's specific encoding. - // -@@ -501,8 +521,36 @@ - encodeBuffer.encodeCachedValue(format, 8, - clientCache_ -> changePropertyFormatCache); - unsigned int dataLength = GetULONG(inputMessage + 20, bigEndian_); -+ -+ // Self-preserving sanity check (otherwise we crash and dump core): -+ // some clients do this when not getting their beloved BIG-REQUESTS. -+ unsigned int maxLength = 0; -+ if (format == 8) -+ { -+ maxLength = inputLength - 24; -+ } -+ else if (format == 32) -+ { -+ maxLength = (inputLength - 24) >> 2; -+ } -+ else if (format == 16) -+ { -+ maxLength = (inputLength - 24) >> 1; -+ } -+ if (dataLength > maxLength) -+ { -+ #ifdef WARNING -+ *logofs << "ChangeProperty bogus dataLength=" << dataLength -+ << " set to " << maxLength -+ << " when format=" << (int)format -+ << " inputLength=" << inputLength -+ << ".\n" << logofs_flush; -+ #endif -+ dataLength = maxLength; -+ } -+ - encodeBuffer.encodeValue(dataLength, 32, 6); -- encodeBuffer.encodeValue(inputMessage[1], 2); -+ encodeBuffer.encodeValue(inputDataByte, 2); - encodeBuffer.encodeXidValue(GetULONG(inputMessage + 4, bigEndian_), - clientCache_ -> windowCache); - encodeBuffer.encodeCachedValue(GetULONG(inputMessage + 8, bigEndian_), 29, -@@ -533,7 +581,7 @@ - nextSrc += 4; - } - } -- else -+ else if (format == 16) - { - for (unsigned int i = 0; i < dataLength; i++) - { -@@ -541,6 +589,13 @@ - nextSrc += 2; - } - } -+ else -+ { -+ #ifdef WARNING -+ *logofs << "ChangeProperty bogus format=" << (int)format -+ << ".\n" << logofs_flush; -+ #endif -+ } - } - break; - case X_SendEvent: -@@ -562,7 +617,7 @@ - break; - } - -- encodeBuffer.encodeBoolValue((unsigned int) inputMessage[1]); -+ encodeBuffer.encodeBoolValue((unsigned int) inputDataByte); - unsigned int window = GetULONG(inputMessage + 4, bigEndian_); - - if (window == 0 || window == 1) -@@ -599,7 +654,7 @@ - break; - case X_ChangeWindowAttributes: - { -- encodeBuffer.encodeValue((inputLength - 12) >> 2, 4); -+ encodeBuffer.encodeValue(inputDataSize - 2, 4); - encodeBuffer.encodeXidValue(GetULONG(inputMessage + 4, bigEndian_), - clientCache_ -> windowCache); - unsigned int bitmask = GetULONG(inputMessage + 8, bigEndian_); -@@ -654,7 +709,7 @@ - break; - } - -- encodeBuffer.encodeBoolValue((unsigned int) inputMessage[1]); -+ encodeBuffer.encodeBoolValue((unsigned int) inputDataByte); - encodeBuffer.encodeXidValue(GetULONG(inputMessage + 4, bigEndian_), - clientCache_ -> windowCache); - const unsigned char *nextSrc = inputMessage + 8; -@@ -1000,12 +1055,12 @@ - { - #ifdef TARGETS - -- *logofs << "handleRead: X_CreatePixmap depth " << (unsigned) inputMessage[1] -+ *logofs << "handleRead: X_CreatePixmap depth " << (unsigned) inputDataByte - << ", pixmap id " << GetULONG(inputMessage + 4, bigEndian_) - << ", drawable " << GetULONG(inputMessage + 8, bigEndian_) - << ", width " << GetUINT(inputMessage + 12, bigEndian_) - << ", height " << GetUINT(inputMessage + 14, bigEndian_) -- << ", size " << GetUINT(inputMessage + 2, bigEndian_) << 2 -+ << ", length " << inputLength - << ".\n" << logofs_flush; - - unsigned int p_id = GetULONG(inputMessage + 4, bigEndian_); -@@ -1054,7 +1109,7 @@ - #endif - - unsigned bitmask = GetULONG(inputMessage + 28, bigEndian_); -- encodeBuffer.encodeCachedValue((unsigned int) inputMessage[1], 8, -+ encodeBuffer.encodeCachedValue((unsigned int) inputDataByte, 8, - clientCache_ -> depthCache); - encodeBuffer.encodeXidValue(GetULONG(inputMessage + 8, bigEndian_), - clientCache_ -> windowCache); -@@ -1138,7 +1193,7 @@ - break; - } - -- unsigned int numPoints = ((inputLength - 16) >> 2); -+ unsigned int numPoints = (inputDataSize - 3); - - if (control -> isProtoStep10() == 1) - { -@@ -1209,7 +1264,7 @@ - break; - case X_FreeColors: - { -- unsigned int numPixels = GetUINT(inputMessage + 2, bigEndian_) - 3; -+ unsigned int numPixels = inputDataSize - 2; - encodeBuffer.encodeValue(numPixels, 16, 4); - encodeBuffer.encodeCachedValue(GetULONG(inputMessage + 4, bigEndian_), 29, - clientCache_ -> colormapCache); -@@ -1378,7 +1433,7 @@ - break; - } - -- encodeBuffer.encodeBoolValue((unsigned int) inputMessage[1]); -+ encodeBuffer.encodeBoolValue((unsigned int) inputDataByte); - encodeBuffer.encodeXidValue(GetULONG(inputMessage + 4, bigEndian_), - clientCache_ -> windowCache); - unsigned int property = GetULONG(inputMessage + 8, bigEndian_); -@@ -1404,7 +1459,7 @@ - break; - case X_GrabButton: - { -- encodeBuffer.encodeBoolValue((unsigned int) inputMessage[1]); -+ encodeBuffer.encodeBoolValue((unsigned int) inputDataByte); - encodeBuffer.encodeXidValue(GetULONG(inputMessage + 4, bigEndian_), - clientCache_ -> windowCache); - encodeBuffer.encodeCachedValue(GetUINT(inputMessage + 8, bigEndian_), 16, -@@ -1423,7 +1478,7 @@ - break; - case X_GrabPointer: - { -- encodeBuffer.encodeBoolValue((unsigned int) inputMessage[1]); -+ encodeBuffer.encodeBoolValue((unsigned int) inputDataByte); - encodeBuffer.encodeXidValue(GetULONG(inputMessage + 4, bigEndian_), - clientCache_ -> windowCache); - encodeBuffer.encodeCachedValue(GetUINT(inputMessage + 8, bigEndian_), 16, -@@ -1448,7 +1503,7 @@ - break; - case X_GrabKeyboard: - { -- encodeBuffer.encodeBoolValue((unsigned int) inputMessage[1]); -+ encodeBuffer.encodeBoolValue((unsigned int) inputDataByte); - encodeBuffer.encodeXidValue(GetULONG(inputMessage + 4, bigEndian_), - clientCache_ -> windowCache); - unsigned int timestamp = GetULONG(inputMessage + 8, bigEndian_); -@@ -1673,7 +1728,7 @@ - break; - } - -- unsigned int textLength = (unsigned int) inputMessage[1]; -+ unsigned int textLength = (unsigned int) inputDataByte; - encodeBuffer.encodeCachedValue(textLength, 8, - clientCache_ -> imageTextLengthCache, 4); - encodeBuffer.encodeXidValue(GetULONG(inputMessage + 4, -@@ -1740,7 +1795,7 @@ - break; - } - -- unsigned int textLength = (unsigned int) inputMessage[1]; -+ unsigned int textLength = (unsigned int) inputDataByte; - encodeBuffer.encodeCachedValue(textLength, 8, - clientCache_ -> imageTextLengthCache, 4); - encodeBuffer.encodeXidValue(GetULONG(inputMessage + 4, -@@ -1797,7 +1852,7 @@ - - unsigned int nameLength = GetUINT(inputMessage + 4, bigEndian_); - encodeBuffer.encodeValue(nameLength, 16, 6); -- encodeBuffer.encodeBoolValue((unsigned int) inputMessage[1]); -+ encodeBuffer.encodeBoolValue((unsigned int) inputDataByte); - const unsigned char *nextSrc = inputMessage + 8; - - if (control -> isProtoStep7() == 1) -@@ -2269,8 +2324,8 @@ - break; - } - -- encodeBuffer.encodeValue(GetUINT(inputMessage + 2, bigEndian_) - 3, 16, 4); -- encodeBuffer.encodeBoolValue((unsigned int) inputMessage[1]); -+ encodeBuffer.encodeValue(inputDataSize - 2, 32, 4); -+ encodeBuffer.encodeBoolValue((unsigned int) inputDataByte); - encodeBuffer.encodeXidValue(GetULONG(inputMessage + 4, bigEndian_), - clientCache_ -> drawableCache); - encodeBuffer.encodeXidValue(GetULONG(inputMessage + 8, bigEndian_), -@@ -2336,8 +2391,8 @@ - break; - } - -- encodeBuffer.encodeValue(GetUINT(inputMessage + 2, bigEndian_) - 3, 16, 4); -- encodeBuffer.encodeBoolValue((unsigned int) inputMessage[1]); -+ encodeBuffer.encodeValue(inputDataSize - 2, 32, 4); -+ encodeBuffer.encodeBoolValue((unsigned int) inputDataByte); - encodeBuffer.encodeXidValue(GetULONG(inputMessage + 4, - bigEndian_), clientCache_ -> drawableCache); - encodeBuffer.encodeXidValue(GetULONG(inputMessage + 8, -@@ -2370,8 +2425,7 @@ - break; - case X_PolyRectangle: - { -- encodeBuffer.encodeValue((GetUINT(inputMessage + 2, -- bigEndian_) - 3) >> 1, 16, 3); -+ encodeBuffer.encodeValue((inputDataSize - 2) >> 1, 32, 3); - encodeBuffer.encodeXidValue(GetULONG(inputMessage + 4, - bigEndian_), clientCache_ -> drawableCache); - encodeBuffer.encodeXidValue(GetULONG(inputMessage + 8, -@@ -2424,8 +2478,7 @@ - break; - } - -- encodeBuffer.encodeValue((GetUINT(inputMessage + 2, -- bigEndian_) - 3) >> 1, 16, 4); -+ encodeBuffer.encodeValue((inputDataSize - 2) >> 1, 32, 4); - encodeBuffer.encodeXidValue(GetULONG(inputMessage + 4, - bigEndian_), clientCache_ -> drawableCache); - encodeBuffer.encodeXidValue(GetULONG(inputMessage + 8, -@@ -2522,7 +2575,7 @@ - break; - case X_QueryBestSize: - { -- encodeBuffer.encodeValue((unsigned int)inputMessage[1], 2); -+ encodeBuffer.encodeValue((unsigned int)inputDataByte, 2); - encodeBuffer.encodeXidValue(GetULONG(inputMessage + 4, - bigEndian_), clientCache_ -> drawableCache); - encodeBuffer.encodeValue(GetUINT(inputMessage + 8, bigEndian_), 16, 8); -@@ -2538,7 +2591,7 @@ - // Differential encoding. - encodeBuffer.encodeBoolValue(1); - -- unsigned int numColors = ((inputLength - 8) >> 2); -+ unsigned int numColors = (inputDataSize - 1); - encodeBuffer.encodeValue(numColors, 16, 5); - encodeBuffer.encodeCachedValue(GetULONG(inputMessage + 4, bigEndian_), 29, - clientCache_ -> colormapCache); -@@ -2636,7 +2689,7 @@ - break; - } - -- unsigned int numRectangles = ((inputLength - 12) >> 3); -+ unsigned int numRectangles = ((inputDataSize - 2) >> 1); - - if (control -> isProtoStep9() == 1) - { -@@ -2647,7 +2700,7 @@ - encodeBuffer.encodeValue(numRectangles, 13, 4); - } - -- encodeBuffer.encodeValue((unsigned int) inputMessage[1], 2); -+ encodeBuffer.encodeValue((unsigned int) inputDataByte, 2); - encodeBuffer.encodeXidValue(GetULONG(inputMessage + 4, bigEndian_), - clientCache_ -> gcCache); - encodeBuffer.encodeCachedValue(GetUINT(inputMessage + 8, bigEndian_), 16, -@@ -2802,7 +2855,7 @@ - } - - // Format. -- encodeBuffer.encodeValue((unsigned int) inputMessage[1], 2); -+ encodeBuffer.encodeValue((unsigned int) inputDataByte, 2); - // Drawable. - encodeBuffer.encodeXidValue(GetULONG(inputMessage + 4, - bigEndian_), clientCache_ -> drawableCache); -@@ -3004,7 +3057,7 @@ - << ".\n" << logofs_flush; - #endif - -- encodeBuffer.encodeCachedValue(*(inputMessage + 1), 8, -+ encodeBuffer.encodeCachedValue(inputDataByte, 8, - clientCache_ -> resourceCache); - } - else if (inputOpcode == opcodeStore_ -> freeUnpack) -@@ -3015,7 +3068,7 @@ - << ".\n" << logofs_flush; - #endif - -- encodeBuffer.encodeCachedValue(*(inputMessage + 1), 8, -+ encodeBuffer.encodeCachedValue(inputDataByte, 8, - clientCache_ -> resourceCache); - } - else if (inputOpcode == opcodeStore_ -> getControlParameters) -@@ -3198,10 +3251,10 @@ - { - if (hit) - { -- statistics -> addRenderCachedRequest(*(inputMessage + 1)); -+ statistics -> addRenderCachedRequest(inputDataByte); - } - -- statistics -> addRenderRequestBits(*(inputMessage + 1), inputLength << 3, bits); -+ statistics -> addRenderRequestBits(inputDataByte, inputLength << 3, bits); - } - - } // End if (firstRequest_)... else ... ---- a/nxcomp/ClientReadBuffer.cpp -+++ b/nxcomp/ClientReadBuffer.cpp -@@ -119,15 +119,32 @@ - - dataLength = (GetUINT(start + 2, bigEndian_) << 2); - -- if (dataLength < 4) -+ if (dataLength == 0) // or equivalently (dataLength < 4) - { -- #ifdef TEST -- *logofs << "ClientReadBuffer: WARNING! Assuming length 4 " -- << "for suspicious message of length " << dataLength -- << ".\n" << logofs_flush; -- #endif -+ // BIG-REQUESTS extension -+ if (size < 8) -+ { -+ remaining_ = 8 - size; -+ return 0; -+ } - -- dataLength = 4; -+ dataLength = (GetULONG(start + 4, bigEndian_) << 2); -+ -+ if (dataLength < 8 || dataLength > 1024*1024*1024) -+ { -+ #ifdef WARNING -+ *logofs << "BIG-REQUESTS with unacceptable dataLength=" -+ << dataLength << ", now set to 8.\n" << logofs_flush; -+ #endif -+ dataLength = 8; -+ } -+ else if (dataLength < 4*64*1024) -+ { -+ #ifdef WARNING -+ *logofs << "BIG-REQUESTS with silly dataLength=" -+ << dataLength << ".\n" << logofs_flush; -+ #endif -+ } - } - } - ---- a/nxcomp/ServerChannel.cpp -+++ b/nxcomp/ServerChannel.cpp -@@ -104,7 +104,8 @@ - // - - #define HIDE_MIT_SHM_EXTENSION --#define HIDE_BIG_REQUESTS_EXTENSION -+// HIDE_BIG_REQUESTS_EXTENSION : No good to hide, some clients may send crap instead... -+#undef HIDE_BIG_REQUESTS_EXTENSION - #define HIDE_XFree86_Bigfont_EXTENSION - #undef HIDE_SHAPE_EXTENSION - #undef HIDE_XKEYBOARD_EXTENSION -@@ -3756,7 +3757,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; -@@ -3802,7 +3803,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; -@@ -3839,7 +3840,7 @@ - case X_PolyRectangle: - { - unsigned int numRectangles; -- decodeBuffer.decodeValue(numRectangles, 16, 3); -+ decodeBuffer.decodeValue(numRectangles, 32, 3); - outputLength = (numRectangles << 3) + 12; - outputMessage = writeBuffer_.addMessage(outputLength); - decodeBuffer.decodeXidValue(value, clientCache_ -> drawableCache); -@@ -3869,7 +3870,7 @@ - } - - unsigned int numSegments; -- decodeBuffer.decodeValue(numSegments, 16, 4); -+ decodeBuffer.decodeValue(numSegments, 32, 4); - outputLength = (numSegments << 3) + 12; - outputMessage = writeBuffer_.addMessage(outputLength); - decodeBuffer.decodeXidValue(value, clientCache_ -> drawableCache); -@@ -4590,7 +4591,21 @@ - - *outputMessage = (unsigned char) outputOpcode; - -- PutUINT(outputLength >> 2, outputMessage + 2, bigEndian_); -+ if (outputLength < 4*64*1024) -+ PutUINT(outputLength >> 2, outputMessage + 2, bigEndian_); -+ else -+ { -+ // Handle BIG-REQUESTS -+ PutUINT(0, outputMessage + 2, bigEndian_); -+// BUG ALERT: following write may not work well, -+// particularly with un-flushed messages. -+// But, it works well enough in my testing... -+ // Write first four bytes -+ if (transport_ -> write(write_immediate, outputMessage, 4) < 0) -+ return -1; -+ // Replace with new 4-byte length -+ PutULONG(1 + (outputLength >> 2), outputMessage, bigEndian_); -+ } - - #if defined(TEST) || defined(OPCODES) - *logofs << "handleWrite: Handled request OPCODE#" diff --git a/debian/patches/series b/debian/patches/series index 899fde99f..640aa2514 100644 --- a/debian/patches/series +++ b/debian/patches/series @@ -62,7 +62,6 @@ 302_nx-X11_xkbbasedir-detection.full.patch 320_nxagent_configurable-keystrokes.full.patch 400_nxcomp-version.full+lite.patch -401_nxcomp_big-requests.full+lite.patch 600_nx-X11+nxcompext+nxcompshad_unique-libnames.full.patch 601_nx-X11_build-option-changes-to-not-use-bundled-libraries.full.patch 602_nx-X11_initgroups.full.patch |