mirror of https://github.com/FreeRDP/FreeRDP
Refactored order stream manipulation
* Use stream seek instead of setting pointer directly * Add log messages in case of inconsistencies * Fixed missing stream advance in update_decompress_brush
This commit is contained in:
parent
17f547ae11
commit
97efff4e90
|
@ -1686,7 +1686,6 @@ static BOOL update_read_fast_index_order(wStream* s, const ORDER_INFO* orderInfo
|
||||||
static BOOL update_read_fast_glyph_order(wStream* s, const ORDER_INFO* orderInfo,
|
static BOOL update_read_fast_glyph_order(wStream* s, const ORDER_INFO* orderInfo,
|
||||||
FAST_GLYPH_ORDER* fastGlyph)
|
FAST_GLYPH_ORDER* fastGlyph)
|
||||||
{
|
{
|
||||||
BYTE* phold;
|
|
||||||
GLYPH_DATA_V2* glyph = &fastGlyph->glyphData;
|
GLYPH_DATA_V2* glyph = &fastGlyph->glyphData;
|
||||||
ORDER_FIELD_BYTE(1, fastGlyph->cacheId);
|
ORDER_FIELD_BYTE(1, fastGlyph->cacheId);
|
||||||
ORDER_FIELD_2BYTE(2, fastGlyph->ulCharInc, fastGlyph->flAccel);
|
ORDER_FIELD_2BYTE(2, fastGlyph->ulCharInc, fastGlyph->flAccel);
|
||||||
|
@ -1714,7 +1713,8 @@ static BOOL update_read_fast_glyph_order(wStream* s, const ORDER_INFO* orderInfo
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
CopyMemory(fastGlyph->data, Stream_Pointer(s), fastGlyph->cbData);
|
CopyMemory(fastGlyph->data, Stream_Pointer(s), fastGlyph->cbData);
|
||||||
phold = Stream_Pointer(s);
|
if (Stream_GetRemainingLength(s) < fastGlyph->cbData)
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
if (!Stream_SafeSeek(s, 1))
|
if (!Stream_SafeSeek(s, 1))
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
@ -1736,7 +1736,7 @@ static BOOL update_read_fast_glyph_order(wStream* s, const ORDER_INFO* orderInfo
|
||||||
new_cb = ((glyph->cx + 7) / 8) * glyph->cy;
|
new_cb = ((glyph->cx + 7) / 8) * glyph->cy;
|
||||||
new_cb += ((new_cb % 4) > 0) ? 4 - (new_cb % 4) : 0;
|
new_cb += ((new_cb % 4) > 0) ? 4 - (new_cb % 4) : 0;
|
||||||
|
|
||||||
if (Stream_GetRemainingLength(s) < new_cb)
|
if (fastGlyph->cbData < new_cb)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
if (new_cb)
|
if (new_cb)
|
||||||
|
@ -1751,9 +1751,8 @@ static BOOL update_read_fast_glyph_order(wStream* s, const ORDER_INFO* orderInfo
|
||||||
glyph->cb = new_cb;
|
glyph->cb = new_cb;
|
||||||
Stream_Read(s, glyph->aj, glyph->cb);
|
Stream_Read(s, glyph->aj, glyph->cb);
|
||||||
}
|
}
|
||||||
|
Stream_Seek(s, fastGlyph->cbData - new_cb);
|
||||||
}
|
}
|
||||||
|
|
||||||
Stream_SetPointer(s, phold + fastGlyph->cbData);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
@ -2489,15 +2488,15 @@ BOOL update_write_cache_glyph_v2_order(wStream* s, const CACHE_GLYPH_V2_ORDER* c
|
||||||
}
|
}
|
||||||
static BOOL update_decompress_brush(wStream* s, BYTE* output, BYTE bpp)
|
static BOOL update_decompress_brush(wStream* s, BYTE* output, BYTE bpp)
|
||||||
{
|
{
|
||||||
int index;
|
UINT32 index;
|
||||||
int x, y, k;
|
UINT32 x, y, k;
|
||||||
BYTE byte = 0;
|
BYTE byte = 0;
|
||||||
BYTE* palette;
|
BYTE* palette;
|
||||||
int bytesPerPixel;
|
UINT32 bytesPerPixel;
|
||||||
palette = Stream_Pointer(s) + 16;
|
palette = Stream_Pointer(s) + 16;
|
||||||
bytesPerPixel = ((bpp + 1) / 8);
|
bytesPerPixel = ((bpp + 1) / 8);
|
||||||
|
|
||||||
if (Stream_GetRemainingLength(s) < 16) // 64 / 4
|
if (Stream_GetRemainingLength(s) < 16 + 7 * bytesPerPixel) // 64 / 4
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
for (y = 7; y >= 0; y--)
|
for (y = 7; y >= 0; y--)
|
||||||
|
@ -2516,6 +2515,9 @@ static BOOL update_decompress_brush(wStream* s, BYTE* output, BYTE bpp)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Skip the palette */
|
||||||
|
Stream_Seek(s, 7 * bytesPerPixel);
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
static BOOL update_compress_brush(wStream* s, const BYTE* input, BYTE bpp)
|
static BOOL update_compress_brush(wStream* s, const BYTE* input, BYTE bpp)
|
||||||
|
@ -3477,7 +3479,7 @@ static BOOL update_recv_primary_order(rdpUpdate* update, wStream* s, BYTE flags)
|
||||||
static BOOL update_recv_secondary_order(rdpUpdate* update, wStream* s, BYTE flags)
|
static BOOL update_recv_secondary_order(rdpUpdate* update, wStream* s, BYTE flags)
|
||||||
{
|
{
|
||||||
BOOL rc = FALSE;
|
BOOL rc = FALSE;
|
||||||
BYTE* next;
|
size_t start, end, diff;
|
||||||
BYTE orderType;
|
BYTE orderType;
|
||||||
UINT16 extraFlags;
|
UINT16 extraFlags;
|
||||||
UINT16 orderLength;
|
UINT16 orderLength;
|
||||||
|
@ -3502,7 +3504,7 @@ static BOOL update_recv_secondary_order(rdpUpdate* update, wStream* s, BYTE flag
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
next = Stream_Pointer(s) + orderLength + 7;
|
start = Stream_GetPosition(s);
|
||||||
name = secondary_order_string(orderType);
|
name = secondary_order_string(orderType);
|
||||||
WLog_Print(update->log, WLOG_DEBUG, "Secondary Drawing Order %s", name);
|
WLog_Print(update->log, WLOG_DEBUG, "Secondary Drawing Order %s", name);
|
||||||
|
|
||||||
|
@ -3626,7 +3628,21 @@ static BOOL update_recv_secondary_order(rdpUpdate* update, wStream* s, BYTE flag
|
||||||
WLog_Print(update->log, WLOG_ERROR, "SECONDARY ORDER %s failed", name);
|
WLog_Print(update->log, WLOG_ERROR, "SECONDARY ORDER %s failed", name);
|
||||||
}
|
}
|
||||||
|
|
||||||
Stream_SetPointer(s, next);
|
start += orderLength + 7;
|
||||||
|
end = Stream_GetPosition(s);
|
||||||
|
if (start > end)
|
||||||
|
{
|
||||||
|
WLog_Print(update->log, WLOG_WARN, "SECONDARY_ORDER %s: read %" PRIuz "bytes too much",
|
||||||
|
name, end - start);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
diff = start - end;
|
||||||
|
if (diff > 0)
|
||||||
|
{
|
||||||
|
WLog_Print(update->log, WLOG_DEBUG,
|
||||||
|
"SECONDARY_ORDER %s: read %" PRIuz "bytes short, skipping", name, diff);
|
||||||
|
Stream_Seek(s, diff);
|
||||||
|
}
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue