libfreerdp-codec: fix handling of PACKET_AT_FRONT, PACKET_FLUSHED in MPPC compression
authorMarc-André Moreau <marcandre.moreau@gmail.com>
Mon, 21 Apr 2014 01:28:09 +0000 (21:28 -0400)
committerMarc-André Moreau <marcandre.moreau@gmail.com>
Mon, 21 Apr 2014 01:28:09 +0000 (21:28 -0400)
include/freerdp/codec/mppc.h
libfreerdp/codec/mppc.c
libfreerdp/codec/test/TestFreeRDPCodecMppc.c
libfreerdp/core/bulk.c
libfreerdp/core/bulk.h
libfreerdp/core/fastpath.c
server/Sample/server.crt
server/Sample/server.key
server/Sample/sfreerdp.c

index d7112a4..6577e62 100644 (file)
@@ -46,7 +46,7 @@ typedef struct _MPPC_CONTEXT MPPC_CONTEXT;
 extern "C" {
 #endif
 
-FREERDP_API int mppc_compress(MPPC_CONTEXT* mppc, BYTE* pSrcData, UINT32 SrcSize, BYTE* pDstData, UINT32* pDstSize, UINT32* pFlags);
+FREERDP_API int mppc_compress(MPPC_CONTEXT* mppc, BYTE* pSrcData, UINT32 SrcSize, BYTE** ppDstData, UINT32* pDstSize, UINT32* pFlags);
 FREERDP_API int mppc_decompress(MPPC_CONTEXT* mppc, BYTE* pSrcData, UINT32 SrcSize, BYTE** ppDstData, UINT32* pDstSize, UINT32 flags);
 
 FREERDP_API void mppc_set_compression_level(MPPC_CONTEXT* mppc, DWORD CompressionLevel);
index 0b8abbf..d234472 100644 (file)
@@ -458,14 +458,18 @@ int mppc_decompress(MPPC_CONTEXT* mppc, BYTE* pSrcData, UINT32 SrcSize, BYTE** p
        return 1;
 }
 
-int mppc_compress(MPPC_CONTEXT* mppc, BYTE* pSrcData, UINT32 SrcSize, BYTE* pDstData, UINT32* pDstSize, UINT32* pFlags)
+int mppc_compress(MPPC_CONTEXT* mppc, BYTE* pSrcData, UINT32 SrcSize, BYTE** ppDstData, UINT32* pDstSize, UINT32* pFlags)
 {
        BYTE* pSrcPtr;
        BYTE* pSrcEnd;
        BYTE* pDstEnd;
        BYTE* MatchPtr;
+       UINT32 DstSize;
+       BYTE* pDstData;
        UINT32 MatchIndex;
        UINT32 accumulator;
+       BOOL PacketFlushed;
+       BOOL PacketAtFront;
        DWORD CopyOffset;
        DWORD LengthOfMatch;
        BYTE* HistoryBuffer;
@@ -483,23 +487,41 @@ int mppc_compress(MPPC_CONTEXT* mppc, BYTE* pSrcData, UINT32 SrcSize, BYTE* pDst
        HistoryPtr = mppc->HistoryPtr;
        HistoryOffset = mppc->HistoryOffset;
 
-       BitStream_Attach(bs, pDstData, SrcSize);
+       *pFlags = 0;
+       PacketFlushed = FALSE;
 
        if (((HistoryOffset + SrcSize) < (HistoryBufferSize - 3)) && HistoryOffset)
        {
-               *pFlags = 0;
+               PacketAtFront = FALSE;
        }
        else
        {
+               if (HistoryOffset == (HistoryBufferSize + 1))
+                       PacketFlushed = TRUE;
+
                HistoryOffset = 0;
-               *pFlags = PACKET_AT_FRONT;
+               PacketAtFront = TRUE;
        }
 
        HistoryPtr = &(HistoryBuffer[HistoryOffset]);
 
+       pDstData = *ppDstData;
+
+       if (!pDstData)
+               return -1;
+
+       DstSize = *pDstSize;
+
+       if (DstSize < SrcSize)
+               return -1;
+
+       DstSize = SrcSize;
+
+       BitStream_Attach(bs, pDstData, DstSize);
+
        pSrcPtr = pSrcData;
        pSrcEnd = &(pSrcData[SrcSize - 1]);
-       pDstEnd = &(pDstData[*pDstSize - 1]);
+       pDstEnd = &(pDstData[DstSize - 1]);
 
        while (pSrcPtr < (pSrcEnd - 2))
        {
@@ -522,11 +544,14 @@ int mppc_compress(MPPC_CONTEXT* mppc, BYTE* pSrcData, UINT32 SrcSize, BYTE* pDst
                                (&MatchPtr[1] > mppc->HistoryPtr) || (MatchPtr == HistoryBuffer) ||
                                (MatchPtr == (HistoryPtr - 1)) || (MatchPtr == HistoryPtr))
                {
-                       if ((((bs->position + 7) / 8) + 2) > (*pDstSize - 1))
+                       if (((bs->position / 8) + 2) > (DstSize - 1))
                        {
-                               *pFlags |= PACKET_FLUSHED;
                                ZeroMemory(HistoryBuffer, HistoryBufferSize);
                                ZeroMemory(mppc->MatchBuffer, sizeof(mppc->MatchBuffer));
+                               mppc->HistoryOffset = HistoryBufferSize + 1;
+                               *pFlags |= PACKET_FLUSHED;
+                               *pFlags |= CompressionLevel;
+                               *ppDstData = pSrcData;
                                *pDstSize = SrcSize;
                                return 1;
                        }
@@ -573,11 +598,14 @@ int mppc_compress(MPPC_CONTEXT* mppc, BYTE* pSrcData, UINT32 SrcSize, BYTE* pDst
 
                        /* Encode CopyOffset */
 
-                       if ((((bs->position + 7) / 8) + 7) > (*pDstSize - 1))
+                       if (((bs->position / 8) + 7) > (DstSize - 1))
                        {
-                               *pFlags = PACKET_FLUSHED;
                                ZeroMemory(HistoryBuffer, HistoryBufferSize);
                                ZeroMemory(mppc->MatchBuffer, sizeof(mppc->MatchBuffer));
+                               mppc->HistoryOffset = HistoryBufferSize + 1;
+                               *pFlags |= PACKET_FLUSHED;
+                               *pFlags |= CompressionLevel;
+                               *ppDstData = pSrcData;
                                *pDstSize = SrcSize;
                                return 1;
                        }
@@ -729,11 +757,14 @@ int mppc_compress(MPPC_CONTEXT* mppc, BYTE* pSrcData, UINT32 SrcSize, BYTE* pDst
 
        while (pSrcPtr <= pSrcEnd)
        {
-               if ((((bs->position + 7) / 8) + 2) > (*pDstSize - 1))
+               if (((bs->position / 8) + 2) > (DstSize - 1))
                {
-                       *pFlags |= PACKET_FLUSHED;
                        ZeroMemory(HistoryBuffer, HistoryBufferSize);
                        ZeroMemory(mppc->MatchBuffer, sizeof(mppc->MatchBuffer));
+                       mppc->HistoryOffset = HistoryBufferSize + 1;
+                       *pFlags |= PACKET_FLUSHED;
+                       *pFlags |= CompressionLevel;
+                       *ppDstData = pSrcData;
                        *pDstSize = SrcSize;
                        return 1;
                }
@@ -763,6 +794,13 @@ int mppc_compress(MPPC_CONTEXT* mppc, BYTE* pSrcData, UINT32 SrcSize, BYTE* pDst
 
        *pFlags |= PACKET_COMPRESSED;
        *pFlags |= CompressionLevel;
+
+       if (PacketAtFront)
+               *pFlags |= PACKET_AT_FRONT;
+
+       if (PacketFlushed)
+               *pFlags |= PACKET_FLUSHED;
+
        *pDstSize = ((bs->position + 7) / 8);
 
        mppc->HistoryPtr = HistoryPtr;
index 60be7d3..b1e309b 100644 (file)
@@ -711,6 +711,7 @@ int test_MppcCompressBellsRdp5()
        UINT32 SrcSize;
        BYTE* pSrcData;
        UINT32 DstSize;
+       BYTE* pDstData;
        MPPC_CONTEXT* mppc;
        UINT32 expectedSize;
        BYTE OutputBuffer[65536];
@@ -719,10 +720,12 @@ int test_MppcCompressBellsRdp5()
 
        SrcSize = sizeof(TEST_MPPC_BELLS) - 1;
        pSrcData = (BYTE*) TEST_MPPC_BELLS;
-       DstSize = sizeof(OutputBuffer);
        expectedSize = sizeof(TEST_MPPC_BELLS_RDP5) - 1;
 
-       status = mppc_compress(mppc, pSrcData, SrcSize, OutputBuffer, &DstSize, &Flags);
+       DstSize = sizeof(OutputBuffer);
+       pDstData = OutputBuffer;
+
+       status = mppc_compress(mppc, pSrcData, SrcSize, &pDstData, &DstSize, &Flags);
 
        printf("Flags: 0x%04X DstSize: %d\n", Flags, DstSize);
 
@@ -732,12 +735,12 @@ int test_MppcCompressBellsRdp5()
                return -1;
        }
 
-       if (memcmp(OutputBuffer, TEST_MPPC_BELLS_RDP5, DstSize) != 0)
+       if (memcmp(pDstData, TEST_MPPC_BELLS_RDP5, DstSize) != 0)
        {
                printf("MppcCompressBellsRdp5: output mismatch\n");
 
                printf("Actual\n");
-               BitDump(OutputBuffer, DstSize * 8, 0);
+               BitDump(pDstData, DstSize * 8, 0);
 
                printf("Expected\n");
                BitDump(TEST_MPPC_BELLS_RDP5, DstSize * 8, 0);
@@ -757,6 +760,7 @@ int test_MppcCompressBellsRdp4()
        BYTE* pSrcData;
        UINT32 SrcSize;
        UINT32 DstSize;
+       BYTE* pDstData;
        MPPC_CONTEXT* mppc;
        UINT32 expectedSize;
        BYTE OutputBuffer[65536];
@@ -766,9 +770,11 @@ int test_MppcCompressBellsRdp4()
        SrcSize = sizeof(TEST_MPPC_BELLS) - 1;
        pSrcData = (BYTE*) TEST_MPPC_BELLS;
        expectedSize = sizeof(TEST_MPPC_BELLS_RDP4) - 1;
+
        DstSize = sizeof(OutputBuffer);
+       pDstData = OutputBuffer;
 
-       status = mppc_compress(mppc, pSrcData, SrcSize, OutputBuffer, &DstSize, &Flags);
+       status = mppc_compress(mppc, pSrcData, SrcSize, &pDstData, &DstSize, &Flags);
 
        printf("flags: 0x%04X size: %d\n", Flags, DstSize);
 
@@ -778,12 +784,12 @@ int test_MppcCompressBellsRdp4()
                return -1;
        }
 
-       if (memcmp(OutputBuffer, TEST_MPPC_BELLS_RDP4, DstSize) != 0)
+       if (memcmp(pDstData, TEST_MPPC_BELLS_RDP4, DstSize) != 0)
        {
                printf("MppcCompressBellsRdp4: output mismatch\n");
 
                printf("Actual\n");
-               BitDump(OutputBuffer, DstSize * 8, 0);
+               BitDump(pDstData, DstSize * 8, 0);
 
                printf("Expected\n");
                BitDump(TEST_MPPC_BELLS_RDP4, DstSize * 8, 0);
@@ -879,20 +885,22 @@ int test_MppcCompressBufferRdp5()
        BYTE* pSrcData;
        UINT32 SrcSize;
        UINT32 DstSize;
+       BYTE* pDstData;
        MPPC_CONTEXT* mppc;
        UINT32 expectedSize;
        BYTE OutputBuffer[65536];
-       BYTE* pDstData = NULL;
 
        mppc = mppc_context_new(1, TRUE);
 
        SrcSize = sizeof(TEST_RDP5_UNCOMPRESSED_DATA);
        pSrcData = (BYTE*) TEST_RDP5_UNCOMPRESSED_DATA;
        expectedSize = sizeof(TEST_RDP5_COMPRESSED_DATA);
+
        DstSize = sizeof(OutputBuffer);
        pDstData = OutputBuffer;
 
-       status = mppc_compress(mppc, pSrcData, SrcSize, pDstData, &DstSize, &Flags);
+       status = mppc_compress(mppc, pSrcData, SrcSize, &pDstData, &DstSize, &Flags);
+
        printf("flags: 0x%04X size: %d\n", Flags, DstSize);
 
        if (DstSize != expectedSize)
@@ -901,7 +909,7 @@ int test_MppcCompressBufferRdp5()
                return -1;
        }
 
-       if (memcmp(OutputBuffer, TEST_RDP5_COMPRESSED_DATA, DstSize) != 0)
+       if (memcmp(pDstData, TEST_RDP5_COMPRESSED_DATA, DstSize) != 0)
        {
                printf("MppcCompressBufferRdp5: output mismatch: compressed output does not match Microsoft implementation\n");
                return -1;
index 4956b00..2b94f75 100644 (file)
 
 //#define WITH_BULK_DEBUG              1
 
+const char* bulk_get_compression_flags_string(UINT32 flags)
+{
+       flags &= BULK_COMPRESSION_FLAGS_MASK;
+
+       if (flags == 0)
+               return "PACKET_UNCOMPRESSED";
+       else if (flags == PACKET_COMPRESSED)
+               return "PACKET_COMPRESSED";
+       else if (flags == PACKET_AT_FRONT)
+               return "PACKET_AT_FRONT";
+       else if (flags == PACKET_FLUSHED)
+               return "PACKET_FLUSHED";
+       else if (flags == (PACKET_COMPRESSED | PACKET_AT_FRONT))
+               return "PACKET_COMPRESSED | PACKET_AT_FRONT";
+       else if (flags == (PACKET_COMPRESSED | PACKET_FLUSHED))
+               return "PACKET_COMPRESSED | PACKET_FLUSHED";
+       else if (flags == (PACKET_AT_FRONT | PACKET_FLUSHED))
+               return "PACKET_AT_FRONT | PACKET_FLUSHED";
+       else if (flags == (PACKET_COMPRESSED | PACKET_AT_FRONT | PACKET_FLUSHED))
+               return "PACKET_COMPRESSED | PACKET_AT_FRONT | PACKET_FLUSHED";
+
+       return "PACKET_UNKNOWN";
+}
+
 UINT32 bulk_compression_level(rdpBulk* bulk)
 {
        rdpSettings* settings = bulk->context->settings;
@@ -39,14 +63,60 @@ UINT32 bulk_compression_max_size(rdpBulk* bulk)
        return bulk->CompressionMaxSize;
 }
 
+int bulk_compress_validate(rdpBulk* bulk, BYTE* pSrcData, UINT32 SrcSize, BYTE** ppDstData, UINT32* pDstSize, UINT32* pFlags)
+{
+       int status;
+       BYTE* _pSrcData = NULL;
+       BYTE* _pDstData = NULL;
+       UINT32 _SrcSize = 0;
+       UINT32 _DstSize = 0;
+       UINT32 _Flags = 0;
+
+       _pSrcData = *ppDstData;
+       _SrcSize = *pDstSize;
+       _Flags = *pFlags | bulk->CompressionLevel;
+
+       status = bulk_decompress(bulk, _pSrcData, _SrcSize, &_pDstData, &_DstSize, _Flags);
+
+       if (status < 0)
+       {
+               printf("compression/decompression failure\n");
+               return status;
+       }
+
+       if (_DstSize != SrcSize)
+       {
+               printf("compression/decompression size mismatch: Actual: %d, Expected: %d\n", _DstSize, SrcSize);
+               return -1;
+       }
+
+       if (memcmp(_pDstData, pSrcData, SrcSize) != 0)
+       {
+               printf("compression/decompression input/output mismatch! flags: 0x%04X\n", _Flags);
+
+               printf("Actual:\n");
+               winpr_HexDump(_pDstData, SrcSize);
+
+               printf("Expected:\n");
+               winpr_HexDump(pSrcData, SrcSize);
+
+               return -1;
+       }
+
+       return status;
+}
+
 int bulk_decompress(rdpBulk* bulk, BYTE* pSrcData, UINT32 SrcSize, BYTE** ppDstData, UINT32* pDstSize, UINT32 flags)
 {
+       UINT32 type;
        int status = -1;
        UINT32 CompressedBytes;
        UINT32 UncompressedBytes;
-       UINT32 type = flags & 0x0F;
 
-       if (flags & PACKET_COMPRESSED)
+       bulk_compression_max_size(bulk);
+       type = flags & BULK_COMPRESSION_TYPE_MASK;
+
+       if (flags & BULK_COMPRESSION_FLAGS_MASK)
        {
                switch (type)
                {
@@ -96,8 +166,10 @@ int bulk_decompress(rdpBulk* bulk, BYTE* pSrcData, UINT32 SrcSize, BYTE** ppDstD
                        CompressionRatio = ((double) CompressedBytes) / ((double) UncompressedBytes);
                        TotalCompressionRatio = ((double) bulk->TotalCompressedBytes) / ((double) bulk->TotalUncompressedBytes);
 
-                       printf("Type: %d Flags: 0x%04X Compression Ratio: %f Total: %f %d / %d\n",
-                                       type, flags, CompressionRatio, TotalCompressionRatio, CompressedBytes, UncompressedBytes);
+                       printf("Type: %d Flags: %s (0x%04X) Compression Ratio: %f (%d / %d), Total: %f (%d / %d)\n",
+                                       type, bulk_get_compression_flags_string(flags), flags,
+                                       CompressionRatio, CompressedBytes, UncompressedBytes,
+                                       TotalCompressionRatio, bulk->TotalCompressedBytes, bulk->TotalUncompressedBytes);
                }
 #endif
        }
@@ -115,12 +187,21 @@ int bulk_compress(rdpBulk* bulk, BYTE* pSrcData, UINT32 SrcSize, BYTE** ppDstDat
        UINT32 CompressedBytes;
        UINT32 UncompressedBytes;
 
+       if ((SrcSize <= 50) || (SrcSize >= 16384))
+       {
+               *ppDstData = pSrcData;
+               *pDstSize = SrcSize;
+               return 0;
+       }
+
        *ppDstData = bulk->OutputBuffer;
        *pDstSize = sizeof(bulk->OutputBuffer);
 
        bulk_compression_level(bulk);
+       bulk_compression_max_size(bulk);
        mppc_set_compression_level(bulk->mppcSend, bulk->CompressionLevel);
-       status = mppc_compress(bulk->mppcSend, pSrcData, SrcSize, *ppDstData, pDstSize, pFlags);
+
+       status = mppc_compress(bulk->mppcSend, pSrcData, SrcSize, ppDstData, pDstSize, pFlags);
 
        if (status >= 0)
        {
@@ -141,12 +222,19 @@ int bulk_compress(rdpBulk* bulk, BYTE* pSrcData, UINT32 SrcSize, BYTE** ppDstDat
                        CompressionRatio = ((double) CompressedBytes) / ((double) UncompressedBytes);
                        TotalCompressionRatio = ((double) bulk->TotalCompressedBytes) / ((double) bulk->TotalUncompressedBytes);
 
-                       printf("Type: %d Flags: 0x%04X Compression Ratio: %f Total: %f %d / %d\n",
-                                       type, *pFlags, CompressionRatio, TotalCompressionRatio, CompressedBytes, UncompressedBytes);
+                       printf("Type: %d Flags: %s (0x%04X) Compression Ratio: %f (%d / %d), Total: %f (%d / %d)\n",
+                                       type, bulk_get_compression_flags_string(*pFlags), *pFlags,
+                                       CompressionRatio, CompressedBytes, UncompressedBytes,
+                                       TotalCompressionRatio, bulk->TotalCompressedBytes, bulk->TotalUncompressedBytes);
                }
 #endif
        }
 
+#if 0
+       if (bulk_compress_validate(bulk, pSrcData, SrcSize, ppDstData, pDstSize, pFlags) < 0)
+               status = -1;
+#endif
+
        return status;
 }
 
index 9c8a635..b998a9a 100644 (file)
@@ -36,11 +36,13 @@ struct rdp_bulk
        MPPC_CONTEXT* mppcRecv;
        NCRUSH_CONTEXT* ncrushRecv;
        BYTE OutputBuffer[65536];
-
        UINT64 TotalCompressedBytes;
        UINT64 TotalUncompressedBytes;
 };
 
+#define BULK_COMPRESSION_FLAGS_MASK    0xE0
+#define BULK_COMPRESSION_TYPE_MASK     0x0F
+
 UINT32 bulk_compression_level(rdpBulk* bulk);
 UINT32 bulk_compression_max_size(rdpBulk* bulk);
 
index 31d96cc..9efe289 100644 (file)
@@ -932,7 +932,7 @@ BOOL fastpath_send_update_pdu(rdpFastPath* fastpath, BYTE updateCode, wStream* s
                {
                        if (bulk_compress(rdp->bulk, pSrcData, SrcSize, &pDstData, &DstSize, &compressionFlags) >= 0)
                        {
-                               if (compressionFlags & PACKET_COMPRESSED)
+                               if (compressionFlags)
                                {
                                        fpUpdateHeader.compressionFlags = compressionFlags;
                                        fpUpdateHeader.compression = FASTPATH_OUTPUT_COMPRESSION_USED;
index 7ce931c..142c509 100644 (file)
@@ -1,17 +1,17 @@
 -----BEGIN CERTIFICATE-----
-MIICyzCCAbOgAwIBAgIJANbqtAWwlQZuMA0GCSqGSIb3DQEBBQUAMBIxEDAOBgNV
-BAMTB0ZyZWVSRFAwHhcNMDkxMDI5MDA0MTQ5WhcNMDkxMTI4MDA0MTQ5WjASMRAw
-DgYDVQQDEwdGcmVlUkRQMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA
-q7mxFgRbS2FYJZX7BzpNd4T/n4nEVDBY6YaObLjGpaB1TptzXTcmfDrDslTGwcEY
-hTFAC4ZvY6yOURExqbph4LSgvkoa6J722RjVPfshGa4mlh2SXvTiaV26VPPxddGb
-o6fbs2u029lbtBlpIVbhx5RN9vstNkll26oSZ6wfEdBNHQJLd2SU4ItWHj8zjz1f
-eGxjgChHihUlwcBYKDJsKFkzHZmLrMgB37KsGlXi/WV+eEsjgvz4yP7I3TL8+GsN
-MjV8fRGVEKTbKSmgunO67d5u+IaqUQb0Ad1ha1jzDQ+a6hdymrulJSIhoOVfKkwi
-ptTe43FgwxVRIygJP9HjHQIDAQABoyQwIjATBgNVHSUEDDAKBggrBgEFBQcDATAL
-BgNVHQ8EBAMCBDAwDQYJKoZIhvcNAQEFBQADggEBAIOdEDhOX2kbl02znltd9hCr
-nV4kRPKm979RKwBNkrEuwYSlcsjAHg5MZ5itH3wFOUo2s5pjt7/vMOAg+6rOBbIa
-nqr22/gKBtOmuaJLG1yjxDC2vfez7f3B26pKgxa/krM8oxiFdT9n8QbdxdkN7/D9
-3RLU/aCfgrMzXxRus7eq3kR00jnSs6ggnAfE1E9gric3vFgr1wCzdcriRXmXDfUb
-hRq+4VG+ZWk16TwCofV5GVU39XWCv5HNO2swAdjkNXgI5e3tQbV3wWLZLqqYzBco
-iWulAXtoCGmE81+u1Ms7hLLzpXitLZSGPu1r+sDdkKPLCmOvkAaljDQ4nBz7fIA=
+MIICyjCCAbKgAwIBAgIEIZtPcjANBgkqhkiG9w0BAQUFADAUMRIwEAYDVQQDEwlj
+aGFtZWxlb24wHhcNMTQwNDE4MDMzNDIyWhcNMTUwNDE4MDMzNDIyWjAUMRIwEAYD
+VQQDEwljaGFtZWxlb24wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCz
+oGjWnPFjPPPi/iJOooPgmf1IMwQHY7VWrMegtrotnuSteW/m4r0QWSceYM8+oeIV
+iU71AzNi074GR9EVbtXZCSgxn00jpPK+tgDBjbLmmqeCcwRkqpbBrS77/+Mq7UZM
+lSRLPv74R01vUM5DyeII4WHf0C4T07BDiOnfFvs3T2AaLMEawfWT2408sXCZxgbY
+IHp0WKnRXHQcG2Ys0iOSewe0iqhw8ODY/ze/eFtJ/5vdwCpN8AUOdU9PCXIA639d
+ni9hKn7EXUvUZQ/SliBSaXsTfEw2Iu8Bo0/dcUfOwrPK8G2MOROi9GW80Prxtj+w
+PTp7Z7h/JJCpygMkzmohAgMBAAGjJDAiMBMGA1UdJQQMMAoGCCsGAQUFBwMBMAsG
+A1UdDwQEAwIEMDANBgkqhkiG9w0BAQUFAAOCAQEAaq84r/SZaUZYlpDnE/V3cJI2
+Uzh8B81DqgVTgMqeuVAKAcgOEVf04Cp0oQ3+nS90a+afiqrT3A1eX5Wa1gxNkAIa
+m26cSysGVl4I1xoXyddjZOIRy6GYVjdchdOGkE/lBy+NtuP0xwCkscUIQ6N8Es7r
+DY8yMxtERYG2FHvnvZaw9oqstDpQtXoqzrl1JHz1nMcaVuFzyzdJdZrGvgQdMR7g
+X1OT6dvmUYrUFGDxdPg+HHVeB4S5rUpvQUpqX/PGTwl8PIhahaqdPwHGsHfqp9Rk
+ttjPkAw1fn7CUMj+OuNmF3WDSh4k+3chNyz/bkJqpPxjPXCYSXrlgJLwcmlKXA==
 -----END CERTIFICATE-----
index 5c2f2c8..e7030b6 100644 (file)
@@ -1,27 +1,28 @@
------BEGIN RSA PRIVATE KEY-----
-MIIEogIBAAKCAQEAq7mxFgRbS2FYJZX7BzpNd4T/n4nEVDBY6YaObLjGpaB1Tptz
-XTcmfDrDslTGwcEYhTFAC4ZvY6yOURExqbph4LSgvkoa6J722RjVPfshGa4mlh2S
-XvTiaV26VPPxddGbo6fbs2u029lbtBlpIVbhx5RN9vstNkll26oSZ6wfEdBNHQJL
-d2SU4ItWHj8zjz1feGxjgChHihUlwcBYKDJsKFkzHZmLrMgB37KsGlXi/WV+eEsj
-gvz4yP7I3TL8+GsNMjV8fRGVEKTbKSmgunO67d5u+IaqUQb0Ad1ha1jzDQ+a6hdy
-mrulJSIhoOVfKkwiptTe43FgwxVRIygJP9HjHQIDAQABAoIBAAVv5K54xtc1JtBR
-1lfdPbSqDlnjx8aOnVIPg5TnqMp3sR8jBt0NsPc/+RA9ZOmfjoIxFAEJaZ9zSDJC
-5BqmnxC5R1mfCQkSd2haQ+4pdFvWyrv4Bblh8YU6hXrJGn0LfO0KlIcywtAvKpsi
-LtTyZkWmaW2HeF/+pO32jYygw38R1wd8Tl6GwjOXwTF6lFACJXOT4YAzcfp3FKSB
-AiKBIGuMzozoSND7KPFNRrhGhNumJpdS5A8Fb8D2c/ZMv6Cq5IbwOgTfKun+Bz+s
-mFbnzeb1uWRqQbsVXOBBW/zHfuG3SU5qeZsaAyuu4DTy+LE1oAHF9uhBSHuT5C6i
-vCJ8A8ECgYEA1iaOmiEJYBrs25iAc4SjCKqhY0mwR3wtu3I06vmgUoML5fhPMv36
-SvYQIqDyNw3p7TE6mZtw9+G+kK3PqhuJhogwSwg0a6o51RdKnhXH3/68oNWtKCLC
-1AmR8q/Gd3FwAR3b49CuOIZ9uOiJrc/ejzKdFEJTDR1/TX1frWfZznECgYEAzUiz
-XxFf7YrGel7JgmfRD2eZRYngOoteFlg5Tee42UjeAY2Pt2aiDLk+2TqQEdI9+Xg7
-LcFdBqcSNd8bh33xSzgNthIkX+lTDzx0SmKGfyxfFBJcY8nzsLvvnNt3YeuMeaJQ
-CPszwoZ0jcD46jTCjbrKhaLyEWmUkDp1O71NTW0CgYAXKF49Xpsz8FVyvcAOPeaf
-dkwzf3F3mX8ciRId4taqdY9g1AREgGCDoK5IAF2RBIkqZCtxFvUVaS0BWjpdq9Ko
-YKvQQVfh2KueVoF0LOjLWTGutsydzXyCD3Lf6pAstHCnPkJcFWHxrOGFkGfrCtKH
-a7K+0RlIDsuIZqllCBjukQKBgA31+MTpYJW+D1t5IMkumEgs6n6RLt+sZLyuSU9k
-B+03CGogn3qAj1rAKmcJlYywuKhDpfqpoNL3/8QMJUokpYlRCZWtTC39pzltCheY
-9b6mXNz3lrLupBUL4vLO9iKBq28GO90wgEelbz3ItuTuq6CJ6IYIG+BVRtY8M4bZ
-i+1NAoGANXZjYnJYDnh8Je9SDxDSc5byzK7ddkQoId64RCIfNHqNKH63P81vjgnH
-YBIPtagY75ZVVNxujCF7m8Rety+d8tEFwfQKDin2EVI7PD2rOJra385/izp7HuBR
-vqxvLzG9Xv3cNOU2l7PttVw4Pa2i5E37atKi3V3Zp2kMW+KaKPQ=
------END RSA PRIVATE KEY-----
+-----BEGIN PRIVATE KEY-----
+MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQCzoGjWnPFjPPPi
+/iJOooPgmf1IMwQHY7VWrMegtrotnuSteW/m4r0QWSceYM8+oeIViU71AzNi074G
+R9EVbtXZCSgxn00jpPK+tgDBjbLmmqeCcwRkqpbBrS77/+Mq7UZMlSRLPv74R01v
+UM5DyeII4WHf0C4T07BDiOnfFvs3T2AaLMEawfWT2408sXCZxgbYIHp0WKnRXHQc
+G2Ys0iOSewe0iqhw8ODY/ze/eFtJ/5vdwCpN8AUOdU9PCXIA639dni9hKn7EXUvU
+ZQ/SliBSaXsTfEw2Iu8Bo0/dcUfOwrPK8G2MOROi9GW80Prxtj+wPTp7Z7h/JJCp
+ygMkzmohAgMBAAECggEBAJxXJIiOxuZZ+ef6yz9n4aKORM4fYQVRela7QXEXOYpV
+frGiPYxWkrn07sBZAGiCG7Yk8Wz9YS9GHmF3BntCIayqdKpj/Y7llUX6QUQ1oZ1m
+xB8dHpjDhT2DD57UBBOruwES2ikH5oGQBcy6Jx0HTM3v5PEZT9F/8S2GsA+0/+gN
+n5RKGds9nMN+GhGJoCPZTPqHxxsW7p0+W8Sqnv6dQ/lN9E8Iesag4H5my1+lpEWb
+kI6h4Llk2xHUrcb3wL3+ttYLkkd8DGn7O/URKVbFwxPZLkx2kR2LFwL9wx88+HJ+
++zPBaQ5JBBvJ7s94iZPW1/rfbiVn8jZJHbzs4IrsvVUCgYEA3fciYy5BHVsNMmFW
+NBxgLaNbMDjaCcN7bBItCpzpBKp/INDLIX31u6MH/OxcFCZGwuW0Tq85PXsgFfJW
+rjFouqeGQDy0MFw1aSwz1Y6h+J0OM4Xtqh3wQtqrQKRJi4JjR8Nrw8NwfBZnQXwe
+XrlgMSwqev0NbvVpYVTZHsDRs+MCgYEAzytXGiBnqG7micj2Ic+gABBiD9pkYFCa
+LMAiFn7JqWTyvBL9Yte7QO6S5sxfuCxV0/tcanehP6KqQEC1cOenefy4JTM8M1pi
+Osp+WPokxRGEN+enhDxA7IKAtIC5lV8vPFYpxel3ALwzQyIB11a7QwyZ0HV9DGyD
+SWgqMV16cSsCgYEApKmznvQvZgGn9pnzA1GRoAmxmkJyrg+Qvgl11Iu26bk5+jQq
+nTv+UiaNxHnrjR8gG3Ggo0amJg/zK5TN7QfGc8HXfEwMOFwPW2hpQ6I+UlrgsCRI
+vYzcMhxaMugtjws5b4FvrpiMF+He09uqBAdtbs0e7oJPtuLkPEpfj8rnRpUCgYEA
+l1TgdoxPTCFetC2hZgdlqEZPa6crhZO7W48qF2acZun/ylTQ1WAjQAZGNuP50+5G
+7+eAlaE3n+VyGidqosQFeb2awknP4u9WK/35F4P6Uh4+iBvnKVheUKXv4Grbpfp2
+5ctHDnRBYr8XbyWrVKLdfdf5j+YS531o1bmKgK75HysCgYAi1jqD5KSG5sLhO0kF
+7BD9qYTIzW6Ocn4x1FRY6kxyGrE7Vb7VGNW2ULVexyn73pxhueuS4Qy5xHVDmdhO
+ibolvvEr2TnSC0XR7QfOeXjmyV0m5Uvz97QNxoMnAHA60LWy8isj97LRAXuoSLEp
+f2wfaMPwVN0WlBwa2PWAVm3zWA==
+-----END PRIVATE KEY-----
index 68d4b36..4a16554 100644 (file)
@@ -325,7 +325,7 @@ static BOOL test_sleep_tsdiff(UINT32 *old_sec, UINT32 *old_usec, UINT32 new_sec,
 {
        INT32 sec, usec;
 
-       if (*old_sec==0 && *old_usec==0)
+       if ((*old_sec == 0) && (*old_usec == 0))
        {
                *old_sec = new_sec;
                *old_usec = new_usec;
@@ -335,7 +335,7 @@ static BOOL test_sleep_tsdiff(UINT32 *old_sec, UINT32 *old_usec, UINT32 new_sec,
        sec = new_sec - *old_sec;
        usec = new_usec - *old_usec;
 
-       if (sec<0 || (sec==0 && usec<0))
+       if ((sec < 0) || ((sec == 0) && (usec < 0)))
        {
                printf("Invalid time stamp detected.\n");
                return FALSE;
@@ -393,6 +393,9 @@ void tf_peer_dump_rfx(freerdp_peer* client)
                        break;
 
                update->SurfaceCommand(update->context, s);
+
+               if (client->CheckFileDescriptor(client) != TRUE)
+                       break;
        }
 }
 
@@ -528,6 +531,9 @@ BOOL tf_peer_activate(freerdp_peer* client)
        rfx_context_reset(context->rfx_context);
        context->activated = TRUE;
 
+       //client->settings->CompressionLevel = PACKET_COMPR_TYPE_8K;
+       client->settings->CompressionLevel = PACKET_COMPR_TYPE_64K;
+
        if (test_pcap_file != NULL)
        {
                client->update->dump_rfx = TRUE;