libfreerdp-core: change fastpath return codes
This commit is contained in:
parent
0146b21eb5
commit
df01ba88d4
@ -198,8 +198,9 @@ static BOOL fastpath_recv_update_synchronize(rdpFastPath* fastpath, STREAM* s)
|
|||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
static BOOL fastpath_recv_update(rdpFastPath* fastpath, BYTE updateCode, UINT32 size, STREAM* s)
|
static int fastpath_recv_update(rdpFastPath* fastpath, BYTE updateCode, UINT32 size, STREAM* s)
|
||||||
{
|
{
|
||||||
|
int status = 0;
|
||||||
rdpUpdate* update = fastpath->rdp->update;
|
rdpUpdate* update = fastpath->rdp->update;
|
||||||
rdpContext* context = fastpath->rdp->update->context;
|
rdpContext* context = fastpath->rdp->update->context;
|
||||||
rdpPointerUpdate* pointer = update->pointer;
|
rdpPointerUpdate* pointer = update->pointer;
|
||||||
@ -213,13 +214,13 @@ static BOOL fastpath_recv_update(rdpFastPath* fastpath, BYTE updateCode, UINT32
|
|||||||
{
|
{
|
||||||
case FASTPATH_UPDATETYPE_ORDERS:
|
case FASTPATH_UPDATETYPE_ORDERS:
|
||||||
if (!fastpath_recv_orders(fastpath, s))
|
if (!fastpath_recv_orders(fastpath, s))
|
||||||
return FALSE;
|
return -1;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case FASTPATH_UPDATETYPE_BITMAP:
|
case FASTPATH_UPDATETYPE_BITMAP:
|
||||||
case FASTPATH_UPDATETYPE_PALETTE:
|
case FASTPATH_UPDATETYPE_PALETTE:
|
||||||
if(!fastpath_recv_update_common(fastpath, s))
|
if (!fastpath_recv_update_common(fastpath, s))
|
||||||
return FALSE;
|
return -1;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case FASTPATH_UPDATETYPE_SYNCHRONIZE:
|
case FASTPATH_UPDATETYPE_SYNCHRONIZE:
|
||||||
@ -230,8 +231,7 @@ static BOOL fastpath_recv_update(rdpFastPath* fastpath, BYTE updateCode, UINT32
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case FASTPATH_UPDATETYPE_SURFCMDS:
|
case FASTPATH_UPDATETYPE_SURFCMDS:
|
||||||
if (update_recv_surfcmds(update, size, s) < 0)
|
status = update_recv_surfcmds(update, size, s);
|
||||||
return FALSE;
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case FASTPATH_UPDATETYPE_PTR_NULL:
|
case FASTPATH_UPDATETYPE_PTR_NULL:
|
||||||
@ -246,25 +246,25 @@ static BOOL fastpath_recv_update(rdpFastPath* fastpath, BYTE updateCode, UINT32
|
|||||||
|
|
||||||
case FASTPATH_UPDATETYPE_PTR_POSITION:
|
case FASTPATH_UPDATETYPE_PTR_POSITION:
|
||||||
if (!update_read_pointer_position(s, &pointer->pointer_position))
|
if (!update_read_pointer_position(s, &pointer->pointer_position))
|
||||||
return FALSE;
|
return -1;
|
||||||
IFCALL(pointer->PointerPosition, context, &pointer->pointer_position);
|
IFCALL(pointer->PointerPosition, context, &pointer->pointer_position);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case FASTPATH_UPDATETYPE_COLOR:
|
case FASTPATH_UPDATETYPE_COLOR:
|
||||||
if (!update_read_pointer_color(s, &pointer->pointer_color))
|
if (!update_read_pointer_color(s, &pointer->pointer_color))
|
||||||
return FALSE;
|
return -1;
|
||||||
IFCALL(pointer->PointerColor, context, &pointer->pointer_color);
|
IFCALL(pointer->PointerColor, context, &pointer->pointer_color);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case FASTPATH_UPDATETYPE_CACHED:
|
case FASTPATH_UPDATETYPE_CACHED:
|
||||||
if (!update_read_pointer_cached(s, &pointer->pointer_cached))
|
if (!update_read_pointer_cached(s, &pointer->pointer_cached))
|
||||||
return FALSE;
|
return -1;
|
||||||
IFCALL(pointer->PointerCached, context, &pointer->pointer_cached);
|
IFCALL(pointer->PointerCached, context, &pointer->pointer_cached);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case FASTPATH_UPDATETYPE_POINTER:
|
case FASTPATH_UPDATETYPE_POINTER:
|
||||||
if (!update_read_pointer_new(s, &pointer->pointer_new))
|
if (!update_read_pointer_new(s, &pointer->pointer_new))
|
||||||
return FALSE;
|
return -1;
|
||||||
IFCALL(pointer->PointerNew, context, &pointer->pointer_new);
|
IFCALL(pointer->PointerNew, context, &pointer->pointer_new);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@ -273,11 +273,12 @@ static BOOL fastpath_recv_update(rdpFastPath* fastpath, BYTE updateCode, UINT32
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
return TRUE;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
static BOOL fastpath_recv_update_data(rdpFastPath* fastpath, STREAM* s)
|
static BOOL fastpath_recv_update_data(rdpFastPath* fastpath, STREAM* s)
|
||||||
{
|
{
|
||||||
|
int status;
|
||||||
UINT16 size;
|
UINT16 size;
|
||||||
int next_pos;
|
int next_pos;
|
||||||
UINT32 totalSize;
|
UINT32 totalSize;
|
||||||
@ -287,10 +288,11 @@ static BOOL fastpath_recv_update_data(rdpFastPath* fastpath, STREAM* s)
|
|||||||
BYTE compressionFlags;
|
BYTE compressionFlags;
|
||||||
STREAM* update_stream;
|
STREAM* update_stream;
|
||||||
STREAM* comp_stream;
|
STREAM* comp_stream;
|
||||||
rdpRdp *rdp;
|
rdpRdp* rdp;
|
||||||
UINT32 roff;
|
UINT32 roff;
|
||||||
UINT32 rlen;
|
UINT32 rlen;
|
||||||
|
|
||||||
|
status = 0;
|
||||||
rdp = fastpath->rdp;
|
rdp = fastpath->rdp;
|
||||||
|
|
||||||
fastpath_read_update_header(s, &updateCode, &fragmentation, &compression);
|
fastpath_read_update_header(s, &updateCode, &fragmentation, &compression);
|
||||||
@ -301,8 +303,10 @@ static BOOL fastpath_recv_update_data(rdpFastPath* fastpath, STREAM* s)
|
|||||||
compressionFlags = 0;
|
compressionFlags = 0;
|
||||||
|
|
||||||
stream_read_UINT16(s, size);
|
stream_read_UINT16(s, size);
|
||||||
if(stream_get_left(s) < size)
|
|
||||||
return FALSE;
|
if (stream_get_left(s) < size)
|
||||||
|
return -1;
|
||||||
|
|
||||||
next_pos = stream_get_pos(s) + size;
|
next_pos = stream_get_pos(s) + size;
|
||||||
comp_stream = s;
|
comp_stream = s;
|
||||||
|
|
||||||
@ -348,8 +352,10 @@ static BOOL fastpath_recv_update_data(rdpFastPath* fastpath, STREAM* s)
|
|||||||
|
|
||||||
if (update_stream)
|
if (update_stream)
|
||||||
{
|
{
|
||||||
if (!fastpath_recv_update(fastpath, updateCode, totalSize, update_stream))
|
status = fastpath_recv_update(fastpath, updateCode, totalSize, update_stream);
|
||||||
return FALSE;
|
|
||||||
|
if (status < 0)
|
||||||
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
stream_set_pos(s, next_pos);
|
stream_set_pos(s, next_pos);
|
||||||
@ -357,24 +363,25 @@ static BOOL fastpath_recv_update_data(rdpFastPath* fastpath, STREAM* s)
|
|||||||
if (comp_stream != s)
|
if (comp_stream != s)
|
||||||
free(comp_stream);
|
free(comp_stream);
|
||||||
|
|
||||||
return TRUE;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
int fastpath_recv_updates(rdpFastPath* fastpath, STREAM* s)
|
int fastpath_recv_updates(rdpFastPath* fastpath, STREAM* s)
|
||||||
{
|
{
|
||||||
|
int status = 0;
|
||||||
rdpUpdate* update = fastpath->rdp->update;
|
rdpUpdate* update = fastpath->rdp->update;
|
||||||
|
|
||||||
IFCALL(update->BeginPaint, update->context);
|
IFCALL(update->BeginPaint, update->context);
|
||||||
|
|
||||||
while (stream_get_left(s) >= 3)
|
while (stream_get_left(s) >= 3)
|
||||||
{
|
{
|
||||||
if (!fastpath_recv_update_data(fastpath, s))
|
if (fastpath_recv_update_data(fastpath, s) < 0)
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
IFCALL(update->EndPaint, update->context);
|
IFCALL(update->EndPaint, update->context);
|
||||||
|
|
||||||
return 0;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
static BOOL fastpath_read_input_event_header(STREAM* s, BYTE* eventFlags, BYTE* eventCode)
|
static BOOL fastpath_read_input_event_header(STREAM* s, BYTE* eventFlags, BYTE* eventCode)
|
||||||
|
@ -677,6 +677,7 @@ BOOL rdp_decrypt(rdpRdp* rdp, STREAM* s, int length, UINT16 securityFlags)
|
|||||||
|
|
||||||
if (stream_get_left(s) < 12)
|
if (stream_get_left(s) < 12)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
stream_read_UINT16(s, len); /* 0x10 */
|
stream_read_UINT16(s, len); /* 0x10 */
|
||||||
stream_read_BYTE(s, version); /* 0x1 */
|
stream_read_BYTE(s, version); /* 0x1 */
|
||||||
stream_read_BYTE(s, pad);
|
stream_read_BYTE(s, pad);
|
||||||
@ -781,7 +782,7 @@ static int rdp_recv_tpkt_pdu(rdpRdp* rdp, STREAM* s)
|
|||||||
|
|
||||||
if (channelId != MCS_GLOBAL_CHANNEL_ID)
|
if (channelId != MCS_GLOBAL_CHANNEL_ID)
|
||||||
{
|
{
|
||||||
if(!freerdp_channel_process(rdp->instance, s, channelId))
|
if (!freerdp_channel_process(rdp->instance, s, channelId))
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -789,8 +790,10 @@ static int rdp_recv_tpkt_pdu(rdpRdp* rdp, STREAM* s)
|
|||||||
while (stream_get_left(s) > 3)
|
while (stream_get_left(s) > 3)
|
||||||
{
|
{
|
||||||
stream_get_mark(s, nextp);
|
stream_get_mark(s, nextp);
|
||||||
|
|
||||||
if (!rdp_read_share_control_header(s, &pduLength, &pduType, &pduSource))
|
if (!rdp_read_share_control_header(s, &pduLength, &pduType, &pduSource))
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
nextp += pduLength;
|
nextp += pduLength;
|
||||||
|
|
||||||
rdp->settings->PduSource = pduSource;
|
rdp->settings->PduSource = pduSource;
|
||||||
@ -832,6 +835,7 @@ static int rdp_recv_fastpath_pdu(rdpRdp* rdp, STREAM* s)
|
|||||||
rdpFastPath* fastpath;
|
rdpFastPath* fastpath;
|
||||||
|
|
||||||
fastpath = rdp->fastpath;
|
fastpath = rdp->fastpath;
|
||||||
|
|
||||||
if (!fastpath_read_header_rdp(fastpath, s, &length))
|
if (!fastpath_read_header_rdp(fastpath, s, &length))
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
@ -844,6 +848,7 @@ static int rdp_recv_fastpath_pdu(rdpRdp* rdp, STREAM* s)
|
|||||||
if (fastpath->encryptionFlags & FASTPATH_OUTPUT_ENCRYPTED)
|
if (fastpath->encryptionFlags & FASTPATH_OUTPUT_ENCRYPTED)
|
||||||
{
|
{
|
||||||
UINT16 flags = (fastpath->encryptionFlags & FASTPATH_OUTPUT_SECURE_CHECKSUM) ? SEC_SECURE_CHECKSUM : 0;
|
UINT16 flags = (fastpath->encryptionFlags & FASTPATH_OUTPUT_SECURE_CHECKSUM) ? SEC_SECURE_CHECKSUM : 0;
|
||||||
|
|
||||||
if (!rdp_decrypt(rdp, s, length, flags))
|
if (!rdp_decrypt(rdp, s, length, flags))
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
@ -25,13 +25,14 @@
|
|||||||
|
|
||||||
#include "surface.h"
|
#include "surface.h"
|
||||||
|
|
||||||
static BOOL update_recv_surfcmd_surface_bits(rdpUpdate* update, STREAM* s, UINT32 *length)
|
static int update_recv_surfcmd_surface_bits(rdpUpdate* update, STREAM* s, UINT32 *length)
|
||||||
{
|
{
|
||||||
int pos;
|
int pos;
|
||||||
SURFACE_BITS_COMMAND* cmd = &update->surface_bits_command;
|
SURFACE_BITS_COMMAND* cmd = &update->surface_bits_command;
|
||||||
|
|
||||||
if(stream_get_left(s) < 20)
|
if (stream_get_left(s) < 20)
|
||||||
return FALSE;
|
return -1;
|
||||||
|
|
||||||
stream_read_UINT16(s, cmd->destLeft);
|
stream_read_UINT16(s, cmd->destLeft);
|
||||||
stream_read_UINT16(s, cmd->destTop);
|
stream_read_UINT16(s, cmd->destTop);
|
||||||
stream_read_UINT16(s, cmd->destRight);
|
stream_read_UINT16(s, cmd->destRight);
|
||||||
@ -42,17 +43,19 @@ static BOOL update_recv_surfcmd_surface_bits(rdpUpdate* update, STREAM* s, UINT3
|
|||||||
stream_read_UINT16(s, cmd->width);
|
stream_read_UINT16(s, cmd->width);
|
||||||
stream_read_UINT16(s, cmd->height);
|
stream_read_UINT16(s, cmd->height);
|
||||||
stream_read_UINT32(s, cmd->bitmapDataLength);
|
stream_read_UINT32(s, cmd->bitmapDataLength);
|
||||||
if(stream_get_left(s) < cmd->bitmapDataLength)
|
|
||||||
return FALSE;
|
if (stream_get_left(s) < cmd->bitmapDataLength)
|
||||||
|
return -1;
|
||||||
|
|
||||||
pos = stream_get_pos(s) + cmd->bitmapDataLength;
|
pos = stream_get_pos(s) + cmd->bitmapDataLength;
|
||||||
cmd->bitmapData = stream_get_tail(s);
|
cmd->bitmapData = stream_get_tail(s);
|
||||||
|
|
||||||
IFCALL(update->SurfaceBits, update->context, cmd);
|
IFCALL(update->SurfaceBits, update->context, cmd);
|
||||||
|
|
||||||
stream_set_pos(s, pos);
|
stream_set_pos(s, pos);
|
||||||
|
|
||||||
*length = 20 + cmd->bitmapDataLength;
|
*length = 20 + cmd->bitmapDataLength;
|
||||||
return TRUE;
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void update_send_frame_acknowledge(rdpRdp* rdp, UINT32 frameId)
|
static void update_send_frame_acknowledge(rdpRdp* rdp, UINT32 frameId)
|
||||||
@ -64,24 +67,28 @@ static void update_send_frame_acknowledge(rdpRdp* rdp, UINT32 frameId)
|
|||||||
rdp_send_data_pdu(rdp, s, DATA_PDU_TYPE_FRAME_ACKNOWLEDGE, rdp->mcs->user_id);
|
rdp_send_data_pdu(rdp, s, DATA_PDU_TYPE_FRAME_ACKNOWLEDGE, rdp->mcs->user_id);
|
||||||
}
|
}
|
||||||
|
|
||||||
static BOOL update_recv_surfcmd_frame_marker(rdpUpdate* update, STREAM* s, UINT32 *length)
|
static int update_recv_surfcmd_frame_marker(rdpUpdate* update, STREAM* s, UINT32 *length)
|
||||||
{
|
{
|
||||||
SURFACE_FRAME_MARKER* marker = &update->surface_frame_marker;
|
SURFACE_FRAME_MARKER* marker = &update->surface_frame_marker;
|
||||||
|
|
||||||
if(stream_get_left(s) < 6)
|
if (stream_get_left(s) < 6)
|
||||||
return FALSE;
|
return -1;
|
||||||
|
|
||||||
stream_read_UINT16(s, marker->frameAction);
|
stream_read_UINT16(s, marker->frameAction);
|
||||||
stream_read_UINT32(s, marker->frameId);
|
stream_read_UINT32(s, marker->frameId);
|
||||||
|
|
||||||
IFCALL(update->SurfaceFrameMarker, update->context, marker);
|
IFCALL(update->SurfaceFrameMarker, update->context, marker);
|
||||||
|
|
||||||
if (update->context->rdp->settings->ReceivedCapabilities[CAPSET_TYPE_FRAME_ACKNOWLEDGE] && update->context->rdp->settings->FrameAcknowledge > 0 && marker->frameAction == SURFACECMD_FRAMEACTION_END)
|
if (update->context->rdp->settings->ReceivedCapabilities[CAPSET_TYPE_FRAME_ACKNOWLEDGE] &&
|
||||||
|
(update->context->rdp->settings->FrameAcknowledge > 0) &&
|
||||||
|
(marker->frameAction == SURFACECMD_FRAMEACTION_END))
|
||||||
{
|
{
|
||||||
update_send_frame_acknowledge(update->context->rdp, marker->frameId);
|
update_send_frame_acknowledge(update->context->rdp, marker->frameId);
|
||||||
}
|
}
|
||||||
|
|
||||||
*length = 6;
|
*length = 6;
|
||||||
return TRUE;
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int update_recv_surfcmds(rdpUpdate* update, UINT32 size, STREAM* s)
|
int update_recv_surfcmds(rdpUpdate* update, UINT32 size, STREAM* s)
|
||||||
@ -101,12 +108,12 @@ int update_recv_surfcmds(rdpUpdate* update, UINT32 size, STREAM* s)
|
|||||||
{
|
{
|
||||||
case CMDTYPE_SET_SURFACE_BITS:
|
case CMDTYPE_SET_SURFACE_BITS:
|
||||||
case CMDTYPE_STREAM_SURFACE_BITS:
|
case CMDTYPE_STREAM_SURFACE_BITS:
|
||||||
if (!update_recv_surfcmd_surface_bits(update, s, &cmdLength))
|
if (update_recv_surfcmd_surface_bits(update, s, &cmdLength) < 0)
|
||||||
return -1;
|
return -1;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case CMDTYPE_FRAME_MARKER:
|
case CMDTYPE_FRAME_MARKER:
|
||||||
if (!update_recv_surfcmd_frame_marker(update, s, &cmdLength))
|
if (update_recv_surfcmd_frame_marker(update, s, &cmdLength) < 0)
|
||||||
return -1;
|
return -1;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user