fix match length decoding for mppc with 64kB history buffer

git-svn-id: svn://svn.code.sf.net/p/rdesktop/code/trunk/rdesktop@898 423420c4-83ab-492f-b58f-81f9feb106b5
This commit is contained in:
Jeroen Meijer 2005-04-30 20:48:05 +00:00
parent 0a23837726
commit d310e6a4ac

11
mppc.c
View File

@ -63,6 +63,7 @@ mppc_expand(uint8 * data, uint32 clen, uint8 ctype, uint32 * roff, uint32 * rlen
int next_offset, match_off; int next_offset, match_off;
int match_len; int match_len;
int old_offset, match_bits; int old_offset, match_bits;
BOOL big = ctype & RDP_MPPC_BIG ? True : False;
uint8 *dict = g_mppc_dict.hist; uint8 *dict = g_mppc_dict.hist;
@ -155,7 +156,7 @@ mppc_expand(uint8 * data, uint32 clen, uint8 ctype, uint32 * roff, uint32 * rlen
/* decode offset */ /* decode offset */
/* length pair */ /* length pair */
walker <<= 1; walker <<= 1;
if (--walker_len < (ctype & RDP_MPPC_BIG ? 3 : 2)) if (--walker_len < (big ? 3 : 2))
{ {
if (i >= clen) if (i >= clen)
return -1; return -1;
@ -163,7 +164,7 @@ mppc_expand(uint8 * data, uint32 clen, uint8 ctype, uint32 * roff, uint32 * rlen
walker_len += 8; walker_len += 8;
} }
if (ctype & RDP_MPPC_BIG) if (big)
{ {
/* offset decoding where offset len is: /* offset decoding where offset len is:
-63: 11111 followed by the lower 6 bits of the value -63: 11111 followed by the lower 6 bits of the value
@ -315,7 +316,7 @@ mppc_expand(uint8 * data, uint32 clen, uint8 ctype, uint32 * roff, uint32 * rlen
i.e. 4097 is encoded as: 111111111110 000000000001 i.e. 4097 is encoded as: 111111111110 000000000001
meaning 4096 + 1... meaning 4096 + 1...
*/ */
match_bits = 11; /* 11 bits of value at most */ match_bits = big ? 14 : 11; /* 11 or 14 bits of value at most */
do do
{ {
walker <<= 1; walker <<= 1;
@ -334,7 +335,7 @@ mppc_expand(uint8 * data, uint32 clen, uint8 ctype, uint32 * roff, uint32 * rlen
} }
} }
while (1); while (1);
match_len = 13 - match_bits; match_len = (big ? 16 : 13) - match_bits;
walker <<= 1; walker <<= 1;
if (--walker_len < match_len) if (--walker_len < match_len)
{ {
@ -360,7 +361,7 @@ mppc_expand(uint8 * data, uint32 clen, uint8 ctype, uint32 * roff, uint32 * rlen
return -1; return -1;
} }
/* memory areas can overlap - meaning we can't use memXXX functions */ /* memory areas can overlap - meaning we can't use memXXX functions */
k = (next_offset - match_off) & (ctype & RDP_MPPC_BIG ? 65535 : 8191); k = (next_offset - match_off) & (big ? 65535 : 8191);
do do
{ {
dict[next_offset++] = dict[k++]; dict[next_offset++] = dict[k++];