Merge pull request #2416 from zavadovsky/transport_dead_end_fix
libfreerdp-core: fix dead-end state in transport_read_pdu()
This commit is contained in:
commit
1fd5508afd
@ -422,6 +422,8 @@ int transport_read_pdu(rdpTransport* transport, wStream* s)
|
||||
return status;
|
||||
}
|
||||
|
||||
/* update position value for further checks */
|
||||
position = Stream_GetPosition(s);
|
||||
header = Stream_Buffer(s);
|
||||
|
||||
if (transport->NlaMode)
|
||||
@ -439,7 +441,9 @@ int transport_read_pdu(rdpTransport* transport, wStream* s)
|
||||
{
|
||||
if ((header[1] & ~(0x80)) == 1)
|
||||
{
|
||||
if ((status = transport_read_layer_bytes(transport, s, 1)) != 1)
|
||||
/* check for header bytes already was readed in previous calls */
|
||||
if (position < 3
|
||||
&& (status = transport_read_layer_bytes(transport, s, 3 - position)) != 1)
|
||||
return status;
|
||||
|
||||
pduLength = header[2];
|
||||
@ -447,7 +451,9 @@ int transport_read_pdu(rdpTransport* transport, wStream* s)
|
||||
}
|
||||
else if ((header[1] & ~(0x80)) == 2)
|
||||
{
|
||||
if ((status = transport_read_layer_bytes(transport, s, 2)) != 1)
|
||||
/* check for header bytes already was readed in previous calls */
|
||||
if (position < 4
|
||||
&& (status = transport_read_layer_bytes(transport, s, 4 - position)) != 1)
|
||||
return status;
|
||||
|
||||
pduLength = (header[2] << 8) | header[3];
|
||||
@ -471,7 +477,9 @@ int transport_read_pdu(rdpTransport* transport, wStream* s)
|
||||
if (header[0] == 0x03)
|
||||
{
|
||||
/* TPKT header */
|
||||
if ((status = transport_read_layer_bytes(transport, s, 2)) != 1)
|
||||
/* check for header bytes already was readed in previous calls */
|
||||
if (position < 4
|
||||
&& (status = transport_read_layer_bytes(transport, s, 4 - position)) != 1)
|
||||
return status;
|
||||
|
||||
pduLength = (header[2] << 8) | header[3];
|
||||
@ -488,7 +496,9 @@ int transport_read_pdu(rdpTransport* transport, wStream* s)
|
||||
/* Fast-Path Header */
|
||||
if (header[1] & 0x80)
|
||||
{
|
||||
if ((status = transport_read_layer_bytes(transport, s, 1)) != 1)
|
||||
/* check for header bytes already was readed in previous calls */
|
||||
if (position < 3
|
||||
&& (status = transport_read_layer_bytes(transport, s, 3 - position)) != 1)
|
||||
return status;
|
||||
|
||||
pduLength = ((header[1] & 0x7F) << 8) | header[2];
|
||||
|
Loading…
x
Reference in New Issue
Block a user