Updating all error messages to use LOG instead of LOG_DEVEL, and adding s_check_rem_and_log()
This commit is contained in:
parent
5530c9107d
commit
0c677aaa5c
17
common/log.h
17
common/log.h
@ -22,6 +22,7 @@
|
|||||||
#include <pthread.h>
|
#include <pthread.h>
|
||||||
|
|
||||||
#include "arch.h"
|
#include "arch.h"
|
||||||
|
#include "defines.h"
|
||||||
#include "list.h"
|
#include "list.h"
|
||||||
|
|
||||||
/* logging buffer size */
|
/* logging buffer size */
|
||||||
@ -95,7 +96,7 @@ enum logReturns
|
|||||||
* @param ... the arguments for the printf format c-string
|
* @param ... the arguments for the printf format c-string
|
||||||
*/
|
*/
|
||||||
#define LOG_DEVEL(log_level, args...) \
|
#define LOG_DEVEL(log_level, args...) \
|
||||||
log_message_with_location(__func__, __FILE__, __LINE__, log_level, args);
|
log_message_with_location(__func__, __FILE__, __LINE__, log_level, args)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Logging macro for messages that are for a systeam administrator to
|
* @brief Logging macro for messages that are for a systeam administrator to
|
||||||
@ -109,7 +110,7 @@ enum logReturns
|
|||||||
* @param ... the arguments for the printf format c-string
|
* @param ... the arguments for the printf format c-string
|
||||||
*/
|
*/
|
||||||
#define LOG(log_level, args...) \
|
#define LOG(log_level, args...) \
|
||||||
log_message_with_location(__func__, __FILE__, __LINE__, log_level, args);
|
log_message_with_location(__func__, __FILE__, __LINE__, log_level, args)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Logging macro for logging the contents of a byte array using a hex
|
* @brief Logging macro for logging the contents of a byte array using a hex
|
||||||
@ -124,12 +125,16 @@ enum logReturns
|
|||||||
* @param length, the length of the byte array to log
|
* @param length, the length of the byte array to log
|
||||||
*/
|
*/
|
||||||
#define LOG_DEVEL_HEXDUMP(log_level, message, buffer, length) \
|
#define LOG_DEVEL_HEXDUMP(log_level, message, buffer, length) \
|
||||||
log_hexdump_with_location(__func__, __FILE__, __LINE__, log_level, message, buffer, length);
|
log_hexdump_with_location(__func__, __FILE__, __LINE__, log_level, message, buffer, length)
|
||||||
|
|
||||||
#else
|
#else
|
||||||
#define LOG_DEVEL(log_level, args...)
|
#define LOG(log_level, args...) log_message(log_level, args)
|
||||||
#define LOG(log_level, args...) log_message(log_level, args);
|
|
||||||
#define LOG_DEVEL_HEXDUMP(log_level, message, buffer, length)
|
/* Since log_message() returns a value ensure that the elided versions of
|
||||||
|
* LOG_DEVEL and LOG_DEVEL_HEXDUMP also "fake" returning the success value
|
||||||
|
*/
|
||||||
|
#define LOG_DEVEL(log_level, args...) UNUSED_VAR(LOG_STARTUP_OK)
|
||||||
|
#define LOG_DEVEL_HEXDUMP(log_level, message, buffer, length) UNUSED_VAR(LOG_STARTUP_OK)
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -26,6 +26,7 @@
|
|||||||
#define PARSE_H
|
#define PARSE_H
|
||||||
|
|
||||||
#include "arch.h"
|
#include "arch.h"
|
||||||
|
#include "log.h"
|
||||||
|
|
||||||
#if defined(L_ENDIAN)
|
#if defined(L_ENDIAN)
|
||||||
#elif defined(B_ENDIAN)
|
#elif defined(B_ENDIAN)
|
||||||
@ -54,17 +55,57 @@ struct stream
|
|||||||
};
|
};
|
||||||
|
|
||||||
/******************************************************************************/
|
/******************************************************************************/
|
||||||
#define s_check(s) ((s)->p <= (s)->end)
|
#define s_check(s) s_check_rem(s, 0)
|
||||||
|
|
||||||
/******************************************************************************/
|
/******************************************************************************/
|
||||||
#define s_check_rem(s, n) ((s)->p + (n) <= (s)->end)
|
#define s_check_rem(s, n) ((s)->p + (n) <= (s)->end)
|
||||||
|
|
||||||
|
/******************************************************************************/
|
||||||
|
/**
|
||||||
|
* @returns true if there are at least n bytes remaining in the stream,
|
||||||
|
* else false and logs an error message
|
||||||
|
*/
|
||||||
|
#define s_check_rem_and_log(s, n, msg_prefix) \
|
||||||
|
( s_check_rem((s), (n)) ? \
|
||||||
|
1 : \
|
||||||
|
LOG(LOG_LEVEL_ERROR, \
|
||||||
|
"%s Not enough bytes in the stream: expected %d, remaining %d", \
|
||||||
|
(msg_prefix), (n), s_rem(s)) \
|
||||||
|
&& 0 )
|
||||||
|
|
||||||
/******************************************************************************/
|
/******************************************************************************/
|
||||||
#define s_check_rem_out(s, n) ((s)->p + (n) <= (s)->data + (s)->size)
|
#define s_check_rem_out(s, n) ((s)->p + (n) <= (s)->data + (s)->size)
|
||||||
|
|
||||||
|
/******************************************************************************/
|
||||||
|
/**
|
||||||
|
* @returns true if there are at least n bytes remaining in the stream,
|
||||||
|
* else false and logs an error message
|
||||||
|
*/
|
||||||
|
#define s_check_rem_out_and_log(s, n, msg_prefix) \
|
||||||
|
( s_check_rem_out((s), (n)) ? \
|
||||||
|
1 : \
|
||||||
|
LOG(LOG_LEVEL_ERROR, \
|
||||||
|
"%s Not enough bytes in the stream: expected %d, remaining %d", \
|
||||||
|
(msg_prefix), (n), s_rem_out(s)) \
|
||||||
|
&& 0 )
|
||||||
|
|
||||||
/******************************************************************************/
|
/******************************************************************************/
|
||||||
#define s_check_end(s) ((s)->p == (s)->end)
|
#define s_check_end(s) ((s)->p == (s)->end)
|
||||||
|
|
||||||
|
/******************************************************************************/
|
||||||
|
/**
|
||||||
|
* @returns true if there are exactly 0 bytes remaining in the stream,
|
||||||
|
* else false and logs an error message
|
||||||
|
*/
|
||||||
|
#define s_check_end_and_log(s, msg_prefix) \
|
||||||
|
( s_check_end((s)) ? \
|
||||||
|
1 : \
|
||||||
|
LOG(LOG_LEVEL_ERROR, \
|
||||||
|
"%s Expected to be at the end of the stream, " \
|
||||||
|
"but there are %d bytes remaining", \
|
||||||
|
(msg_prefix), s_rem(s)) \
|
||||||
|
&& 0 )
|
||||||
|
|
||||||
/******************************************************************************/
|
/******************************************************************************/
|
||||||
#define s_rem(s) ((int) ((s)->end - (s)->p))
|
#define s_rem(s) ((int) ((s)->end - (s)->p))
|
||||||
|
|
||||||
|
@ -550,9 +550,9 @@ xrdp_codec_jpeg_compress(void *handle,
|
|||||||
int cy, /* height of area to compress */
|
int cy, /* height of area to compress */
|
||||||
int quality, /* higher numbers compress less */
|
int quality, /* higher numbers compress less */
|
||||||
char *out_data, /* dest for jpg image */
|
char *out_data, /* dest for jpg image */
|
||||||
int *io_len /* length of out_data and on return */
|
int *io_len /* length of out_data and on return
|
||||||
/* len of compressed data */
|
len of compressed data */
|
||||||
);
|
);
|
||||||
|
|
||||||
void *
|
void *
|
||||||
xrdp_jpeg_init(void);
|
xrdp_jpeg_init(void);
|
||||||
@ -560,7 +560,7 @@ int
|
|||||||
xrdp_jpeg_deinit(void *handle);
|
xrdp_jpeg_deinit(void *handle);
|
||||||
|
|
||||||
/* xrdp_channel.c */
|
/* xrdp_channel.c */
|
||||||
struct xrdp_channel*
|
struct xrdp_channel *
|
||||||
xrdp_channel_create(struct xrdp_sec *owner, struct xrdp_mcs *mcs_layer);
|
xrdp_channel_create(struct xrdp_sec *owner, struct xrdp_mcs *mcs_layer);
|
||||||
void
|
void
|
||||||
xrdp_channel_delete(struct xrdp_channel *self);
|
xrdp_channel_delete(struct xrdp_channel *self);
|
||||||
|
@ -668,29 +668,34 @@ xrdp_caps_process_confirm_active(struct xrdp_rdp *self, struct stream *s)
|
|||||||
|
|
||||||
if ((cap_len < 0) || (cap_len > 1024 * 1024))
|
if ((cap_len < 0) || (cap_len > 1024 * 1024))
|
||||||
{
|
{
|
||||||
LOG_DEVEL(LOG_LEVEL_ERROR, "Received [MS-RDPBCGR] TS_CONFIRM_ACTIVE_PDU "
|
LOG(LOG_LEVEL_ERROR, "Received [MS-RDPBCGR] TS_CONFIRM_ACTIVE_PDU "
|
||||||
"lengthCombinedCapabilities %d is too long (> %d)",
|
"lengthCombinedCapabilities %d is too long (> %d)",
|
||||||
cap_len, 1024 * 1024);
|
cap_len, 1024 * 1024);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (index = 0; index < num_caps; index++)
|
for (index = 0; index < num_caps; index++)
|
||||||
{
|
{
|
||||||
p = s->p;
|
p = s->p;
|
||||||
if (!s_check_rem(s, 4))
|
if (!s_check_rem_and_log(s, 4,
|
||||||
|
"Parsing [MS-RDPBCGR] TS_CONFIRM_ACTIVE_PDU - TS_CAPS_SET"))
|
||||||
{
|
{
|
||||||
LOG(LOG_LEVEL_ERROR, "Not enough bytes in the stream: "
|
|
||||||
"len 4, remaining %d", s_rem(s));
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
in_uint16_le(s, type);
|
in_uint16_le(s, type);
|
||||||
in_uint16_le(s, len);
|
in_uint16_le(s, len);
|
||||||
LOG_DEVEL(LOG_LEVEL_TRACE, "Received [MS-RDPBCGR] TS_CONFIRM_ACTIVE_PDU - TS_CAPS_SET "
|
LOG_DEVEL(LOG_LEVEL_TRACE, "Received [MS-RDPBCGR] TS_CONFIRM_ACTIVE_PDU - TS_CAPS_SET "
|
||||||
"capabilitySetType %d, lengthCapability %d", type, len);
|
"capabilitySetType %d, lengthCapability %d", type, len);
|
||||||
if ((len < 4) || !s_check_rem(s, len - 4))
|
if (len < 4)
|
||||||
|
{
|
||||||
|
LOG(LOG_LEVEL_ERROR,
|
||||||
|
"Protocol error [MS-RDPBCGR] TS_CONFIRM_ACTIVE_PDU - TS_CAPS_SET "
|
||||||
|
"lengthCapability must be greater than 3, received %d", len);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
if (!s_check_rem_and_log(s, len - 4,
|
||||||
|
"Parsing [MS-RDPBCGR] TS_CONFIRM_ACTIVE_PDU - TS_CAPS_SET "))
|
||||||
{
|
{
|
||||||
LOG(LOG_LEVEL_ERROR, "Not enough bytes in the stream: "
|
|
||||||
"len %d, remaining %d", (len - 4), s_rem(s));
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
len -= 4;
|
len -= 4;
|
||||||
@ -861,7 +866,7 @@ xrdp_caps_send_demand_active(struct xrdp_rdp *self)
|
|||||||
|
|
||||||
if (xrdp_rdp_init(self, s) != 0)
|
if (xrdp_rdp_init(self, s) != 0)
|
||||||
{
|
{
|
||||||
LOG_DEVEL(LOG_LEVEL_ERROR, "xrdp_caps_send_demand_active: xrdp_rdp_init failed");
|
LOG(LOG_LEVEL_ERROR, "xrdp_caps_send_demand_active: xrdp_rdp_init failed");
|
||||||
free_stream(s);
|
free_stream(s);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
@ -1178,7 +1183,7 @@ xrdp_caps_send_demand_active(struct xrdp_rdp *self)
|
|||||||
"message with the server's capabilities");
|
"message with the server's capabilities");
|
||||||
if (xrdp_rdp_send(self, s, PDUTYPE_DEMANDACTIVEPDU) != 0)
|
if (xrdp_rdp_send(self, s, PDUTYPE_DEMANDACTIVEPDU) != 0)
|
||||||
{
|
{
|
||||||
LOG_DEVEL(LOG_LEVEL_ERROR, "xrdp_caps_send_demand_active: xrdp_rdp_send failed");
|
LOG(LOG_LEVEL_ERROR, "xrdp_caps_send_demand_active: xrdp_rdp_send failed");
|
||||||
free_stream(s);
|
free_stream(s);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
@ -108,7 +108,7 @@ xrdp_channel_init(struct xrdp_channel *self, struct stream *s)
|
|||||||
{
|
{
|
||||||
if (xrdp_sec_init(self->sec_layer, s) != 0)
|
if (xrdp_sec_init(self->sec_layer, s) != 0)
|
||||||
{
|
{
|
||||||
LOG_DEVEL(LOG_LEVEL_ERROR, "xrdp_channel_init: xrdp_sec_init failed");
|
LOG(LOG_LEVEL_ERROR, "xrdp_channel_init: xrdp_sec_init failed");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -270,30 +270,24 @@ drdynvc_get_chan_id(struct stream *s, char cmd, uint32_t *chan_id_p)
|
|||||||
cbChId = cmd & 0x03;
|
cbChId = cmd & 0x03;
|
||||||
if (cbChId == 0)
|
if (cbChId == 0)
|
||||||
{
|
{
|
||||||
if (!s_check_rem(s, 1))
|
if (!s_check_rem_and_log(s, 1, "Parsing [MS-RDPEDYC] channel id"))
|
||||||
{
|
{
|
||||||
LOG_DEVEL(LOG_LEVEL_ERROR, "Not enough bytes in the stream, "
|
|
||||||
"len 1, remaining %d", s_rem(s));
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
in_uint8(s, chan_id);
|
in_uint8(s, chan_id);
|
||||||
}
|
}
|
||||||
else if (cbChId == 1)
|
else if (cbChId == 1)
|
||||||
{
|
{
|
||||||
if (!s_check_rem(s, 2))
|
if (!s_check_rem_and_log(s, 2, "Parsing [MS-RDPEDYC] channel id"))
|
||||||
{
|
{
|
||||||
LOG_DEVEL(LOG_LEVEL_ERROR, "Not enough bytes in the stream, "
|
|
||||||
"len 2, remaining %d", s_rem(s));
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
in_uint16_le(s, chan_id);
|
in_uint16_le(s, chan_id);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (!s_check_rem(s, 4))
|
if (!s_check_rem_and_log(s, 4, "Parsing [MS-RDPEDYC] channel id"))
|
||||||
{
|
{
|
||||||
LOG_DEVEL(LOG_LEVEL_ERROR, "Not enough bytes in the stream, "
|
|
||||||
"len 4, remaining %d", s_rem(s));
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
in_uint32_le(s, chan_id);
|
in_uint32_le(s, chan_id);
|
||||||
@ -314,6 +308,10 @@ drdynvc_process_capability_response(struct xrdp_channel *self,
|
|||||||
int cap_version;
|
int cap_version;
|
||||||
int rv;
|
int rv;
|
||||||
|
|
||||||
|
if (!s_check_rem_and_log(s, 3, "Parsing [MS-RDPEDYC] DYNVC_CAPS_RSP"))
|
||||||
|
{
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
in_uint8s(s, 1); /* skip padding */
|
in_uint8s(s, 1); /* skip padding */
|
||||||
in_uint16_le(s, cap_version); /* Version */
|
in_uint16_le(s, cap_version); /* Version */
|
||||||
LOG_DEVEL(LOG_LEVEL_TRACE, "Received [MS-RDPEDYC] DYNVC_CAPS_RSP "
|
LOG_DEVEL(LOG_LEVEL_TRACE, "Received [MS-RDPEDYC] DYNVC_CAPS_RSP "
|
||||||
@ -347,14 +345,12 @@ drdynvc_process_open_channel_response(struct xrdp_channel *self,
|
|||||||
|
|
||||||
if (drdynvc_get_chan_id(s, cmd, &chan_id) != 0) /* ChannelId */
|
if (drdynvc_get_chan_id(s, cmd, &chan_id) != 0) /* ChannelId */
|
||||||
{
|
{
|
||||||
LOG_DEVEL(LOG_LEVEL_ERROR,
|
LOG(LOG_LEVEL_ERROR,
|
||||||
"drdynvc_process_open_channel_response: drdynvc_get_chan_id failed");
|
"Parsing [MS-RDPEDYC] DYNVC_CREATE_RSP failed");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
if (!s_check_rem(s, 4))
|
if (!s_check_rem_and_log(s, 4, "Parsing [MS-RDPEDYC] DYNVC_CREATE_RSP"))
|
||||||
{
|
{
|
||||||
LOG_DEVEL(LOG_LEVEL_ERROR, "Not enough bytes in the stream, "
|
|
||||||
"len 4, remaining %d", s_rem(s));
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
in_uint32_le(s, creation_status); /* CreationStatus */
|
in_uint32_le(s, creation_status); /* CreationStatus */
|
||||||
@ -362,8 +358,8 @@ drdynvc_process_open_channel_response(struct xrdp_channel *self,
|
|||||||
"ChannelId %d, CreationStatus %d", chan_id, creation_status);
|
"ChannelId %d, CreationStatus %d", chan_id, creation_status);
|
||||||
if (chan_id > 255)
|
if (chan_id > 255)
|
||||||
{
|
{
|
||||||
LOG_DEVEL(LOG_LEVEL_ERROR, "Received message for an invalid "
|
LOG(LOG_LEVEL_ERROR, "Received [MS-RDPEDYC] DYNVC_CREATE_RSP for an "
|
||||||
"channel id. channel id %d", chan_id);
|
"invalid channel id. Max allowed 255, received %d", chan_id);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -407,8 +403,8 @@ drdynvc_process_close_channel_response(struct xrdp_channel *self,
|
|||||||
|
|
||||||
if (drdynvc_get_chan_id(s, cmd, &chan_id) != 0) /* ChannelId */
|
if (drdynvc_get_chan_id(s, cmd, &chan_id) != 0) /* ChannelId */
|
||||||
{
|
{
|
||||||
LOG_DEVEL(LOG_LEVEL_ERROR,
|
LOG(LOG_LEVEL_ERROR,
|
||||||
"drdynvc_process_close_channel_response: drdynvc_get_chan_id failed");
|
"drdynvc_process_close_channel_response: drdynvc_get_chan_id failed");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
LOG_DEVEL(LOG_LEVEL_TRACE, "Received [MS-RDPEDYC] DYNVC_CLOSE "
|
LOG_DEVEL(LOG_LEVEL_TRACE, "Received [MS-RDPEDYC] DYNVC_CLOSE "
|
||||||
@ -416,8 +412,8 @@ drdynvc_process_close_channel_response(struct xrdp_channel *self,
|
|||||||
session = self->sec_layer->rdp_layer->session;
|
session = self->sec_layer->rdp_layer->session;
|
||||||
if (chan_id > 255)
|
if (chan_id > 255)
|
||||||
{
|
{
|
||||||
LOG_DEVEL(LOG_LEVEL_ERROR, "Received message for an invalid "
|
LOG(LOG_LEVEL_ERROR, "Received message for an invalid "
|
||||||
"channel id. channel id %d", chan_id);
|
"channel id. channel id %d", chan_id);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -457,37 +453,31 @@ drdynvc_process_data_first(struct xrdp_channel *self,
|
|||||||
|
|
||||||
if (drdynvc_get_chan_id(s, cmd, &chan_id) != 0) /* ChannelId */
|
if (drdynvc_get_chan_id(s, cmd, &chan_id) != 0) /* ChannelId */
|
||||||
{
|
{
|
||||||
LOG_DEVEL(LOG_LEVEL_ERROR,
|
LOG(LOG_LEVEL_ERROR,
|
||||||
"drdynvc_process_data_first: drdynvc_get_chan_id failed");
|
"Parsing [MS-RDPEDYC] DYNVC_DATA_FIRST failed");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
len = (cmd >> 2) & 0x03;
|
len = (cmd >> 2) & 0x03;
|
||||||
if (len == 0)
|
if (len == 0)
|
||||||
{
|
{
|
||||||
if (!s_check_rem(s, 1))
|
if (!s_check_rem_and_log(s, 1, "Parsing [MS-RDPEDYC] DYNVC_DATA_FIRST"))
|
||||||
{
|
{
|
||||||
LOG_DEVEL(LOG_LEVEL_ERROR, "Not enough bytes in the stream, "
|
|
||||||
"len 1, remaining %d", s_rem(s));
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
in_uint8(s, total_bytes); /* Length */
|
in_uint8(s, total_bytes); /* Length */
|
||||||
}
|
}
|
||||||
else if (len == 1)
|
else if (len == 1)
|
||||||
{
|
{
|
||||||
if (!s_check_rem(s, 2))
|
if (!s_check_rem_and_log(s, 2, "Parsing [MS-RDPEDYC] DYNVC_DATA_FIRST"))
|
||||||
{
|
{
|
||||||
LOG_DEVEL(LOG_LEVEL_ERROR, "Not enough bytes in the stream, "
|
|
||||||
"len 2, remaining %d", s_rem(s));
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
in_uint16_le(s, total_bytes); /* Length */
|
in_uint16_le(s, total_bytes); /* Length */
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (!s_check_rem(s, 4))
|
if (!s_check_rem_and_log(s, 4, "Parsing [MS-RDPEDYC] DYNVC_DATA_FIRST"))
|
||||||
{
|
{
|
||||||
LOG_DEVEL(LOG_LEVEL_ERROR, "Not enough bytes in the stream, "
|
|
||||||
"len 4, remaining %d", s_rem(s));
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
in_uint32_le(s, total_bytes); /* Length */
|
in_uint32_le(s, total_bytes); /* Length */
|
||||||
@ -500,8 +490,8 @@ drdynvc_process_data_first(struct xrdp_channel *self,
|
|||||||
session = self->sec_layer->rdp_layer->session;
|
session = self->sec_layer->rdp_layer->session;
|
||||||
if (chan_id > 255)
|
if (chan_id > 255)
|
||||||
{
|
{
|
||||||
LOG_DEVEL(LOG_LEVEL_ERROR, "Received message for an invalid "
|
LOG(LOG_LEVEL_ERROR, "Received [MS-RDPEDYC] DYNVC_DATA_FIRST for an "
|
||||||
"channel id. channel id %d", chan_id);
|
"invalid channel id. Max allowed 255, received %d", chan_id);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
drdynvc = self->drdynvcs + chan_id;
|
drdynvc = self->drdynvcs + chan_id;
|
||||||
@ -532,7 +522,7 @@ drdynvc_process_data(struct xrdp_channel *self,
|
|||||||
|
|
||||||
if (drdynvc_get_chan_id(s, cmd, &chan_id) != 0) /* ChannelId */
|
if (drdynvc_get_chan_id(s, cmd, &chan_id) != 0) /* ChannelId */
|
||||||
{
|
{
|
||||||
LOG_DEVEL(LOG_LEVEL_ERROR, "drdynvc_process_data: drdynvc_get_chan_id failed");
|
LOG(LOG_LEVEL_ERROR, "drdynvc_process_data: drdynvc_get_chan_id failed");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
bytes = (int) (s->end - s->p);
|
bytes = (int) (s->end - s->p);
|
||||||
@ -542,8 +532,8 @@ drdynvc_process_data(struct xrdp_channel *self,
|
|||||||
session = self->sec_layer->rdp_layer->session;
|
session = self->sec_layer->rdp_layer->session;
|
||||||
if (chan_id > 255)
|
if (chan_id > 255)
|
||||||
{
|
{
|
||||||
LOG_DEVEL(LOG_LEVEL_ERROR, "Received message for an invalid "
|
LOG(LOG_LEVEL_ERROR, "Received message for an invalid "
|
||||||
"channel id. channel id %d", chan_id);
|
"channel id. channel id %d", chan_id);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
drdynvc = self->drdynvcs + chan_id;
|
drdynvc = self->drdynvcs + chan_id;
|
||||||
@ -575,10 +565,8 @@ xrdp_channel_process_drdynvc(struct xrdp_channel *self,
|
|||||||
int rv;
|
int rv;
|
||||||
struct stream *ls;
|
struct stream *ls;
|
||||||
|
|
||||||
if (!s_check_rem(s, 8))
|
if (!s_check_rem_and_log(s, 8, "Parsing [MS-RDPBCGR] CHANNEL_PDU_HEADER"))
|
||||||
{
|
{
|
||||||
LOG_DEVEL(LOG_LEVEL_ERROR, "Not enough bytes in the stream, "
|
|
||||||
"len 8, remaining %d", s_rem(s));
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
in_uint32_le(s, total_length); /* length */
|
in_uint32_le(s, total_length); /* length */
|
||||||
@ -594,9 +582,9 @@ xrdp_channel_process_drdynvc(struct xrdp_channel *self,
|
|||||||
"length %d", length);
|
"length %d", length);
|
||||||
if (length > s_rem_out(self->s))
|
if (length > s_rem_out(self->s))
|
||||||
{
|
{
|
||||||
LOG_DEVEL(LOG_LEVEL_ERROR, "Data chunk length is bigger than "
|
LOG(LOG_LEVEL_ERROR, "[MS-RDPBCGR] Data chunk length is bigger than "
|
||||||
"the remaining chunk buffer size. length %d, reaiming %d",
|
"the remaining chunk buffer size. length %d, remaining %d",
|
||||||
length, s_rem_out(self->s));
|
length, s_rem_out(self->s));
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
out_uint8a(self->s, s->p, length); /* append data to chunk buffer */
|
out_uint8a(self->s, s->p, length); /* append data to chunk buffer */
|
||||||
@ -611,9 +599,9 @@ xrdp_channel_process_drdynvc(struct xrdp_channel *self,
|
|||||||
"length %d", length);
|
"length %d", length);
|
||||||
if (length > s_rem_out(self->s))
|
if (length > s_rem_out(self->s))
|
||||||
{
|
{
|
||||||
LOG_DEVEL(LOG_LEVEL_ERROR, "Data chunk length is bigger than "
|
LOG(LOG_LEVEL_ERROR, "[MS-RDPBCGR] Data chunk length is bigger than "
|
||||||
"the remaining chunk buffer size. length %d, reaiming %d",
|
"the remaining chunk buffer size. length %d, remaining %d",
|
||||||
length, s_rem_out(self->s));
|
length, s_rem_out(self->s));
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
out_uint8a(self->s, s->p, length); /* append data to chunk buffer */
|
out_uint8a(self->s, s->p, length); /* append data to chunk buffer */
|
||||||
@ -625,9 +613,9 @@ xrdp_channel_process_drdynvc(struct xrdp_channel *self,
|
|||||||
"length %d", length);
|
"length %d", length);
|
||||||
if (length > s_rem_out(self->s))
|
if (length > s_rem_out(self->s))
|
||||||
{
|
{
|
||||||
LOG_DEVEL(LOG_LEVEL_ERROR, "Data chunk length is bigger than "
|
LOG(LOG_LEVEL_ERROR, "[MS-RDPBCGR] Data chunk length is bigger than "
|
||||||
"the remaining chunk buffer size. length %d, reaiming %d",
|
"the remaining chunk buffer size. length %d, remaining %d",
|
||||||
length, s_rem_out(self->s));
|
length, s_rem_out(self->s));
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
out_uint8a(self->s, s->p, length); /* append data to chunk buffer */
|
out_uint8a(self->s, s->p, length); /* append data to chunk buffer */
|
||||||
@ -646,7 +634,7 @@ xrdp_channel_process_drdynvc(struct xrdp_channel *self,
|
|||||||
}
|
}
|
||||||
if (ls == NULL)
|
if (ls == NULL)
|
||||||
{
|
{
|
||||||
LOG_DEVEL(LOG_LEVEL_ERROR, "BUG: ls must not be NULL");
|
LOG(LOG_LEVEL_ERROR, "BUG: ls must not be NULL");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
in_uint8(ls, cmd); /* cbId (low 2 bits), Sp (2 bits), Cmd (hi 4 bits) */
|
in_uint8(ls, cmd); /* cbId (low 2 bits), Sp (2 bits), Cmd (hi 4 bits) */
|
||||||
@ -672,8 +660,8 @@ xrdp_channel_process_drdynvc(struct xrdp_channel *self,
|
|||||||
rv = drdynvc_process_data(self, cmd, s);
|
rv = drdynvc_process_data(self, cmd, s);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
LOG_DEVEL(LOG_LEVEL_ERROR, "Received header [MS-RDPEDYC] with "
|
LOG(LOG_LEVEL_ERROR, "Received header [MS-RDPEDYC] with "
|
||||||
"unknown command 0x%2.2x", cmd);
|
"unknown command 0x%2.2x", cmd);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
return rv;
|
return rv;
|
||||||
@ -746,8 +734,8 @@ xrdp_channel_drdynvc_send_capability_request(struct xrdp_channel *self)
|
|||||||
init_stream(s, 8192);
|
init_stream(s, 8192);
|
||||||
if (xrdp_channel_init(self, s) != 0)
|
if (xrdp_channel_init(self, s) != 0)
|
||||||
{
|
{
|
||||||
LOG_DEVEL(LOG_LEVEL_ERROR,
|
LOG(LOG_LEVEL_ERROR,
|
||||||
"xrdp_channel_drdynvc_send_capability_request: xrdp_channel_init failed");
|
"xrdp_channel_drdynvc_send_capability_request: xrdp_channel_init failed");
|
||||||
free_stream(s);
|
free_stream(s);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
@ -770,8 +758,8 @@ xrdp_channel_drdynvc_send_capability_request(struct xrdp_channel *self)
|
|||||||
"PriorityCharge1 0, PriorityCharge2 0, PriorityCharge3 0");
|
"PriorityCharge1 0, PriorityCharge2 0, PriorityCharge3 0");
|
||||||
if (xrdp_channel_send(self, s, channel_id, total_data_len, flags) != 0)
|
if (xrdp_channel_send(self, s, channel_id, total_data_len, flags) != 0)
|
||||||
{
|
{
|
||||||
LOG_DEVEL(LOG_LEVEL_ERROR,
|
LOG(LOG_LEVEL_ERROR,
|
||||||
"xrdp_channel_drdynvc_send_capability_request: xrdp_channel_send failed");
|
"xrdp_channel_drdynvc_send_capability_request: xrdp_channel_send failed");
|
||||||
free_stream(s);
|
free_stream(s);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
@ -813,9 +801,9 @@ xrdp_channel_drdynvc_start(struct xrdp_channel *self)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
LOG_DEVEL(LOG_LEVEL_WARNING,
|
LOG(LOG_LEVEL_WARNING,
|
||||||
"Dynamic Virtual Channel named 'drdynvc' not found, "
|
"Dynamic Virtual Channel named 'drdynvc' not found, "
|
||||||
"channel not initialized");
|
"channel not initialized");
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -843,8 +831,8 @@ xrdp_channel_drdynvc_open(struct xrdp_channel *self, const char *name,
|
|||||||
init_stream(s, 8192);
|
init_stream(s, 8192);
|
||||||
if (xrdp_channel_init(self, s) != 0)
|
if (xrdp_channel_init(self, s) != 0)
|
||||||
{
|
{
|
||||||
LOG_DEVEL(LOG_LEVEL_ERROR,
|
LOG(LOG_LEVEL_ERROR,
|
||||||
"xrdp_channel_drdynvc_open: xrdp_channel_init failed");
|
"xrdp_channel_drdynvc_open: xrdp_channel_init failed");
|
||||||
free_stream(s);
|
free_stream(s);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
@ -856,10 +844,10 @@ xrdp_channel_drdynvc_open(struct xrdp_channel *self, const char *name,
|
|||||||
ChId++;
|
ChId++;
|
||||||
if (ChId > 255)
|
if (ChId > 255)
|
||||||
{
|
{
|
||||||
LOG_DEVEL(LOG_LEVEL_ERROR,
|
LOG(LOG_LEVEL_ERROR,
|
||||||
"Attempting to create a new channel when the maximum "
|
"Attempting to create a new channel when the maximum "
|
||||||
"number of chanels have already been created. "
|
"number of channels have already been created. "
|
||||||
"XRDP only supports 255 open channels.");
|
"XRDP only supports 255 open channels.");
|
||||||
free_stream(s);
|
free_stream(s);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
@ -881,8 +869,8 @@ xrdp_channel_drdynvc_open(struct xrdp_channel *self, const char *name,
|
|||||||
if (xrdp_channel_send(self, s, static_channel_id, total_data_len,
|
if (xrdp_channel_send(self, s, static_channel_id, total_data_len,
|
||||||
static_flags) != 0)
|
static_flags) != 0)
|
||||||
{
|
{
|
||||||
LOG_DEVEL(LOG_LEVEL_ERROR,
|
LOG(LOG_LEVEL_ERROR,
|
||||||
"xrdp_channel_drdynvc_open: xrdp_channel_send failed");
|
"Sending [MS-RDPEDYC] DYNVC_CREATE_REQ failed");
|
||||||
free_stream(s);
|
free_stream(s);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
@ -913,26 +901,26 @@ xrdp_channel_drdynvc_close(struct xrdp_channel *self, int chan_id)
|
|||||||
|
|
||||||
if ((chan_id < 0) || (chan_id > 255))
|
if ((chan_id < 0) || (chan_id > 255))
|
||||||
{
|
{
|
||||||
LOG_DEVEL(LOG_LEVEL_ERROR, "Attempting to close an invalid channel id. "
|
LOG(LOG_LEVEL_ERROR, "Attempting to close an invalid channel id. "
|
||||||
"channel id %d", chan_id);
|
"channel id %d", chan_id);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
if ((self->drdynvcs[chan_id].status != XRDP_DRDYNVC_STATUS_OPEN) &&
|
if ((self->drdynvcs[chan_id].status != XRDP_DRDYNVC_STATUS_OPEN) &&
|
||||||
(self->drdynvcs[chan_id].status != XRDP_DRDYNVC_STATUS_OPEN_SENT))
|
(self->drdynvcs[chan_id].status != XRDP_DRDYNVC_STATUS_OPEN_SENT))
|
||||||
{
|
{
|
||||||
/* not open */
|
/* not open */
|
||||||
LOG_DEVEL(LOG_LEVEL_ERROR, "Attempting to close a channel that is not open. "
|
LOG(LOG_LEVEL_ERROR, "Attempting to close a channel that is not open. "
|
||||||
"channel id %d, channel status %s",
|
"channel id %d, channel status %s",
|
||||||
chan_id,
|
chan_id,
|
||||||
XRDP_DRDYNVC_STATUS_TO_STR(self->drdynvcs[chan_id].status));
|
XRDP_DRDYNVC_STATUS_TO_STR(self->drdynvcs[chan_id].status));
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
make_stream(s);
|
make_stream(s);
|
||||||
init_stream(s, 8192);
|
init_stream(s, 8192);
|
||||||
if (xrdp_channel_init(self, s) != 0)
|
if (xrdp_channel_init(self, s) != 0)
|
||||||
{
|
{
|
||||||
LOG_DEVEL(LOG_LEVEL_ERROR,
|
LOG(LOG_LEVEL_ERROR,
|
||||||
"xrdp_channel_drdynvc_close: xrdp_channel_init failed");
|
"xrdp_channel_drdynvc_close: xrdp_channel_init failed");
|
||||||
free_stream(s);
|
free_stream(s);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
@ -953,8 +941,8 @@ xrdp_channel_drdynvc_close(struct xrdp_channel *self, int chan_id)
|
|||||||
if (xrdp_channel_send(self, s, static_channel_id, total_data_len,
|
if (xrdp_channel_send(self, s, static_channel_id, total_data_len,
|
||||||
static_flags) != 0)
|
static_flags) != 0)
|
||||||
{
|
{
|
||||||
LOG_DEVEL(LOG_LEVEL_ERROR,
|
LOG(LOG_LEVEL_ERROR,
|
||||||
"xrdp_channel_drdynvc_open: xrdp_channel_send failed");
|
"xrdp_channel_drdynvc_open: xrdp_channel_send failed");
|
||||||
free_stream(s);
|
free_stream(s);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
@ -983,30 +971,30 @@ xrdp_channel_drdynvc_data_first(struct xrdp_channel *self, int chan_id,
|
|||||||
|
|
||||||
if ((chan_id < 0) || (chan_id > 255))
|
if ((chan_id < 0) || (chan_id > 255))
|
||||||
{
|
{
|
||||||
LOG_DEVEL(LOG_LEVEL_ERROR, "Attempting to send data to an invalid "
|
LOG(LOG_LEVEL_ERROR, "Attempting to send data to an invalid "
|
||||||
"channel id. channel id %d", chan_id);
|
"channel id. channel id %d", chan_id);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
if (self->drdynvcs[chan_id].status != XRDP_DRDYNVC_STATUS_OPEN)
|
if (self->drdynvcs[chan_id].status != XRDP_DRDYNVC_STATUS_OPEN)
|
||||||
{
|
{
|
||||||
LOG_DEVEL(LOG_LEVEL_ERROR, "Attempting to send data to a channel that "
|
LOG(LOG_LEVEL_ERROR, "Attempting to send data to a channel that "
|
||||||
"is not open. channel id %d, channel status %s",
|
"is not open. channel id %d, channel status %s",
|
||||||
chan_id,
|
chan_id,
|
||||||
XRDP_DRDYNVC_STATUS_TO_STR(self->drdynvcs[chan_id].status));
|
XRDP_DRDYNVC_STATUS_TO_STR(self->drdynvcs[chan_id].status));
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
if (data_bytes > 1590)
|
if (data_bytes > 1590)
|
||||||
{
|
{
|
||||||
LOG_DEVEL(LOG_LEVEL_ERROR, "Payload for channel id %d is is too big. "
|
LOG(LOG_LEVEL_ERROR, "Payload for channel id %d is is too big. "
|
||||||
"data_bytes %d", chan_id, data_bytes);
|
"data_bytes %d", chan_id, data_bytes);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
make_stream(s);
|
make_stream(s);
|
||||||
init_stream(s, 8192);
|
init_stream(s, 8192);
|
||||||
if (xrdp_channel_init(self, s) != 0)
|
if (xrdp_channel_init(self, s) != 0)
|
||||||
{
|
{
|
||||||
LOG_DEVEL(LOG_LEVEL_ERROR,
|
LOG(LOG_LEVEL_ERROR,
|
||||||
"xrdp_channel_drdynvc_data_first: xrdp_channel_init failed");
|
"xrdp_channel_drdynvc_data_first: xrdp_channel_init failed");
|
||||||
free_stream(s);
|
free_stream(s);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
@ -1028,8 +1016,8 @@ xrdp_channel_drdynvc_data_first(struct xrdp_channel *self, int chan_id,
|
|||||||
if (xrdp_channel_send(self, s, static_channel_id, total_data_len,
|
if (xrdp_channel_send(self, s, static_channel_id, total_data_len,
|
||||||
static_flags) != 0)
|
static_flags) != 0)
|
||||||
{
|
{
|
||||||
LOG_DEVEL(LOG_LEVEL_ERROR,
|
LOG(LOG_LEVEL_ERROR,
|
||||||
"xrdp_channel_drdynvc_data_first: xrdp_channel_send failed");
|
"xrdp_channel_drdynvc_data_first: xrdp_channel_send failed");
|
||||||
free_stream(s);
|
free_stream(s);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
@ -1055,30 +1043,30 @@ xrdp_channel_drdynvc_data(struct xrdp_channel *self, int chan_id,
|
|||||||
|
|
||||||
if ((chan_id < 0) || (chan_id > 255))
|
if ((chan_id < 0) || (chan_id > 255))
|
||||||
{
|
{
|
||||||
LOG_DEVEL(LOG_LEVEL_ERROR, "Attempting to send data to an invalid "
|
LOG(LOG_LEVEL_ERROR, "Attempting to send data to an invalid "
|
||||||
"channel id. channel id %d", chan_id);
|
"channel id. channel id %d", chan_id);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
if (self->drdynvcs[chan_id].status != XRDP_DRDYNVC_STATUS_OPEN)
|
if (self->drdynvcs[chan_id].status != XRDP_DRDYNVC_STATUS_OPEN)
|
||||||
{
|
{
|
||||||
LOG_DEVEL(LOG_LEVEL_ERROR, "Attempting to send data to a channel that "
|
LOG(LOG_LEVEL_ERROR, "Attempting to send data to a channel that "
|
||||||
"is not open. channel id %d, channel status %s",
|
"is not open. channel id %d, channel status %s",
|
||||||
chan_id,
|
chan_id,
|
||||||
XRDP_DRDYNVC_STATUS_TO_STR(self->drdynvcs[chan_id].status));
|
XRDP_DRDYNVC_STATUS_TO_STR(self->drdynvcs[chan_id].status));
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
if (data_bytes > 1590)
|
if (data_bytes > 1590)
|
||||||
{
|
{
|
||||||
LOG_DEVEL(LOG_LEVEL_ERROR, "Payload for channel id %d is is too big. "
|
LOG(LOG_LEVEL_ERROR, "Payload for channel id %d is is too big. "
|
||||||
"data_bytes %d", chan_id, data_bytes);
|
"data_bytes %d", chan_id, data_bytes);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
make_stream(s);
|
make_stream(s);
|
||||||
init_stream(s, 8192);
|
init_stream(s, 8192);
|
||||||
if (xrdp_channel_init(self, s) != 0)
|
if (xrdp_channel_init(self, s) != 0)
|
||||||
{
|
{
|
||||||
LOG_DEVEL(LOG_LEVEL_ERROR,
|
LOG(LOG_LEVEL_ERROR,
|
||||||
"xrdp_channel_drdynvc_data: xrdp_channel_init failed");
|
"xrdp_channel_drdynvc_data: xrdp_channel_init failed");
|
||||||
free_stream(s);
|
free_stream(s);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
@ -1099,8 +1087,8 @@ xrdp_channel_drdynvc_data(struct xrdp_channel *self, int chan_id,
|
|||||||
if (xrdp_channel_send(self, s, static_channel_id, total_data_len,
|
if (xrdp_channel_send(self, s, static_channel_id, total_data_len,
|
||||||
static_flags) != 0)
|
static_flags) != 0)
|
||||||
{
|
{
|
||||||
LOG_DEVEL(LOG_LEVEL_ERROR,
|
LOG(LOG_LEVEL_ERROR,
|
||||||
"xrdp_channel_drdynvc_data: xrdp_channel_send failed");
|
"xrdp_channel_drdynvc_data: xrdp_channel_send failed");
|
||||||
free_stream(s);
|
free_stream(s);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
@ -68,9 +68,8 @@ xrdp_fastpath_recv(struct xrdp_fastpath *self, struct stream *s)
|
|||||||
|
|
||||||
|
|
||||||
holdp = s->p;
|
holdp = s->p;
|
||||||
if (!s_check_rem(s, 2))
|
if (!s_check_rem_and_log(s, 2, "Parsing [MS-RDPBCGR] TS_FP_INPUT_PDU"))
|
||||||
{
|
{
|
||||||
LOG_DEVEL(LOG_LEVEL_ERROR, "xrdp_fastpath_recv: ERROR the stream does not contain enough bytes");
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
in_uint8(s, fp_hdr); /* fpInputHeader (1 byte) */
|
in_uint8(s, fp_hdr); /* fpInputHeader (1 byte) */
|
||||||
@ -84,9 +83,8 @@ xrdp_fastpath_recv(struct xrdp_fastpath *self, struct stream *s)
|
|||||||
byte &= ~(0x80);
|
byte &= ~(0x80);
|
||||||
len = (byte << 8);
|
len = (byte << 8);
|
||||||
|
|
||||||
if (!s_check_rem(s, 1))
|
if (!s_check_rem_and_log(s, 1, "Parsing [MS-RDPBCGR] TS_FP_INPUT_PDU length2"))
|
||||||
{
|
{
|
||||||
LOG_DEVEL(LOG_LEVEL_ERROR, "xrdp_fastpath_recv: ERROR the stream does not contain enough bytes");
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
in_uint8(s, byte); /* length 2 (1 byte) */
|
in_uint8(s, byte); /* length 2 (1 byte) */
|
||||||
@ -98,7 +96,9 @@ xrdp_fastpath_recv(struct xrdp_fastpath *self, struct stream *s)
|
|||||||
len = byte;
|
len = byte;
|
||||||
}
|
}
|
||||||
s->next_packet = holdp + len;
|
s->next_packet = holdp + len;
|
||||||
LOG_DEVEL(LOG_LEVEL_TRACE, "xrdp_fastpath_recv: numEvents %d secFlags 0x%x length %d",
|
LOG_DEVEL(LOG_LEVEL_TRACE, "Received header [MS-RDPBCGR] TS_FP_INPUT_PDU "
|
||||||
|
"fpInputHeader.action (ignored), fpInputHeader.numEvents %d, "
|
||||||
|
"fpInputHeader.flags 0x%1.1x, length %d",
|
||||||
self->numEvents, self->secFlags, len);
|
self->numEvents, self->secFlags, len);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -136,6 +136,10 @@ xrdp_fastpath_session_callback(struct xrdp_fastpath *self, int msg,
|
|||||||
self->session->callback(self->session->id, msg,
|
self->session->callback(self->session->id, msg,
|
||||||
param1, param2, param3, param4);
|
param1, param2, param3, param4);
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
LOG_DEVEL(LOG_LEVEL_WARNING, "Bug: session is NULL");
|
||||||
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -165,11 +169,14 @@ xrdp_fastpath_process_EVENT_SCANCODE(struct xrdp_fastpath *self,
|
|||||||
int code;
|
int code;
|
||||||
flags = 0;
|
flags = 0;
|
||||||
|
|
||||||
if (!s_check_rem(s, 1))
|
if (!s_check_rem_and_log(s, 1, "Parsing [MS-RDPBCGR] TS_FP_KEYBOARD_EVENT"))
|
||||||
{
|
{
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
in_uint8(s, code); /* keyCode (1 byte) */
|
in_uint8(s, code); /* keyCode (1 byte) */
|
||||||
|
LOG_DEVEL(LOG_LEVEL_TRACE, "Received [MS-RDPBCGR] TS_FP_KEYBOARD_EVENT "
|
||||||
|
"eventHeader.eventFlags 0x%2.2x, eventHeader.eventCode (ignored), "
|
||||||
|
"keyCode %d", eventFlags, code);
|
||||||
|
|
||||||
if ((eventFlags & FASTPATH_INPUT_KBDFLAGS_RELEASE))
|
if ((eventFlags & FASTPATH_INPUT_KBDFLAGS_RELEASE))
|
||||||
{
|
{
|
||||||
@ -207,13 +214,16 @@ xrdp_fastpath_process_EVENT_MOUSE(struct xrdp_fastpath *self,
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!s_check_rem(s, 2 + 2 + 2))
|
if (!s_check_rem_and_log(s, 2 + 2 + 2, "Parsing [MS-RDPBCGR] TS_FP_POINTER_EVENT"))
|
||||||
{
|
{
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
in_uint16_le(s, pointerFlags); /* pointerFlags (2 bytes) */
|
in_uint16_le(s, pointerFlags); /* pointerFlags (2 bytes) */
|
||||||
in_uint16_le(s, xPos); /* xPos (2 bytes) */
|
in_uint16_le(s, xPos); /* xPos (2 bytes) */
|
||||||
in_uint16_le(s, yPos); /* yPos (2 bytes) */
|
in_uint16_le(s, yPos); /* yPos (2 bytes) */
|
||||||
|
LOG_DEVEL(LOG_LEVEL_TRACE, "Received [MS-RDPBCGR] TS_FP_POINTER_EVENT "
|
||||||
|
"eventHeader.eventFlags 0x00, eventHeader.eventCode (ignored), "
|
||||||
|
"pointerFlags 0x%4.4x, xPos %d, yPos %d", pointerFlags, xPos, yPos);
|
||||||
|
|
||||||
xrdp_fastpath_session_callback(self, RDP_INPUT_MOUSE,
|
xrdp_fastpath_session_callback(self, RDP_INPUT_MOUSE,
|
||||||
xPos, yPos, pointerFlags, 0);
|
xPos, yPos, pointerFlags, 0);
|
||||||
@ -237,13 +247,18 @@ xrdp_fastpath_process_EVENT_MOUSEX(struct xrdp_fastpath *self,
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!s_check_rem(s, 2 + 2 + 2))
|
if (!s_check_rem_and_log(s, 2 + 2 + 2,
|
||||||
|
"Parsing [MS-RDPBCGR] TS_FP_POINTERX_EVENT"))
|
||||||
{
|
{
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
in_uint16_le(s, pointerFlags); /* pointerFlags (2 bytes) */
|
in_uint16_le(s, pointerFlags); /* pointerFlags (2 bytes) */
|
||||||
in_uint16_le(s, xPos); /* xPos (2 bytes) */
|
in_uint16_le(s, xPos); /* xPos (2 bytes) */
|
||||||
in_uint16_le(s, yPos); /* yPos (2 bytes) */
|
in_uint16_le(s, yPos); /* yPos (2 bytes) */
|
||||||
|
LOG_DEVEL(LOG_LEVEL_TRACE, "Received [MS-RDPBCGR] TS_FP_POINTERX_EVENT "
|
||||||
|
"eventHeader.eventFlags 0x%2.2x, eventHeader.eventCode (ignored), "
|
||||||
|
"pointerFlags 0x%4.4x, xPos %d, yPos %d",
|
||||||
|
eventFlags, pointerFlags, xPos, yPos);
|
||||||
|
|
||||||
xrdp_fastpath_session_callback(self, RDP_INPUT_MOUSEX,
|
xrdp_fastpath_session_callback(self, RDP_INPUT_MOUSEX,
|
||||||
xPos, yPos, pointerFlags, 0);
|
xPos, yPos, pointerFlags, 0);
|
||||||
@ -265,6 +280,10 @@ xrdp_fastpath_process_EVENT_SYNC(struct xrdp_fastpath *self,
|
|||||||
* status of the keyboard toggle keys.
|
* status of the keyboard toggle keys.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
LOG_DEVEL(LOG_LEVEL_TRACE, "Received [MS-RDPBCGR] TS_FP_SYNC_EVENT"
|
||||||
|
"eventHeader.eventFlags 0x%2.2x, eventHeader.eventCode (ignored), ",
|
||||||
|
eventFlags);
|
||||||
|
|
||||||
xrdp_fastpath_session_callback(self, RDP_INPUT_SYNCHRONIZE,
|
xrdp_fastpath_session_callback(self, RDP_INPUT_SYNCHRONIZE,
|
||||||
eventFlags, 0, 0, 0);
|
eventFlags, 0, 0, 0);
|
||||||
|
|
||||||
@ -281,11 +300,16 @@ xrdp_fastpath_process_EVENT_UNICODE(struct xrdp_fastpath *self,
|
|||||||
int code;
|
int code;
|
||||||
|
|
||||||
flags = 0;
|
flags = 0;
|
||||||
if (!s_check_rem(s, 2))
|
if (!s_check_rem_and_log(s, 2, "Parsing [MS-RDPBCGR] TS_FP_UNICODE_KEYBOARD_EVENT"))
|
||||||
{
|
{
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
in_uint16_le(s, code); /* unicode (2 byte) */
|
in_uint16_le(s, code); /* unicode (2 byte) */
|
||||||
|
LOG_DEVEL(LOG_LEVEL_TRACE, "Received [MS-RDPBCGR] TS_FP_UNICODE_KEYBOARD_EVENT"
|
||||||
|
"eventHeader.eventFlags 0x%2.2x, eventHeader.eventCode (ignored), "
|
||||||
|
"unicodeCode %d",
|
||||||
|
eventFlags, code);
|
||||||
|
|
||||||
if (eventFlags & FASTPATH_INPUT_KBDFLAGS_RELEASE)
|
if (eventFlags & FASTPATH_INPUT_KBDFLAGS_RELEASE)
|
||||||
{
|
{
|
||||||
flags |= KBD_FLAG_UP;
|
flags |= KBD_FLAG_UP;
|
||||||
@ -317,7 +341,7 @@ xrdp_fastpath_process_input_event(struct xrdp_fastpath *self,
|
|||||||
/* process fastpath input events */
|
/* process fastpath input events */
|
||||||
for (i = 0; i < self->numEvents; i++)
|
for (i = 0; i < self->numEvents; i++)
|
||||||
{
|
{
|
||||||
if (!s_check_rem(s, 1))
|
if (!s_check_rem_and_log(s, 1, "Parsing [MS-RDPBCGR] TS_FP_INPUT_EVENT eventHeader"))
|
||||||
{
|
{
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
@ -325,6 +349,9 @@ xrdp_fastpath_process_input_event(struct xrdp_fastpath *self,
|
|||||||
|
|
||||||
eventFlags = (eventHeader & 0x1F);
|
eventFlags = (eventHeader & 0x1F);
|
||||||
eventCode = (eventHeader >> 5);
|
eventCode = (eventHeader >> 5);
|
||||||
|
LOG_DEVEL(LOG_LEVEL_TRACE, "Received [MS-RDPBCGR] TS_FP_INPUT_EVENT"
|
||||||
|
"eventHeader.eventFlags 0x%2.2x, eventHeader.eventCode 0x%1.1x",
|
||||||
|
eventFlags, eventCode);
|
||||||
|
|
||||||
switch (eventCode)
|
switch (eventCode)
|
||||||
{
|
{
|
||||||
|
@ -94,7 +94,7 @@ xrdp_iso_negotiate_security(struct xrdp_iso *self)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
LOG(LOG_LEVEL_ERROR, "Server requiers TLS for security, "
|
LOG(LOG_LEVEL_ERROR, "Server requires TLS for security, "
|
||||||
"but the client did not request TLS.");
|
"but the client did not request TLS.");
|
||||||
self->failureCode = SSL_REQUIRED_BY_SERVER;
|
self->failureCode = SSL_REQUIRED_BY_SERVER;
|
||||||
rv = 1; /* error */
|
rv = 1; /* error */
|
||||||
@ -132,10 +132,8 @@ xrdp_iso_process_rdp_neg_req(struct xrdp_iso *self, struct stream *s)
|
|||||||
int flags;
|
int flags;
|
||||||
int len;
|
int len;
|
||||||
|
|
||||||
if (!s_check_rem(s, 7))
|
if (!s_check_rem_and_log(s, 7, "Parsing [MS-RDPBCGR] RDP_NEG_REQ"))
|
||||||
{
|
{
|
||||||
LOG(LOG_LEVEL_ERROR, "unexpected end-of-record. "
|
|
||||||
"expected 7, remaining %d", s_rem(s));
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -205,21 +203,24 @@ xrdp_iso_recv_msg(struct xrdp_iso *self, struct stream *s, int *code, int *len)
|
|||||||
"transport input stream");
|
"transport input stream");
|
||||||
}
|
}
|
||||||
|
|
||||||
/* TPKT header is 4 bytes, then first 2 bytes of the X.224 CR-TPDU */
|
/* [ITU-T T.123] TPKT header is 4 bytes, then first 2 bytes of the X.224 CR-TPDU */
|
||||||
if (!s_check_rem(s, 6))
|
if (!s_check_rem_and_log(s, 6,
|
||||||
|
"Parsing [ITU-T T.123] TPKT header and [ITU-T X.224] TPDU header"))
|
||||||
{
|
{
|
||||||
LOG_DEVEL(LOG_LEVEL_ERROR, "unexpected end-of-record. "
|
|
||||||
"expected 6, remaining %d", s_rem(s));
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* [ITU-T T.123] TPKT header */
|
/* [ITU-T T.123] TPKT header */
|
||||||
in_uint8(s, ver); /* version */
|
in_uint8(s, ver); /* version */
|
||||||
in_uint8s(s, 3); /* Skip reserved field (1 byte), plus length (2 bytes) */
|
in_uint8s(s, 3); /* Skip reserved field (1 byte), plus length (2 bytes) */
|
||||||
|
LOG_DEVEL(LOG_LEVEL_TRACE, "Received header [ITU-T T.123] TPKT "
|
||||||
|
"version %d, length (ignored)", ver);
|
||||||
|
|
||||||
/* [ITU-T X.224] TPDU header */
|
/* [ITU-T X.224] TPDU header */
|
||||||
in_uint8(s, *len); /* LI (length indicator) */
|
in_uint8(s, *len); /* LI (length indicator) */
|
||||||
in_uint8(s, *code); /* TPDU code */
|
in_uint8(s, *code); /* TPDU code */
|
||||||
|
LOG_DEVEL(LOG_LEVEL_TRACE, "Received header [ITU-T X.224] TPDU "
|
||||||
|
"length indicator %d, TDPU code 0x%2.2x", *len, *code);
|
||||||
|
|
||||||
if (ver != 3)
|
if (ver != 3)
|
||||||
{
|
{
|
||||||
@ -241,10 +242,8 @@ xrdp_iso_recv_msg(struct xrdp_iso *self, struct stream *s, int *code, int *len)
|
|||||||
if (*code == ISO_PDU_DT)
|
if (*code == ISO_PDU_DT)
|
||||||
{
|
{
|
||||||
/* Data PDU : X.224 13.7 class 0 */
|
/* Data PDU : X.224 13.7 class 0 */
|
||||||
if (!s_check_rem(s, 1))
|
if (!s_check_rem_and_log(s, 1, "Parsing [ITU-T X.224] DT-TPDU (Data) header"))
|
||||||
{
|
{
|
||||||
LOG_DEVEL(LOG_LEVEL_ERROR, "unexpected end-of-record. "
|
|
||||||
"expected 1, remaining %d", s_rem(s));
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
in_uint8s(s, 1); /* EOT (End of TSDU Mark) (upper 1 bit) and
|
in_uint8s(s, 1); /* EOT (End of TSDU Mark) (upper 1 bit) and
|
||||||
@ -257,10 +256,8 @@ xrdp_iso_recv_msg(struct xrdp_iso *self, struct stream *s, int *code, int *len)
|
|||||||
CR Connection request (13.3)
|
CR Connection request (13.3)
|
||||||
CC Connection confirm (13.4)
|
CC Connection confirm (13.4)
|
||||||
DR Disconnect request (13.5) */
|
DR Disconnect request (13.5) */
|
||||||
if (!s_check_rem(s, 5))
|
if (!s_check_rem_and_log(s, 5, "Parsing [ITU-T X.224] Other PDU header"))
|
||||||
{
|
{
|
||||||
LOG_DEVEL(LOG_LEVEL_ERROR, "unexpected end-of-record. "
|
|
||||||
"expected 5, remaining %d", s_rem(s));
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
in_uint8s(s, 5); /* DST-REF (2 bytes)
|
in_uint8s(s, 5); /* DST-REF (2 bytes)
|
||||||
@ -268,10 +265,6 @@ xrdp_iso_recv_msg(struct xrdp_iso *self, struct stream *s, int *code, int *len)
|
|||||||
[CR, CC] CLASS OPTION (1 byte) or [DR] REASON (1 byte) */
|
[CR, CC] CLASS OPTION (1 byte) or [DR] REASON (1 byte) */
|
||||||
}
|
}
|
||||||
|
|
||||||
LOG_DEVEL(LOG_LEVEL_TRACE, "Received header [ITU-T T.123] TPKT "
|
|
||||||
"version %d, length (ignored)", ver);
|
|
||||||
LOG_DEVEL(LOG_LEVEL_TRACE, "Received header [ITU-T X.224] TPDU "
|
|
||||||
"length indicator %d, TDPU code 0x%2.2x", *len, *code);
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -379,7 +372,7 @@ xrdp_iso_send_cc(struct xrdp_iso *self)
|
|||||||
|
|
||||||
if (trans_write_copy_s(self->trans, s) != 0)
|
if (trans_write_copy_s(self->trans, s) != 0)
|
||||||
{
|
{
|
||||||
LOG_DEVEL(LOG_LEVEL_ERROR, "xrdp_iso_send_cc: trans_write_copy_s failed");
|
LOG(LOG_LEVEL_ERROR, "Sending [ITU-T X.224] CC-TPDU (Connection Confirm) failed");
|
||||||
free_stream(s);
|
free_stream(s);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
@ -412,26 +405,26 @@ xrdp_iso_incoming(struct xrdp_iso *self)
|
|||||||
struct stream *s;
|
struct stream *s;
|
||||||
int expected_pdu_len;
|
int expected_pdu_len;
|
||||||
|
|
||||||
LOG_DEVEL(LOG_LEVEL_DEBUG, "X.224 Connection Sequence: receive connection request");
|
LOG_DEVEL(LOG_LEVEL_DEBUG, "[ITU-T X.224] Connection Sequence: receive connection request");
|
||||||
s = libxrdp_force_read(self->trans);
|
s = libxrdp_force_read(self->trans);
|
||||||
if (s == NULL)
|
if (s == NULL)
|
||||||
{
|
{
|
||||||
LOG_DEVEL(LOG_LEVEL_ERROR, "xrdp_iso_incoming: libxrdp_force_read failed");
|
LOG(LOG_LEVEL_ERROR, "[ITU-T X.224] Connection Sequence: CR-TPDU (Connection Request) failed");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (xrdp_iso_recv_msg(self, s, &code, &len) != 0)
|
if (xrdp_iso_recv_msg(self, s, &code, &len) != 0)
|
||||||
{
|
{
|
||||||
LOG(LOG_LEVEL_ERROR, "xrdp_iso_incoming: xrdp_iso_recv_msg failed");
|
LOG(LOG_LEVEL_ERROR, "[ITU-T X.224] Connection Sequence: CR-TPDU (Connection Request) failed");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (code != ISO_PDU_CR)
|
if (code != ISO_PDU_CR)
|
||||||
{
|
{
|
||||||
LOG_DEVEL(LOG_LEVEL_ERROR, "xrdp_iso_incoming only supports processing "
|
LOG(LOG_LEVEL_ERROR, "xrdp_iso_incoming only supports processing "
|
||||||
"[ITU-T X.224] CR-TPDU (Connection Request) headers. "
|
"[ITU-T X.224] CR-TPDU (Connection Request) headers. "
|
||||||
"Received TPDU header: length indicator %d, TDPU code 0x%2.2x",
|
"Received TPDU header: length indicator %d, TDPU code 0x%2.2x",
|
||||||
len, code);
|
len, code);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -461,7 +454,7 @@ xrdp_iso_incoming(struct xrdp_iso *self)
|
|||||||
{
|
{
|
||||||
default:
|
default:
|
||||||
LOG_DEVEL(LOG_LEVEL_WARNING,
|
LOG_DEVEL(LOG_LEVEL_WARNING,
|
||||||
"Unknown structure type in X.224 Connection Request. "
|
"Ignoring unknown structure type in [ITU-T X.224] CR-TPDU (Connection Request). "
|
||||||
"type 0x%2.2x", cc_type);
|
"type 0x%2.2x", cc_type);
|
||||||
break;
|
break;
|
||||||
case RDP_NEG_REQ: /* rdpNegReq 1 */
|
case RDP_NEG_REQ: /* rdpNegReq 1 */
|
||||||
@ -469,16 +462,15 @@ xrdp_iso_incoming(struct xrdp_iso *self)
|
|||||||
if (xrdp_iso_process_rdp_neg_req(self, s) != 0)
|
if (xrdp_iso_process_rdp_neg_req(self, s) != 0)
|
||||||
{
|
{
|
||||||
LOG(LOG_LEVEL_ERROR,
|
LOG(LOG_LEVEL_ERROR,
|
||||||
"xrdp_iso_incoming: xrdp_iso_process_rdp_neg_req failed");
|
"[ITU-T X.224] Connection Sequence: failed");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case RDP_CORRELATION_INFO: /* rdpCorrelationInfo 6 */
|
case RDP_CORRELATION_INFO: /* rdpCorrelationInfo 6 */
|
||||||
// TODO
|
// TODO
|
||||||
if (!s_check_rem(s, 1 + 2 + 16 + 16))
|
if (!s_check_rem_and_log(s, 1 + 2 + 16 + 16,
|
||||||
|
"Parsing [MS-RDPBCGR] RDP_NEG_CORRELATION_INFO"))
|
||||||
{
|
{
|
||||||
LOG(LOG_LEVEL_ERROR, "unexpected end-of-record. "
|
|
||||||
"expected 35, remaining %d", s_rem(s));
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -515,14 +507,14 @@ xrdp_iso_incoming(struct xrdp_iso *self)
|
|||||||
rv = xrdp_iso_negotiate_security(self);
|
rv = xrdp_iso_negotiate_security(self);
|
||||||
|
|
||||||
/* send connection confirm back to client */
|
/* send connection confirm back to client */
|
||||||
LOG_DEVEL(LOG_LEVEL_DEBUG, "X.224 Connection Sequence: send connection confirmation");
|
LOG_DEVEL(LOG_LEVEL_DEBUG, "[ITU-T X.224] Connection Sequence: send connection confirmation");
|
||||||
if (xrdp_iso_send_cc(self) != 0)
|
if (xrdp_iso_send_cc(self) != 0)
|
||||||
{
|
{
|
||||||
LOG(LOG_LEVEL_ERROR, "xrdp_iso_incoming: xrdp_iso_send_cc failed");
|
LOG(LOG_LEVEL_ERROR, "[ITU-T X.224] Connection Sequence: send connection confirmation failed");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
LOG_DEVEL(LOG_LEVEL_DEBUG, "X.224 Connection Sequence: completed");
|
LOG_DEVEL(LOG_LEVEL_DEBUG, "[ITU-T X.224] Connection Sequence: completed");
|
||||||
return rv;
|
return rv;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -567,7 +559,7 @@ xrdp_iso_send(struct xrdp_iso *self, struct stream *s)
|
|||||||
|
|
||||||
if (trans_write_copy_s(self->trans, s) != 0)
|
if (trans_write_copy_s(self->trans, s) != 0)
|
||||||
{
|
{
|
||||||
LOG_DEVEL(LOG_LEVEL_ERROR, "xrdp_iso_send: trans_write_copy_s failed");
|
LOG(LOG_LEVEL_ERROR, "xrdp_iso_send: trans_write_copy_s failed");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -115,7 +115,7 @@ xrdp_mcs_send_cjcf(struct xrdp_mcs *self, int userid, int chanid)
|
|||||||
if (xrdp_iso_send(self->iso_layer, s) != 0)
|
if (xrdp_iso_send(self->iso_layer, s) != 0)
|
||||||
{
|
{
|
||||||
free_stream(s);
|
free_stream(s);
|
||||||
LOG(LOG_LEVEL_ERROR, "xrdp_mcs_send_cjcf: xrdp_iso_send failed");
|
LOG(LOG_LEVEL_ERROR, "Sening [ITU-T T.125] ChannelJoinConfirm failed");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -150,10 +150,8 @@ xrdp_mcs_recv(struct xrdp_mcs *self, struct stream *s, int *chan)
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!s_check_rem(s, 1))
|
if (!s_check_rem_and_log(s, 1, "Parsing [ITU-T T.125] DomainMCSPDU"))
|
||||||
{
|
{
|
||||||
LOG_DEVEL(LOG_LEVEL_ERROR, "Not enough bytes in the stream "
|
|
||||||
"len 1, remaining %d", s_rem(s));
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -167,6 +165,7 @@ xrdp_mcs_recv(struct xrdp_mcs *self, struct stream *s, int *chan)
|
|||||||
if (appid == MCS_DPUM) /* Disconnect Provider Ultimatum */
|
if (appid == MCS_DPUM) /* Disconnect Provider Ultimatum */
|
||||||
{
|
{
|
||||||
LOG_DEVEL(LOG_LEVEL_TRACE, "Received [ITU-T T.125] DisconnectProviderUltimatum");
|
LOG_DEVEL(LOG_LEVEL_TRACE, "Received [ITU-T T.125] DisconnectProviderUltimatum");
|
||||||
|
LOG(LOG_LEVEL_DEBUG, "Recieved disconnection request");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -174,10 +173,8 @@ xrdp_mcs_recv(struct xrdp_mcs *self, struct stream *s, int *chan)
|
|||||||
this is channels getting added from the client */
|
this is channels getting added from the client */
|
||||||
if (appid == MCS_CJRQ)
|
if (appid == MCS_CJRQ)
|
||||||
{
|
{
|
||||||
if (!s_check_rem(s, 4))
|
if (!s_check_rem_and_log(s, 4, "Parsing [ITU-T T.125] ChannelJoinRequest"))
|
||||||
{
|
{
|
||||||
LOG_DEVEL(LOG_LEVEL_ERROR, "Not enough bytes in the stream "
|
|
||||||
"len 4, remaining %d", s_rem(s));
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -188,7 +185,7 @@ xrdp_mcs_recv(struct xrdp_mcs *self, struct stream *s, int *chan)
|
|||||||
|
|
||||||
if (xrdp_mcs_send_cjcf(self, userid, chanid) != 0)
|
if (xrdp_mcs_send_cjcf(self, userid, chanid) != 0)
|
||||||
{
|
{
|
||||||
LOG(LOG_LEVEL_WARNING, "xrdp_mcs_recv: xrdp_mcs_send_cjcf failed");
|
LOG(LOG_LEVEL_WARNING, "[ITU-T T.125] Channel join sequence: failed");
|
||||||
}
|
}
|
||||||
|
|
||||||
s = libxrdp_force_read(self->iso_layer->trans);
|
s = libxrdp_force_read(self->iso_layer->trans);
|
||||||
@ -212,10 +209,8 @@ xrdp_mcs_recv(struct xrdp_mcs *self, struct stream *s, int *chan)
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!s_check_rem(s, 6))
|
if (!s_check_rem_and_log(s, 6, "Parsing [ITU-T T.125] SendDataRequest"))
|
||||||
{
|
{
|
||||||
LOG_DEVEL(LOG_LEVEL_ERROR, "Not enough bytes in the stream "
|
|
||||||
"len 6, remaining %d", s_rem(s));
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -232,10 +227,8 @@ xrdp_mcs_recv(struct xrdp_mcs *self, struct stream *s, int *chan)
|
|||||||
The first byte will have the two highest order bits set to 1 and 0
|
The first byte will have the two highest order bits set to 1 and 0
|
||||||
(ie. len & 0xC0 == 0x80) and the length is encoded as remaining 14 bits of
|
(ie. len & 0xC0 == 0x80) and the length is encoded as remaining 14 bits of
|
||||||
the two bytes (ie. len & 0x3fff). */
|
the two bytes (ie. len & 0x3fff). */
|
||||||
if (!s_check_rem(s, 1))
|
if (!s_check_rem_and_log(s, 1, "Parsing [ITU-T T.125] SendDataRequest userData Length"))
|
||||||
{
|
{
|
||||||
LOG_DEVEL(LOG_LEVEL_ERROR, "Not enough bytes in the stream "
|
|
||||||
"len 1, remaining %d", s_rem(s));
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
in_uint8s(s, 1); /* userData Length (byte 2) */
|
in_uint8s(s, 1); /* userData Length (byte 2) */
|
||||||
@ -249,8 +242,8 @@ xrdp_mcs_recv(struct xrdp_mcs *self, struct stream *s, int *chan)
|
|||||||
to 1 and 1 (ie. len & 0xC0 == 0xC0) and the remaining 6 bits contain
|
to 1 and 1 (ie. len & 0xC0 == 0xC0) and the remaining 6 bits contain
|
||||||
a multiplyer for 16K (ie. n = (len & 0x3f) * 0x3f)
|
a multiplyer for 16K (ie. n = (len & 0x3f) * 0x3f)
|
||||||
*/
|
*/
|
||||||
LOG_DEVEL(LOG_LEVEL_ERROR, "[ITU-T T.125] SendDataRequest with length greater "
|
LOG(LOG_LEVEL_ERROR, "[ITU-T T.125] SendDataRequest with length greater "
|
||||||
"than 16K is not supported. len 0x%2.2x", len);
|
"than 16K is not supported. len 0x%2.2x", len);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
LOG_DEVEL(LOG_LEVEL_TRACE, "Received [ITU-T T.125] SendDataRequest "
|
LOG_DEVEL(LOG_LEVEL_TRACE, "Received [ITU-T T.125] SendDataRequest "
|
||||||
@ -281,20 +274,16 @@ xrdp_mcs_ber_parse_header(struct xrdp_mcs *self, struct stream *s,
|
|||||||
|
|
||||||
if (tag_val > 0xff)
|
if (tag_val > 0xff)
|
||||||
{
|
{
|
||||||
if (!s_check_rem(s, 2))
|
if (!s_check_rem_and_log(s, 2, "Parsing [ITU-T X.690] Identifier"))
|
||||||
{
|
{
|
||||||
LOG_DEVEL(LOG_LEVEL_ERROR, "Not enough bytes in the stream "
|
|
||||||
"len 2, remaining %d", s_rem(s));
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
in_uint16_be(s, tag);
|
in_uint16_be(s, tag);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (!s_check_rem(s, 1))
|
if (!s_check_rem_and_log(s, 1, "Parsing [ITU-T X.690] Identifier"))
|
||||||
{
|
{
|
||||||
LOG_DEVEL(LOG_LEVEL_ERROR, "Not enough bytes in the stream "
|
|
||||||
"len 1, remaining %d", s_rem(s));
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
in_uint8(s, tag);
|
in_uint8(s, tag);
|
||||||
@ -302,15 +291,13 @@ xrdp_mcs_ber_parse_header(struct xrdp_mcs *self, struct stream *s,
|
|||||||
|
|
||||||
if (tag != tag_val)
|
if (tag != tag_val)
|
||||||
{
|
{
|
||||||
LOG_DEVEL(LOG_LEVEL_ERROR, "Parsed [ITU-T X.690] Identifier: "
|
LOG(LOG_LEVEL_ERROR, "Parsed [ITU-T X.690] Identifier: "
|
||||||
"expected 0x%4.4x, actual 0x%4.4x", tag_val, tag);
|
"expected 0x%4.4x, actual 0x%4.4x", tag_val, tag);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!s_check_rem(s, 1))
|
if (!s_check_rem_and_log(s, 1, "Parsing [ITU-T X.690] Length"))
|
||||||
{
|
{
|
||||||
LOG_DEVEL(LOG_LEVEL_ERROR, "Not enough bytes in the stream "
|
|
||||||
"len 1, remaining %d", s_rem(s));
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -323,10 +310,8 @@ xrdp_mcs_ber_parse_header(struct xrdp_mcs *self, struct stream *s,
|
|||||||
|
|
||||||
while (l > 0)
|
while (l > 0)
|
||||||
{
|
{
|
||||||
if (!s_check_rem(s, 1))
|
if (!s_check_rem_and_log(s, 1, "Parsing [ITU-T X.690] Length"))
|
||||||
{
|
{
|
||||||
LOG_DEVEL(LOG_LEVEL_ERROR, "Not enough bytes in the stream "
|
|
||||||
"len 1, remaining %d", s_rem(s));
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
in_uint8(s, i);
|
in_uint8(s, i);
|
||||||
@ -341,16 +326,7 @@ xrdp_mcs_ber_parse_header(struct xrdp_mcs *self, struct stream *s,
|
|||||||
LOG_DEVEL(LOG_LEVEL_TRACE, "Parsed BER header [ITU-T X.690] "
|
LOG_DEVEL(LOG_LEVEL_TRACE, "Parsed BER header [ITU-T X.690] "
|
||||||
"Identifier 0x%4.4x, Length %d", tag, *len);
|
"Identifier 0x%4.4x, Length %d", tag, *len);
|
||||||
|
|
||||||
if (s_check(s))
|
return !s_check_rem_and_log(s, 0, "Parsing [ITU-T X.690]");
|
||||||
{
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
LOG_DEVEL(LOG_LEVEL_ERROR, "Not enough bytes in the stream "
|
|
||||||
"len 0, remaining %d", s_rem(s));
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
@ -363,31 +339,26 @@ xrdp_mcs_parse_domain_params(struct xrdp_mcs *self, struct stream *s)
|
|||||||
|
|
||||||
if (xrdp_mcs_ber_parse_header(self, s, MCS_TAG_DOMAIN_PARAMS, &len) != 0)
|
if (xrdp_mcs_ber_parse_header(self, s, MCS_TAG_DOMAIN_PARAMS, &len) != 0)
|
||||||
{
|
{
|
||||||
LOG_DEVEL(LOG_LEVEL_ERROR,
|
LOG(LOG_LEVEL_ERROR,
|
||||||
"xrdp_mcs_parse_domain_params: xrdp_mcs_ber_parse_header "
|
"Parsing [ITU-T T.125] DomainParameters failed");
|
||||||
"with MCS_TAG_DOMAIN_PARAMS failed");
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((len < 0) || !s_check_rem(s, len))
|
if (len < 0)
|
||||||
|
{
|
||||||
|
LOG(LOG_LEVEL_ERROR,
|
||||||
|
"Parsing [ITU-T T.125] DomainParameters length field is "
|
||||||
|
"invalid. Expected > 0, acctual %d", len);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
if (!s_check_rem_and_log(s, len, "Parsing [ITU-T T.125] DomainParameters"))
|
||||||
{
|
{
|
||||||
LOG_DEVEL(LOG_LEVEL_ERROR, "Not enough bytes in the stream, "
|
|
||||||
"len %d, remaining %d", len, s_rem(s));
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
in_uint8s(s, len); /* skip all fields */
|
in_uint8s(s, len); /* skip all fields */
|
||||||
|
|
||||||
if (s_check(s))
|
return !s_check_rem_and_log(s, 0, "Parsing [ITU-T T.125] DomainParameters");
|
||||||
{
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
LOG_DEVEL(LOG_LEVEL_ERROR, "Not enough bytes in the stream, "
|
|
||||||
"len 0, remaining %d", s_rem(s));
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
@ -402,36 +373,39 @@ xrdp_mcs_recv_connect_initial(struct xrdp_mcs *self)
|
|||||||
s = libxrdp_force_read(self->iso_layer->trans);
|
s = libxrdp_force_read(self->iso_layer->trans);
|
||||||
if (s == 0)
|
if (s == 0)
|
||||||
{
|
{
|
||||||
LOG_DEVEL(LOG_LEVEL_ERROR, "xrdp_mcs_recv_connect_initial: libxrdp_force_read failed");
|
LOG(LOG_LEVEL_ERROR, "Processing [ITU-T T.125] Connect-Initial failed");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (xrdp_iso_recv(self->iso_layer, s) != 0)
|
if (xrdp_iso_recv(self->iso_layer, s) != 0)
|
||||||
{
|
{
|
||||||
LOG_DEVEL(LOG_LEVEL_ERROR, "xrdp_mcs_recv_connect_initial: xrdp_iso_recv failed");
|
LOG(LOG_LEVEL_ERROR, "Processing [ITU-T T.125] Connect-Initial failed");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (xrdp_mcs_ber_parse_header(self, s, MCS_CONNECT_INITIAL, &len) != 0)
|
if (xrdp_mcs_ber_parse_header(self, s, MCS_CONNECT_INITIAL, &len) != 0)
|
||||||
{
|
{
|
||||||
LOG_DEVEL(LOG_LEVEL_ERROR,
|
LOG(LOG_LEVEL_ERROR,
|
||||||
"xrdp_mcs_recv_connect_initial: xrdp_mcs_ber_parse_header "
|
"Parsing [ITU-T T.125] Connect-Initial failed");
|
||||||
"with MCS_CONNECT_INITIAL failed");
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (xrdp_mcs_ber_parse_header(self, s, BER_TAG_OCTET_STRING, &len) != 0)
|
if (xrdp_mcs_ber_parse_header(self, s, BER_TAG_OCTET_STRING, &len) != 0)
|
||||||
{
|
{
|
||||||
LOG_DEVEL(LOG_LEVEL_ERROR,
|
LOG(LOG_LEVEL_ERROR,
|
||||||
"xrdp_mcs_recv_connect_initial: xrdp_mcs_ber_parse_header "
|
"Parsing [ITU-T T.125] Connect-Initial callingDomainSelector failed");
|
||||||
"with BER_TAG_OCTET_STRING failed");
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((len < 0) || !s_check_rem(s, len))
|
if (len < 0)
|
||||||
|
{
|
||||||
|
LOG(LOG_LEVEL_ERROR,
|
||||||
|
"Parsing [ITU-T T.125] Connect-Initial callingDomainSelector length field is "
|
||||||
|
"invalid. Expected > 0, acctual %d", len);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
if (!s_check_rem_and_log(s, len, "Parsing [ITU-T T.125] Connect-Initial callingDomainSelector"))
|
||||||
{
|
{
|
||||||
LOG_DEVEL(LOG_LEVEL_ERROR, "Not enough bytes in the stream, "
|
|
||||||
"len %d, remaining %d", len, s_rem(s));
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -439,16 +413,19 @@ xrdp_mcs_recv_connect_initial(struct xrdp_mcs *self)
|
|||||||
|
|
||||||
if (xrdp_mcs_ber_parse_header(self, s, BER_TAG_OCTET_STRING, &len) != 0)
|
if (xrdp_mcs_ber_parse_header(self, s, BER_TAG_OCTET_STRING, &len) != 0)
|
||||||
{
|
{
|
||||||
LOG_DEVEL(LOG_LEVEL_ERROR,
|
LOG(LOG_LEVEL_ERROR,
|
||||||
"xrdp_mcs_recv_connect_initial: xrdp_mcs_ber_parse_header "
|
"Parsing [ITU-T T.125] Connect-Initial calledDomainSelector failed");
|
||||||
"with BER_TAG_OCTET_STRING failed");
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
if (len < 0)
|
||||||
if ((len < 0) || !s_check_rem(s, len))
|
{
|
||||||
|
LOG(LOG_LEVEL_ERROR,
|
||||||
|
"Parsing [ITU-T T.125] Connect-Initial calledDomainSelector length field is "
|
||||||
|
"invalid. Expected > 0, acctual %d", len);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
if (!s_check_rem_and_log(s, len, "Parsing [ITU-T T.125] Connect-Initial calledDomainSelector"))
|
||||||
{
|
{
|
||||||
LOG_DEVEL(LOG_LEVEL_ERROR, "Not enough bytes in the stream, "
|
|
||||||
"len %d, remaining %d", len, s_rem(s));
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -456,16 +433,19 @@ xrdp_mcs_recv_connect_initial(struct xrdp_mcs *self)
|
|||||||
|
|
||||||
if (xrdp_mcs_ber_parse_header(self, s, BER_TAG_BOOLEAN, &len) != 0)
|
if (xrdp_mcs_ber_parse_header(self, s, BER_TAG_BOOLEAN, &len) != 0)
|
||||||
{
|
{
|
||||||
LOG_DEVEL(LOG_LEVEL_ERROR,
|
LOG(LOG_LEVEL_ERROR,
|
||||||
"xrdp_mcs_recv_connect_initial: xrdp_mcs_ber_parse_header "
|
"Parsing [ITU-T T.125] Connect-Initial upwardFlag failed");
|
||||||
"with BER_TAG_BOOLEAN failed");
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
if (len < 0)
|
||||||
if ((len < 0) || !s_check_rem(s, len))
|
{
|
||||||
|
LOG(LOG_LEVEL_ERROR,
|
||||||
|
"Parsing [ITU-T T.125] Connect-Initial upwardFlag length field is "
|
||||||
|
"invalid. Expected > 0, acctual %d", len);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
if (!s_check_rem_and_log(s, len, "Parsing [ITU-T T.125] Connect-Initial upwardFlag"))
|
||||||
{
|
{
|
||||||
LOG_DEVEL(LOG_LEVEL_ERROR, "Not enough bytes in the stream, "
|
|
||||||
"len %d, remaining %d", len, s_rem(s));
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -474,46 +454,43 @@ xrdp_mcs_recv_connect_initial(struct xrdp_mcs *self)
|
|||||||
/* [ITU-T T.125] Connect-Initial targetParameters */
|
/* [ITU-T T.125] Connect-Initial targetParameters */
|
||||||
if (xrdp_mcs_parse_domain_params(self, s) != 0)
|
if (xrdp_mcs_parse_domain_params(self, s) != 0)
|
||||||
{
|
{
|
||||||
LOG_DEVEL(LOG_LEVEL_ERROR,
|
LOG(LOG_LEVEL_ERROR,
|
||||||
"xrdp_mcs_recv_connect_initial: xrdp_mcs_parse_domain_params failed");
|
"Parsing [ITU-T T.125] Connect-Initial targetParameters failed");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* [ITU-T T.125] Connect-Initial minimumParameters */
|
/* [ITU-T T.125] Connect-Initial minimumParameters */
|
||||||
if (xrdp_mcs_parse_domain_params(self, s) != 0)
|
if (xrdp_mcs_parse_domain_params(self, s) != 0)
|
||||||
{
|
{
|
||||||
LOG_DEVEL(LOG_LEVEL_ERROR,
|
LOG(LOG_LEVEL_ERROR,
|
||||||
"xrdp_mcs_recv_connect_initial: xrdp_mcs_parse_domain_params failed");
|
"Parsing [ITU-T T.125] Connect-Initial minimumParameters failed");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* [ITU-T T.125] Connect-Initial maximumParameters */
|
/* [ITU-T T.125] Connect-Initial maximumParameters */
|
||||||
if (xrdp_mcs_parse_domain_params(self, s) != 0)
|
if (xrdp_mcs_parse_domain_params(self, s) != 0)
|
||||||
{
|
{
|
||||||
LOG_DEVEL(LOG_LEVEL_ERROR,
|
LOG(LOG_LEVEL_ERROR,
|
||||||
"xrdp_mcs_recv_connect_initial: xrdp_mcs_parse_domain_params failed");
|
"Parsing [ITU-T T.125] Connect-Initial maximumParameters failed");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (xrdp_mcs_ber_parse_header(self, s, BER_TAG_OCTET_STRING, &len) != 0)
|
if (xrdp_mcs_ber_parse_header(self, s, BER_TAG_OCTET_STRING, &len) != 0)
|
||||||
{
|
{
|
||||||
LOG_DEVEL(LOG_LEVEL_ERROR, "xrdp_mcs_recv_connect_initial: "
|
LOG(LOG_LEVEL_ERROR,
|
||||||
"xrdp_mcs_ber_parse_header with BER_TAG_OCTET_STRING failed");
|
"Parsing [ITU-T T.125] Connect-Initial userData failed");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
/* mcs userData can not be zero length */
|
||||||
/* mcs data can not be zero length */
|
|
||||||
if ((len <= 0) || (len > 16 * 1024))
|
if ((len <= 0) || (len > 16 * 1024))
|
||||||
{
|
{
|
||||||
LOG_DEVEL(LOG_LEVEL_ERROR, "MCS Protocol error: length too big. "
|
LOG(LOG_LEVEL_ERROR,
|
||||||
"max length %d, len %d", 16 * 1024, len);
|
"Parsing [ITU-T T.125] Connect-Initial userData: length too big. "
|
||||||
|
"max length %d, len %d", 16 * 1024, len);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
if (!s_check_rem_and_log(s, len, "Parsing [ITU-T T.125] Connect-Initial userData"))
|
||||||
if (!s_check_rem(s, len))
|
|
||||||
{
|
{
|
||||||
LOG_DEVEL(LOG_LEVEL_ERROR, "Not enough bytes in the stream, "
|
|
||||||
"len %d, remaining %d", len, s_rem(s));
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -528,16 +505,13 @@ xrdp_mcs_recv_connect_initial(struct xrdp_mcs *self)
|
|||||||
in_uint8s(s, len);
|
in_uint8s(s, len);
|
||||||
s_mark_end(self->client_mcs_data);
|
s_mark_end(self->client_mcs_data);
|
||||||
|
|
||||||
if (s_check_end(s))
|
if (!s_check_end_and_log(s, "MCS protocol error [ITU-T T.125] Connect-Initial"))
|
||||||
{
|
{
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
LOG_DEVEL(LOG_LEVEL_ERROR, "MCS protocol error: "
|
|
||||||
"the stream should be at the end but it is not");
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
@ -555,20 +529,18 @@ xrdp_mcs_recv_edrq(struct xrdp_mcs *self)
|
|||||||
s = libxrdp_force_read(self->iso_layer->trans);
|
s = libxrdp_force_read(self->iso_layer->trans);
|
||||||
if (s == 0)
|
if (s == 0)
|
||||||
{
|
{
|
||||||
LOG_DEVEL(LOG_LEVEL_ERROR, "xrdp_mcs_recv_edrq: libxrdp_force_read failed");
|
LOG(LOG_LEVEL_ERROR, "Processing [ITU-T T.125] ErectDomainRequest failed");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (xrdp_iso_recv(self->iso_layer, s) != 0)
|
if (xrdp_iso_recv(self->iso_layer, s) != 0)
|
||||||
{
|
{
|
||||||
LOG_DEVEL(LOG_LEVEL_ERROR, "xrdp_mcs_recv_edrq: xrdp_iso_recv failed");
|
LOG(LOG_LEVEL_ERROR, "Processing [ITU-T T.125] ErectDomainRequest failed");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!s_check_rem(s, 1))
|
if (!s_check_rem_and_log(s, 1, "Parsing [ITU-T T.125] DomainMCSPDU"))
|
||||||
{
|
{
|
||||||
LOG_DEVEL(LOG_LEVEL_ERROR, "Not enough bytes in the stream, "
|
|
||||||
"len 1, remaining %d", s_rem(s));
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -579,15 +551,13 @@ xrdp_mcs_recv_edrq(struct xrdp_mcs *self)
|
|||||||
|
|
||||||
if ((opcode >> 2) != MCS_EDRQ)
|
if ((opcode >> 2) != MCS_EDRQ)
|
||||||
{
|
{
|
||||||
LOG_DEVEL(LOG_LEVEL_ERROR, "Parsed [ITU-T T.125] DomainMCSPDU choice index "
|
LOG(LOG_LEVEL_ERROR, "Parsed [ITU-T T.125] DomainMCSPDU choice index "
|
||||||
"expected %d, received %d", MCS_EDRQ, (opcode >> 2));
|
"expected %d, received %d", MCS_EDRQ, (opcode >> 2));
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!s_check_rem(s, 4))
|
if (!s_check_rem_and_log(s, 4, "Parsing [ITU-T T.125] ErectDomainRequest"))
|
||||||
{
|
{
|
||||||
LOG_DEVEL(LOG_LEVEL_ERROR, "Not enough bytes in the stream, "
|
|
||||||
"len 4, remaining %d", s_rem(s));
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -608,10 +578,8 @@ xrdp_mcs_recv_edrq(struct xrdp_mcs *self)
|
|||||||
*/
|
*/
|
||||||
if (opcode & 2) /* ErectDomainRequest v3 nonStandard optional field is present? */
|
if (opcode & 2) /* ErectDomainRequest v3 nonStandard optional field is present? */
|
||||||
{
|
{
|
||||||
if (!s_check_rem(s, 2))
|
if (!s_check_rem_and_log(s, 2, "Parsing [ITU-T T.125] ErectDomainRequest nonStandard"))
|
||||||
{
|
{
|
||||||
LOG_DEVEL(LOG_LEVEL_ERROR, "Not enough bytes in the stream, "
|
|
||||||
"len 2, remaining %d", s_rem(s));
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
in_uint16_be(s, self->userid); /* NonStandardParameter.key
|
in_uint16_be(s, self->userid); /* NonStandardParameter.key
|
||||||
@ -620,10 +588,8 @@ xrdp_mcs_recv_edrq(struct xrdp_mcs *self)
|
|||||||
"choice index %d (ErectDomainRequest)", (opcode >> 2));
|
"choice index %d (ErectDomainRequest)", (opcode >> 2));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!(s_check_end(s)))
|
if (!s_check_end_and_log(s, "MCS protocol error [ITU-T T.125] ErectDomainRequest"))
|
||||||
{
|
{
|
||||||
LOG_DEVEL(LOG_LEVEL_ERROR, "Expected to be at the end of the stream, "
|
|
||||||
"but there are %d bytes remaining", s_rem(s));
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -645,20 +611,18 @@ xrdp_mcs_recv_aurq(struct xrdp_mcs *self)
|
|||||||
s = libxrdp_force_read(self->iso_layer->trans);
|
s = libxrdp_force_read(self->iso_layer->trans);
|
||||||
if (s == 0)
|
if (s == 0)
|
||||||
{
|
{
|
||||||
LOG_DEVEL(LOG_LEVEL_ERROR, "xrdp_mcs_recv_aurq: libxrdp_force_read failed");
|
LOG(LOG_LEVEL_ERROR, "Processing [ITU-T T.125] AttachUserRequest failed");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (xrdp_iso_recv(self->iso_layer, s) != 0)
|
if (xrdp_iso_recv(self->iso_layer, s) != 0)
|
||||||
{
|
{
|
||||||
LOG_DEVEL(LOG_LEVEL_ERROR, "xrdp_mcs_recv_aurq: xrdp_iso_recv failed");
|
LOG(LOG_LEVEL_ERROR, "Processing [ITU-T T.125] AttachUserRequest failed");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!s_check_rem(s, 1))
|
if (!s_check_rem_and_log(s, 1, "Parsing [ITU-T T.125] DomainMCSPDU"))
|
||||||
{
|
{
|
||||||
LOG_DEVEL(LOG_LEVEL_ERROR, "Not enough bytes in the stream, "
|
|
||||||
"len 1, remaining %d", s_rem(s));
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -669,8 +633,8 @@ xrdp_mcs_recv_aurq(struct xrdp_mcs *self)
|
|||||||
|
|
||||||
if ((opcode >> 2) != MCS_AURQ)
|
if ((opcode >> 2) != MCS_AURQ)
|
||||||
{
|
{
|
||||||
LOG_DEVEL(LOG_LEVEL_ERROR, "Parsed [ITU-T T.125] DomainMCSPDU choice index "
|
LOG(LOG_LEVEL_ERROR, "Parsed [ITU-T T.125] DomainMCSPDU choice index "
|
||||||
"expected %d, received %d", MCS_AURQ, (opcode >> 2));
|
"expected %d, received %d", MCS_AURQ, (opcode >> 2));
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -681,26 +645,24 @@ xrdp_mcs_recv_aurq(struct xrdp_mcs *self)
|
|||||||
*/
|
*/
|
||||||
if (opcode & 2)
|
if (opcode & 2)
|
||||||
{
|
{
|
||||||
if (!s_check_rem(s, 2))
|
if (!s_check_rem_and_log(s, 2, "Parsing [ITU-T T.125] AttachUserRequest nonStandard"))
|
||||||
{
|
{
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
in_uint16_be(s, self->userid); /* NonStandardParameter.key
|
in_uint16_be(s, self->userid); /* NonStandardParameter.key
|
||||||
NonStandardParameter.data */
|
NonStandardParameter.data */
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!(s_check_end(s)))
|
|
||||||
{
|
|
||||||
LOG_DEVEL(LOG_LEVEL_ERROR, "Expected to be at the end of the stream, "
|
|
||||||
"but there are %d bytes remaining", s_rem(s));
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
LOG_DEVEL(LOG_LEVEL_TRACE, "Received [ITU-T T.125] DomainMCSPDU "
|
LOG_DEVEL(LOG_LEVEL_TRACE, "Received [ITU-T T.125] DomainMCSPDU "
|
||||||
"choice index %d (AttachUserRequest)", (opcode >> 2));
|
"choice index %d (AttachUserRequest)", (opcode >> 2));
|
||||||
LOG_DEVEL(LOG_LEVEL_TRACE, "Received [ITU-T T.125] AttachUserRequest "
|
LOG_DEVEL(LOG_LEVEL_TRACE, "Received [ITU-T T.125] AttachUserRequest "
|
||||||
"nonStandard (%s)",
|
"nonStandard (%s)",
|
||||||
(opcode & 2) ? "present" : "not present");
|
(opcode & 2) ? "present" : "not present");
|
||||||
|
|
||||||
|
if (!s_check_end_and_log(s, "MCS protocol error [ITU-T T.125] AttachUserRequest"))
|
||||||
|
{
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -737,7 +699,7 @@ xrdp_mcs_send_aucf(struct xrdp_mcs *self)
|
|||||||
if (xrdp_iso_send(self->iso_layer, s) != 0)
|
if (xrdp_iso_send(self->iso_layer, s) != 0)
|
||||||
{
|
{
|
||||||
free_stream(s);
|
free_stream(s);
|
||||||
LOG(LOG_LEVEL_ERROR, "xrdp_mcs_send_aucf: xrdp_iso_send failed");
|
LOG(LOG_LEVEL_ERROR, "Sending [ITU-T T.125] AttachUserConfirm failed");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -760,36 +722,34 @@ xrdp_mcs_recv_cjrq(struct xrdp_mcs *self)
|
|||||||
s = libxrdp_force_read(self->iso_layer->trans);
|
s = libxrdp_force_read(self->iso_layer->trans);
|
||||||
if (s == 0)
|
if (s == 0)
|
||||||
{
|
{
|
||||||
LOG_DEVEL(LOG_LEVEL_ERROR, "xrdp_mcs_recv_cjrq: libxrdp_force_read failed");
|
LOG(LOG_LEVEL_ERROR, "Processing [ITU-T T.25] ChannelJoinRequest failed");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (xrdp_iso_recv(self->iso_layer, s) != 0)
|
if (xrdp_iso_recv(self->iso_layer, s) != 0)
|
||||||
{
|
{
|
||||||
LOG_DEVEL(LOG_LEVEL_ERROR, "xrdp_mcs_recv_cjrq: xrdp_iso_recv failed");
|
LOG(LOG_LEVEL_ERROR, "Processing [ITU-T T.25] ChannelJoinRequest failed");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!s_check_rem(s, 1))
|
if (!s_check_rem_and_log(s, 1, "Parsing [ITU-T T.125] DomainMCSPDU"))
|
||||||
{
|
{
|
||||||
LOG_DEVEL(LOG_LEVEL_ERROR, "Not enough bytes in the stream, "
|
|
||||||
"len 1, remaining %d", s_rem(s));
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
in_uint8(s, opcode);
|
in_uint8(s, opcode);
|
||||||
|
LOG_DEVEL(LOG_LEVEL_TRACE, "Received [ITU-T T.125] DomainMCSPDU "
|
||||||
|
"choice index %d (ChannelJoinRequest)", (opcode >> 2));
|
||||||
|
|
||||||
if ((opcode >> 2) != MCS_CJRQ)
|
if ((opcode >> 2) != MCS_CJRQ)
|
||||||
{
|
{
|
||||||
LOG_DEVEL(LOG_LEVEL_ERROR, "Parsed [ITU-T T.125] DomainMCSPDU choice index "
|
LOG(LOG_LEVEL_ERROR, "Parsed [ITU-T T.125] DomainMCSPDU choice index "
|
||||||
"expected %d, received %d", MCS_CJRQ, (opcode >> 2));
|
"expected %d, received %d", MCS_CJRQ, (opcode >> 2));
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!s_check_rem(s, 4))
|
if (!s_check_rem_and_log(s, 4, "Parsing [ITU-T T.125] ChannelJoinRequest"))
|
||||||
{
|
{
|
||||||
LOG_DEVEL(LOG_LEVEL_ERROR, "Not enough bytes in the stream, "
|
|
||||||
"len 4, remaining %d", s_rem(s));
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -803,30 +763,24 @@ xrdp_mcs_recv_cjrq(struct xrdp_mcs *self)
|
|||||||
*/
|
*/
|
||||||
if (opcode & 2)
|
if (opcode & 2)
|
||||||
{
|
{
|
||||||
if (!s_check_rem(s, 2))
|
if (!s_check_rem_and_log(s, 2, "Parsing [ITU-T T.125] ChannelJoinRequest nonStandard"))
|
||||||
{
|
{
|
||||||
LOG_DEVEL(LOG_LEVEL_ERROR, "Not enough bytes in the stream, "
|
|
||||||
"len 2, remaining %d", s_rem(s));
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
in_uint8s(s, 2); /* NonStandardParameter.key
|
in_uint8s(s, 2); /* NonStandardParameter.key
|
||||||
NonStandardParameter.data */
|
NonStandardParameter.data */
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!(s_check_end(s)))
|
|
||||||
{
|
|
||||||
LOG_DEVEL(LOG_LEVEL_ERROR, "Expected to be at the end of the stream, "
|
|
||||||
"but there are %d bytes remaining", s_rem(s));
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
LOG_DEVEL(LOG_LEVEL_TRACE, "Received [ITU-T T.125] DomainMCSPDU "
|
|
||||||
"choice index %d (ChannelJoinRequest)", (opcode >> 2));
|
|
||||||
LOG_DEVEL(LOG_LEVEL_TRACE, "Received [ITU-T T.125] ChannelJoinRequest "
|
LOG_DEVEL(LOG_LEVEL_TRACE, "Received [ITU-T T.125] ChannelJoinRequest "
|
||||||
"initiator (ignored), channelId (ignored), "
|
"initiator (ignored), channelId (ignored), "
|
||||||
"nonStandard (%s)",
|
"nonStandard (%s)",
|
||||||
(opcode & 2) ? "present" : "not present");
|
(opcode & 2) ? "present" : "not present");
|
||||||
|
|
||||||
|
if (!s_check_end_and_log(s, "MCS protocol error [ITU-T T.125] ChannelJoinRequest"))
|
||||||
|
{
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -857,8 +811,8 @@ xrdp_mcs_ber_out_header(struct xrdp_mcs *self, struct stream *s,
|
|||||||
out_uint8(s, len);
|
out_uint8(s, len);
|
||||||
}
|
}
|
||||||
|
|
||||||
// LOG_DEVEL(LOG_LEVEL_TRACE, "Added header [ITU-T X.690] Identifier %d, Length %d",
|
LOG_DEVEL(LOG_LEVEL_TRACE, "Adding header [ITU-T X.690] Identifier %d, Length %d",
|
||||||
// tag_val, len);
|
tag_val, len);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -915,7 +869,7 @@ xrdp_mcs_out_domain_params(struct xrdp_mcs *self, struct stream *s,
|
|||||||
xrdp_mcs_ber_out_int24(self, s, max_pdu_size);
|
xrdp_mcs_ber_out_int24(self, s, max_pdu_size);
|
||||||
xrdp_mcs_ber_out_int8(self, s, 2); /* protocolVersion */
|
xrdp_mcs_ber_out_int8(self, s, 2); /* protocolVersion */
|
||||||
|
|
||||||
LOG_DEVEL(LOG_LEVEL_TRACE, "Write to stream [ITU-T T.125] DomainParameters "
|
LOG_DEVEL(LOG_LEVEL_TRACE, "Adding struct [ITU-T T.125] DomainParameters "
|
||||||
"maxChannelIds %d, maxUserIds %d, maxTokenIds %d, numPriorities 1, "
|
"maxChannelIds %d, maxUserIds %d, maxTokenIds %d, numPriorities 1, "
|
||||||
"minThroughput 0 B/s, maxHeight 1, maxMCSPDUsize %d, "
|
"minThroughput 0 B/s, maxHeight 1, maxMCSPDUsize %d, "
|
||||||
"protocolVersion 2",
|
"protocolVersion 2",
|
||||||
@ -1223,7 +1177,7 @@ xrdp_mcs_send_connect_response(struct xrdp_mcs *self)
|
|||||||
out_uint8a(s, self->server_mcs_data->data, data_len);
|
out_uint8a(s, self->server_mcs_data->data, data_len);
|
||||||
s_mark_end(s);
|
s_mark_end(s);
|
||||||
|
|
||||||
LOG_DEVEL(LOG_LEVEL_TRACE, "Sening [ITU-T T.125] Connect-Response "
|
LOG_DEVEL(LOG_LEVEL_TRACE, "Sending [ITU-T T.125] Connect-Response "
|
||||||
"result SUCCESS, calledConnectId 0, "
|
"result SUCCESS, calledConnectId 0, "
|
||||||
"domainParameters (see xrdp_mcs_out_domain_params() trace logs), "
|
"domainParameters (see xrdp_mcs_out_domain_params() trace logs), "
|
||||||
"userData (see xrdp_mcs_out_gcc_data() trace logs and "
|
"userData (see xrdp_mcs_out_gcc_data() trace logs and "
|
||||||
@ -1233,7 +1187,7 @@ xrdp_mcs_send_connect_response(struct xrdp_mcs *self)
|
|||||||
if (xrdp_iso_send(self->iso_layer, s) != 0)
|
if (xrdp_iso_send(self->iso_layer, s) != 0)
|
||||||
{
|
{
|
||||||
free_stream(s);
|
free_stream(s);
|
||||||
LOG(LOG_LEVEL_ERROR, "xrdp_mcs_send_connect_response: xrdp_iso_send failed");
|
LOG(LOG_LEVEL_ERROR, "Sending [ITU-T T.125] Connect-Response failed");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1252,73 +1206,74 @@ xrdp_mcs_incoming(struct xrdp_mcs *self)
|
|||||||
{
|
{
|
||||||
int index;
|
int index;
|
||||||
|
|
||||||
LOG_DEVEL(LOG_LEVEL_DEBUG, "MCS Connection Sequence: receive connection request");
|
LOG_DEVEL(LOG_LEVEL_DEBUG, "[MCS Connection Sequence] receive connection request");
|
||||||
if (xrdp_mcs_recv_connect_initial(self) != 0)
|
if (xrdp_mcs_recv_connect_initial(self) != 0)
|
||||||
{
|
{
|
||||||
LOG_DEVEL(LOG_LEVEL_ERROR, "xrdp_mcs_incoming: xrdp_mcs_recv_connect_initial failed");
|
LOG(LOG_LEVEL_ERROR, "[MCS Connection Sequence] receive connection request failed");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* in xrdp_sec.c */
|
/* in xrdp_sec.c */
|
||||||
if (xrdp_sec_process_mcs_data(self->sec_layer) != 0)
|
if (xrdp_sec_process_mcs_data(self->sec_layer) != 0)
|
||||||
{
|
{
|
||||||
LOG_DEVEL(LOG_LEVEL_ERROR, "xrdp_mcs_incoming: xrdp_sec_process_mcs_data failed");
|
LOG(LOG_LEVEL_ERROR, "[MCS Connection Sequence] Connect Initial PDU with GCC Conference Create Request failed");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
LOG_DEVEL(LOG_LEVEL_DEBUG, "[MCS Connection Sequence] construct connection reponse");
|
||||||
if (xrdp_mcs_out_gcc_data(self->sec_layer) != 0)
|
if (xrdp_mcs_out_gcc_data(self->sec_layer) != 0)
|
||||||
{
|
{
|
||||||
LOG_DEVEL(LOG_LEVEL_ERROR, "xrdp_mcs_incoming: xrdp_mcs_out_gcc_data failed");
|
LOG(LOG_LEVEL_ERROR, "[MCS Connection Sequence] construct connection reponse failed");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
LOG_DEVEL(LOG_LEVEL_DEBUG, "MCS Connection Sequence: send connection reponse");
|
LOG_DEVEL(LOG_LEVEL_DEBUG, "[MCS Connection Sequence] send connection reponse");
|
||||||
if (xrdp_mcs_send_connect_response(self) != 0)
|
if (xrdp_mcs_send_connect_response(self) != 0)
|
||||||
{
|
{
|
||||||
LOG_DEVEL(LOG_LEVEL_ERROR, "xrdp_mcs_incoming: xrdp_mcs_send_connect_response failed");
|
LOG(LOG_LEVEL_ERROR, "[MCS Connection Sequence] send connection reponse failed");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
LOG_DEVEL(LOG_LEVEL_DEBUG, "MCS Connection Sequence: receive erect domain request");
|
LOG_DEVEL(LOG_LEVEL_DEBUG, "[MCS Connection Sequence] receive erect domain request");
|
||||||
if (xrdp_mcs_recv_edrq(self) != 0)
|
if (xrdp_mcs_recv_edrq(self) != 0)
|
||||||
{
|
{
|
||||||
LOG_DEVEL(LOG_LEVEL_ERROR, "xrdp_mcs_incoming: xrdp_mcs_recv_edrq failed");
|
LOG(LOG_LEVEL_ERROR, "[MCS Connection Sequence] receive erect domain request failed");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
LOG_DEVEL(LOG_LEVEL_DEBUG, "MCS Connection Sequence: receive attach user request");
|
LOG_DEVEL(LOG_LEVEL_DEBUG, "[MCS Connection Sequence] receive attach user request");
|
||||||
if (xrdp_mcs_recv_aurq(self) != 0)
|
if (xrdp_mcs_recv_aurq(self) != 0)
|
||||||
{
|
{
|
||||||
LOG_DEVEL(LOG_LEVEL_ERROR, "xrdp_mcs_incoming: xrdp_mcs_recv_aurq failed");
|
LOG(LOG_LEVEL_ERROR, "[MCS Connection Sequence] receive attach user request failed");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
LOG_DEVEL(LOG_LEVEL_DEBUG, "MCS Connection Sequence: send attach user confirm");
|
LOG_DEVEL(LOG_LEVEL_DEBUG, "[MCS Connection Sequence] send attach user confirm");
|
||||||
if (xrdp_mcs_send_aucf(self) != 0)
|
if (xrdp_mcs_send_aucf(self) != 0)
|
||||||
{
|
{
|
||||||
LOG_DEVEL(LOG_LEVEL_ERROR, "xrdp_mcs_incoming: xrdp_mcs_send_aucf failed");
|
LOG(LOG_LEVEL_ERROR, "[MCS Connection Sequence] send attach user confirm failed");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (index = 0; index < self->channel_list->count + 2; index++)
|
for (index = 0; index < self->channel_list->count + 2; index++)
|
||||||
{
|
{
|
||||||
LOG_DEVEL(LOG_LEVEL_DEBUG, "MCS Connection Sequence: receive channel join request");
|
LOG_DEVEL(LOG_LEVEL_DEBUG, "[MCS Connection Sequence] receive channel join request");
|
||||||
if (xrdp_mcs_recv_cjrq(self) != 0)
|
if (xrdp_mcs_recv_cjrq(self) != 0)
|
||||||
{
|
{
|
||||||
LOG_DEVEL(LOG_LEVEL_ERROR, "xrdp_mcs_incoming: xrdp_mcs_recv_cjrq failed");
|
LOG(LOG_LEVEL_ERROR, "[MCS Connection Sequence] receive channel join request failed");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
LOG_DEVEL(LOG_LEVEL_DEBUG, "MCS Connection Sequence: send channel join confirm");
|
LOG_DEVEL(LOG_LEVEL_DEBUG, "[MCS Connection Sequence] send channel join confirm");
|
||||||
if (xrdp_mcs_send_cjcf(self, self->userid,
|
if (xrdp_mcs_send_cjcf(self, self->userid,
|
||||||
self->userid + MCS_USERCHANNEL_BASE + index) != 0)
|
self->userid + MCS_USERCHANNEL_BASE + index) != 0)
|
||||||
{
|
{
|
||||||
LOG_DEVEL(LOG_LEVEL_ERROR, "xrdp_mcs_incoming: xrdp_mcs_send_cjcf failed");
|
LOG(LOG_LEVEL_ERROR, "[MCS Connection Sequence] send channel join confirm failed");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
LOG_DEVEL(LOG_LEVEL_DEBUG, "MCS Connection Sequence: completed");
|
LOG_DEVEL(LOG_LEVEL_DEBUG, "[MCS Connection Sequence] completed");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1485,7 +1440,7 @@ xrdp_mcs_disconnect(struct xrdp_mcs *self)
|
|||||||
{
|
{
|
||||||
free_stream(s);
|
free_stream(s);
|
||||||
close_rdp_socket(self);
|
close_rdp_socket(self);
|
||||||
LOG(LOG_LEVEL_ERROR, "xrdp_mcs_disconnect: xrdp_iso_send failed");
|
LOG(LOG_LEVEL_ERROR, "Sending [ITU T.125] DisconnectProviderUltimatum failed");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -83,7 +83,7 @@ xrdp_orders_reset(struct xrdp_orders *self)
|
|||||||
{
|
{
|
||||||
if (xrdp_orders_force_send(self) != 0)
|
if (xrdp_orders_force_send(self) != 0)
|
||||||
{
|
{
|
||||||
LOG_DEVEL(LOG_LEVEL_ERROR, "xrdp_orders_reset: xrdp_orders_force_send failed");
|
LOG(LOG_LEVEL_ERROR, "xrdp_orders_reset: xrdp_orders_force_send failed");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
g_free(self->orders_state.text_data);
|
g_free(self->orders_state.text_data);
|
||||||
@ -110,7 +110,7 @@ xrdp_orders_init(struct xrdp_orders *self)
|
|||||||
LOG_DEVEL(LOG_LEVEL_DEBUG, "xrdp_orders_init: fastpath");
|
LOG_DEVEL(LOG_LEVEL_DEBUG, "xrdp_orders_init: fastpath");
|
||||||
if (xrdp_rdp_init_fastpath(self->rdp_layer, self->out_s) != 0)
|
if (xrdp_rdp_init_fastpath(self->rdp_layer, self->out_s) != 0)
|
||||||
{
|
{
|
||||||
LOG_DEVEL(LOG_LEVEL_ERROR, "xrdp_orders_init: xrdp_rdp_init_fastpath failed");
|
LOG(LOG_LEVEL_ERROR, "xrdp_orders_init: xrdp_rdp_init_fastpath failed");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
self->order_count_ptr = self->out_s->p;
|
self->order_count_ptr = self->out_s->p;
|
||||||
@ -121,7 +121,7 @@ xrdp_orders_init(struct xrdp_orders *self)
|
|||||||
{
|
{
|
||||||
if (xrdp_rdp_init_data(self->rdp_layer, self->out_s) != 0)
|
if (xrdp_rdp_init_data(self->rdp_layer, self->out_s) != 0)
|
||||||
{
|
{
|
||||||
LOG_DEVEL(LOG_LEVEL_ERROR, "xrdp_orders_init: xrdp_rdp_init_data failed");
|
LOG(LOG_LEVEL_ERROR, "xrdp_orders_init: xrdp_rdp_init_data failed");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
out_uint16_le(self->out_s, RDP_UPDATE_ORDERS); /* updateType */
|
out_uint16_le(self->out_s, RDP_UPDATE_ORDERS); /* updateType */
|
||||||
@ -161,8 +161,8 @@ xrdp_orders_send(struct xrdp_orders *self)
|
|||||||
if (xrdp_rdp_send_fastpath(self->rdp_layer,
|
if (xrdp_rdp_send_fastpath(self->rdp_layer,
|
||||||
self->out_s, 0) != 0)
|
self->out_s, 0) != 0)
|
||||||
{
|
{
|
||||||
LOG_DEVEL(LOG_LEVEL_ERROR,
|
LOG(LOG_LEVEL_ERROR,
|
||||||
"xrdp_orders_send: xrdp_rdp_send_fastpath failed");
|
"xrdp_orders_send: xrdp_rdp_send_fastpath failed");
|
||||||
rv = 1;
|
rv = 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -171,8 +171,8 @@ xrdp_orders_send(struct xrdp_orders *self)
|
|||||||
if (xrdp_rdp_send_data(self->rdp_layer, self->out_s,
|
if (xrdp_rdp_send_data(self->rdp_layer, self->out_s,
|
||||||
RDP_DATA_PDU_UPDATE) != 0)
|
RDP_DATA_PDU_UPDATE) != 0)
|
||||||
{
|
{
|
||||||
LOG_DEVEL(LOG_LEVEL_ERROR,
|
LOG(LOG_LEVEL_ERROR,
|
||||||
"xrdp_orders_send: xrdp_rdp_send_data failed");
|
"xrdp_orders_send: xrdp_rdp_send_data failed");
|
||||||
rv = 1;
|
rv = 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -2192,7 +2192,7 @@ xrdp_orders_send_palette(struct xrdp_orders *self, int *palette,
|
|||||||
|
|
||||||
if (xrdp_orders_check(self, 2000) != 0)
|
if (xrdp_orders_check(self, 2000) != 0)
|
||||||
{
|
{
|
||||||
LOG_DEVEL(LOG_LEVEL_ERROR, "xrdp_orders_send_palette: xrdp_orders_check failed");
|
LOG(LOG_LEVEL_ERROR, "xrdp_orders_send_palette: xrdp_orders_check failed");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
self->order_count++;
|
self->order_count++;
|
||||||
|
@ -42,8 +42,8 @@ xrdp_orders_send_window_delete(struct xrdp_orders *self, int window_id)
|
|||||||
order_size = 11;
|
order_size = 11;
|
||||||
if (xrdp_orders_check(self, order_size) != 0)
|
if (xrdp_orders_check(self, order_size) != 0)
|
||||||
{
|
{
|
||||||
LOG_DEVEL(LOG_LEVEL_ERROR,
|
LOG(LOG_LEVEL_ERROR,
|
||||||
"xrdp_orders_send_window_delete: xrdp_orders_check failed");
|
"xrdp_orders_send_window_delete: xrdp_orders_check failed");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
self->order_count++;
|
self->order_count++;
|
||||||
@ -88,8 +88,8 @@ xrdp_orders_send_window_cached_icon(struct xrdp_orders *self,
|
|||||||
order_size = 14;
|
order_size = 14;
|
||||||
if (xrdp_orders_check(self, order_size) != 0)
|
if (xrdp_orders_check(self, order_size) != 0)
|
||||||
{
|
{
|
||||||
LOG_DEVEL(LOG_LEVEL_ERROR,
|
LOG(LOG_LEVEL_ERROR,
|
||||||
"xrdp_orders_send_window_cached_icon: xrdp_orders_check failed");
|
"xrdp_orders_send_window_cached_icon: xrdp_orders_check failed");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
self->order_count++;
|
self->order_count++;
|
||||||
@ -208,8 +208,8 @@ xrdp_orders_send_window_icon(struct xrdp_orders *self,
|
|||||||
|
|
||||||
if (xrdp_orders_check(self, order_size) != 0)
|
if (xrdp_orders_check(self, order_size) != 0)
|
||||||
{
|
{
|
||||||
LOG_DEVEL(LOG_LEVEL_ERROR,
|
LOG(LOG_LEVEL_ERROR,
|
||||||
"xrdp_orders_send_window_icon: xrdp_orders_check failed");
|
"xrdp_orders_send_window_icon: xrdp_orders_check failed");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
self->order_count++;
|
self->order_count++;
|
||||||
@ -422,8 +422,8 @@ xrdp_orders_send_window_new_update(struct xrdp_orders *self, int window_id,
|
|||||||
|
|
||||||
if (xrdp_orders_check(self, order_size) != 0)
|
if (xrdp_orders_check(self, order_size) != 0)
|
||||||
{
|
{
|
||||||
LOG_DEVEL(LOG_LEVEL_ERROR,
|
LOG(LOG_LEVEL_ERROR,
|
||||||
"xrdp_orders_send_window_new_update: xrdp_orders_check failed");
|
"xrdp_orders_send_window_new_update: xrdp_orders_check failed");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
self->order_count++;
|
self->order_count++;
|
||||||
@ -653,8 +653,8 @@ xrdp_orders_send_notify_delete(struct xrdp_orders *self, int window_id,
|
|||||||
order_size = 15;
|
order_size = 15;
|
||||||
if (xrdp_orders_check(self, order_size) != 0)
|
if (xrdp_orders_check(self, order_size) != 0)
|
||||||
{
|
{
|
||||||
LOG_DEVEL(LOG_LEVEL_ERROR,
|
LOG(LOG_LEVEL_ERROR,
|
||||||
"xrdp_orders_send_notify_delete: xrdp_orders_check failed");
|
"xrdp_orders_send_notify_delete: xrdp_orders_check failed");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
self->order_count++;
|
self->order_count++;
|
||||||
@ -759,8 +759,8 @@ xrdp_orders_send_notify_new_update(struct xrdp_orders *self,
|
|||||||
|
|
||||||
if (xrdp_orders_check(self, order_size) != 0)
|
if (xrdp_orders_check(self, order_size) != 0)
|
||||||
{
|
{
|
||||||
LOG_DEVEL(LOG_LEVEL_ERROR,
|
LOG(LOG_LEVEL_ERROR,
|
||||||
"xrdp_orders_send_notify_new_update: xrdp_orders_check failed");
|
"xrdp_orders_send_notify_new_update: xrdp_orders_check failed");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
self->order_count++;
|
self->order_count++;
|
||||||
@ -882,8 +882,8 @@ xrdp_orders_send_monitored_desktop(struct xrdp_orders *self,
|
|||||||
|
|
||||||
if (xrdp_orders_check(self, order_size) != 0)
|
if (xrdp_orders_check(self, order_size) != 0)
|
||||||
{
|
{
|
||||||
LOG_DEVEL(LOG_LEVEL_ERROR,
|
LOG(LOG_LEVEL_ERROR,
|
||||||
"xrdp_orders_send_monitored_desktop: xrdp_orders_check failed");
|
"xrdp_orders_send_monitored_desktop: xrdp_orders_check failed");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
self->order_count++;
|
self->order_count++;
|
||||||
|
@ -399,7 +399,7 @@ xrdp_rdp_init(struct xrdp_rdp *self, struct stream *s)
|
|||||||
{
|
{
|
||||||
if (xrdp_sec_init(self->sec_layer, s) != 0)
|
if (xrdp_sec_init(self->sec_layer, s) != 0)
|
||||||
{
|
{
|
||||||
LOG_DEVEL(LOG_LEVEL_ERROR, "xrdp_rdp_init: xrdp_sec_init failed");
|
LOG(LOG_LEVEL_ERROR, "xrdp_rdp_init: xrdp_sec_init failed");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -414,7 +414,7 @@ xrdp_rdp_init_data(struct xrdp_rdp *self, struct stream *s)
|
|||||||
{
|
{
|
||||||
if (xrdp_sec_init(self->sec_layer, s) != 0)
|
if (xrdp_sec_init(self->sec_layer, s) != 0)
|
||||||
{
|
{
|
||||||
LOG_DEVEL(LOG_LEVEL_ERROR, "xrdp_rdp_init_data: xrdp_sec_init failed");
|
LOG(LOG_LEVEL_ERROR, "xrdp_rdp_init_data: xrdp_sec_init failed");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -449,7 +449,7 @@ xrdp_rdp_recv(struct xrdp_rdp *self, struct stream *s, int *code)
|
|||||||
{
|
{
|
||||||
if (xrdp_sec_recv_fastpath(self->sec_layer, s) != 0)
|
if (xrdp_sec_recv_fastpath(self->sec_layer, s) != 0)
|
||||||
{
|
{
|
||||||
LOG_DEVEL(LOG_LEVEL_ERROR, "xrdp_rdp_recv: xrdp_sec_recv_fastpath failed");
|
LOG(LOG_LEVEL_ERROR, "xrdp_rdp_recv: xrdp_sec_recv_fastpath failed");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
/* next_packet gets set in xrdp_sec_recv_fastpath */
|
/* next_packet gets set in xrdp_sec_recv_fastpath */
|
||||||
@ -510,13 +510,13 @@ xrdp_rdp_recv(struct xrdp_rdp *self, struct stream *s, int *code)
|
|||||||
s->p = s->next_packet;
|
s->p = s->next_packet;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!s_check_rem(s, 6))
|
if (!s_check_rem_and_log(s, 6, "Parsing [MS-RDPBCGR] TS_SHARECONTROLHEADER"))
|
||||||
{
|
{
|
||||||
s->next_packet = 0;
|
s->next_packet = 0;
|
||||||
*code = 0;
|
*code = 0;
|
||||||
len = (int)(s->end - s->p);
|
len = (int)(s->end - s->p);
|
||||||
LOG_DEVEL(LOG_LEVEL_ERROR, "xrdp_rdp_recv: out code 0 (skip data) "
|
LOG(LOG_LEVEL_ERROR, "xrdp_rdp_recv: out code 0 (skip data) "
|
||||||
"bad RDP packet, length [%d]", len);
|
"bad RDP packet");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -679,7 +679,7 @@ xrdp_rdp_init_fastpath(struct xrdp_rdp *self, struct stream *s)
|
|||||||
{
|
{
|
||||||
if (xrdp_sec_init_fastpath(self->sec_layer, s) != 0)
|
if (xrdp_sec_init_fastpath(self->sec_layer, s) != 0)
|
||||||
{
|
{
|
||||||
LOG_DEVEL(LOG_LEVEL_ERROR, "xrdp_rdp_init_fastpath: xrdp_sec_init_fastpath failed");
|
LOG(LOG_LEVEL_ERROR, "xrdp_rdp_init_fastpath: xrdp_sec_init_fastpath failed");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
if (self->client_info.rdp_compression)
|
if (self->client_info.rdp_compression)
|
||||||
@ -765,7 +765,7 @@ xrdp_rdp_send_fastpath(struct xrdp_rdp *self, struct stream *s,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
send_len = no_comp_len;
|
send_len = no_comp_len;
|
||||||
LOG_DEVEL(LOG_LEVEL_DEBUG, "xrdp_rdp_send_fastpath: no_comp_len %d fragmentation %d",
|
LOG_DEVEL(LOG_LEVEL_DEBUG, "xrdp_rdp_send_fastpath: no_comp_len %d, fragmentation %d",
|
||||||
no_comp_len, fragmentation);
|
no_comp_len, fragmentation);
|
||||||
if ((compression != 0) && (no_comp_len > header_bytes + 16))
|
if ((compression != 0) && (no_comp_len > header_bytes + 16))
|
||||||
{
|
{
|
||||||
@ -790,10 +790,10 @@ xrdp_rdp_send_fastpath(struct xrdp_rdp *self, struct stream *s,
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
LOG_DEVEL(LOG_LEVEL_DEBUG,
|
LOG(LOG_LEVEL_DEBUG,
|
||||||
"compress_rdp failed, sending uncompressed data. "
|
"compress_rdp failed, sending uncompressed data. "
|
||||||
"type %d, flags %d", mppc_enc->protocol_type,
|
"type %d, flags %d", mppc_enc->protocol_type,
|
||||||
mppc_enc->flags);
|
mppc_enc->flags);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
updateHeader = (updateCode & 15) |
|
updateHeader = (updateCode & 15) |
|
||||||
@ -841,7 +841,7 @@ xrdp_rdp_send_data_update_sync(struct xrdp_rdp *self)
|
|||||||
{
|
{
|
||||||
if (xrdp_rdp_init_fastpath(self, s) != 0)
|
if (xrdp_rdp_init_fastpath(self, s) != 0)
|
||||||
{
|
{
|
||||||
LOG_DEVEL(LOG_LEVEL_ERROR, "xrdp_rdp_send_data_update_sync: xrdp_rdp_init_fastpath failed");
|
LOG(LOG_LEVEL_ERROR, "xrdp_rdp_send_data_update_sync: xrdp_rdp_init_fastpath failed");
|
||||||
free_stream(s);
|
free_stream(s);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
@ -867,7 +867,7 @@ xrdp_rdp_send_data_update_sync(struct xrdp_rdp *self)
|
|||||||
if (xrdp_rdp_send_fastpath(self, s,
|
if (xrdp_rdp_send_fastpath(self, s,
|
||||||
FASTPATH_UPDATETYPE_SYNCHRONIZE) != 0)
|
FASTPATH_UPDATETYPE_SYNCHRONIZE) != 0)
|
||||||
{
|
{
|
||||||
LOG_DEVEL(LOG_LEVEL_ERROR, "xrdp_rdp_send_data_update_sync: xrdp_rdp_send_fastpath failed");
|
LOG(LOG_LEVEL_ERROR, "Sending [MS-RDPBCGR] TS_FP_UPDATE_SYNCHRONIZE failed");
|
||||||
free_stream(s);
|
free_stream(s);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
@ -880,7 +880,7 @@ xrdp_rdp_send_data_update_sync(struct xrdp_rdp *self)
|
|||||||
RDP_UPDATE_SYNCHRONIZE);
|
RDP_UPDATE_SYNCHRONIZE);
|
||||||
if (xrdp_rdp_send_data(self, s, RDP_DATA_PDU_UPDATE) != 0)
|
if (xrdp_rdp_send_data(self, s, RDP_DATA_PDU_UPDATE) != 0)
|
||||||
{
|
{
|
||||||
LOG(LOG_LEVEL_ERROR, "xrdp_rdp_send_data_update_sync: xrdp_rdp_send_data failed");
|
LOG(LOG_LEVEL_ERROR, "Sending [MS-RDPBCGR] TS_UPDATE_SYNC failed");
|
||||||
free_stream(s);
|
free_stream(s);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
@ -899,7 +899,7 @@ xrdp_rdp_incoming(struct xrdp_rdp *self)
|
|||||||
|
|
||||||
if (xrdp_sec_incoming(self->sec_layer) != 0)
|
if (xrdp_sec_incoming(self->sec_layer) != 0)
|
||||||
{
|
{
|
||||||
LOG_DEVEL(LOG_LEVEL_ERROR, "xrdp_rdp_incoming: xrdp_sec_incoming failed");
|
LOG(LOG_LEVEL_ERROR, "xrdp_rdp_incoming: xrdp_sec_incoming failed");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
self->mcs_channel = self->sec_layer->mcs_layer->userid +
|
self->mcs_channel = self->sec_layer->mcs_layer->userid +
|
||||||
@ -958,10 +958,8 @@ xrdp_rdp_process_data_input(struct xrdp_rdp *self, struct stream *s)
|
|||||||
int param2;
|
int param2;
|
||||||
int time;
|
int time;
|
||||||
|
|
||||||
if (!s_check_rem(s, 4))
|
if (!s_check_rem_and_log(s, 4, "Parsing [MS-RDPBCGR] TS_INPUT_PDU_DATA"))
|
||||||
{
|
{
|
||||||
LOG_DEVEL(LOG_LEVEL_ERROR, "Not enough bytes in the stream "
|
|
||||||
"len 4, remaining %d", s_rem(s));
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
in_uint16_le(s, num_events);
|
in_uint16_le(s, num_events);
|
||||||
@ -971,10 +969,8 @@ xrdp_rdp_process_data_input(struct xrdp_rdp *self, struct stream *s)
|
|||||||
|
|
||||||
for (index = 0; index < num_events; index++)
|
for (index = 0; index < num_events; index++)
|
||||||
{
|
{
|
||||||
if (!s_check_rem(s, 12))
|
if (!s_check_rem_and_log(s, 12, "Parsing [MS-RDPBCGR] TS_INPUT_EVENT"))
|
||||||
{
|
{
|
||||||
LOG_DEVEL(LOG_LEVEL_ERROR, "Not enough bytes in the stream "
|
|
||||||
"len 12, remaining %d", s_rem(s));
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
in_uint32_le(s, time);
|
in_uint32_le(s, time);
|
||||||
@ -1049,7 +1045,7 @@ xrdp_rdp_send_synchronise(struct xrdp_rdp *self)
|
|||||||
|
|
||||||
if (xrdp_rdp_init_data(self, s) != 0)
|
if (xrdp_rdp_init_data(self, s) != 0)
|
||||||
{
|
{
|
||||||
LOG_DEVEL(LOG_LEVEL_ERROR, "xrdp_rdp_send_synchronise: xrdp_rdp_init_data failed");
|
LOG(LOG_LEVEL_ERROR, "xrdp_rdp_send_synchronise: xrdp_rdp_init_data failed");
|
||||||
free_stream(s);
|
free_stream(s);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
@ -1062,7 +1058,7 @@ xrdp_rdp_send_synchronise(struct xrdp_rdp *self)
|
|||||||
|
|
||||||
if (xrdp_rdp_send_data(self, s, RDP_DATA_PDU_SYNCHRONISE) != 0)
|
if (xrdp_rdp_send_data(self, s, RDP_DATA_PDU_SYNCHRONISE) != 0)
|
||||||
{
|
{
|
||||||
LOG_DEVEL(LOG_LEVEL_ERROR, "xrdp_rdp_send_synchronise: xrdp_rdp_send_data failed");
|
LOG(LOG_LEVEL_ERROR, "Sending [MS-RDPBCGR] TS_SYNCHRONIZE_PDU failed");
|
||||||
free_stream(s);
|
free_stream(s);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
@ -1083,7 +1079,7 @@ xrdp_rdp_send_control(struct xrdp_rdp *self, int action)
|
|||||||
|
|
||||||
if (xrdp_rdp_init_data(self, s) != 0)
|
if (xrdp_rdp_init_data(self, s) != 0)
|
||||||
{
|
{
|
||||||
LOG_DEVEL(LOG_LEVEL_ERROR, "xrdp_rdp_send_control: xrdp_rdp_init_data failed");
|
LOG(LOG_LEVEL_ERROR, "xrdp_rdp_send_control: xrdp_rdp_init_data failed");
|
||||||
free_stream(s);
|
free_stream(s);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
@ -1097,7 +1093,7 @@ xrdp_rdp_send_control(struct xrdp_rdp *self, int action)
|
|||||||
|
|
||||||
if (xrdp_rdp_send_data(self, s, RDP_DATA_PDU_CONTROL) != 0)
|
if (xrdp_rdp_send_data(self, s, RDP_DATA_PDU_CONTROL) != 0)
|
||||||
{
|
{
|
||||||
LOG_DEVEL(LOG_LEVEL_ERROR, "xrdp_rdp_send_control: xrdp_rdp_send_data failed");
|
LOG(LOG_LEVEL_ERROR, "Sending [MS-RDPBCGR] TS_CONTROL_PDU failed");
|
||||||
free_stream(s);
|
free_stream(s);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
@ -1162,10 +1158,8 @@ xrdp_rdp_process_screen_update(struct xrdp_rdp *self, struct stream *s)
|
|||||||
int cx;
|
int cx;
|
||||||
int cy;
|
int cy;
|
||||||
|
|
||||||
if (!s_check_rem(s, 4))
|
if (!s_check_rem_and_log(s, 4, "Parsing [MS-RDPBCGR] TS_REFRESH_RECT_PDU"))
|
||||||
{
|
{
|
||||||
LOG_DEVEL(LOG_LEVEL_ERROR, "Not enough bytes in the stream "
|
|
||||||
"len 4, remaining %d", s_rem(s));
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
in_uint8(s, num_rects);
|
in_uint8(s, num_rects);
|
||||||
@ -1174,10 +1168,8 @@ xrdp_rdp_process_screen_update(struct xrdp_rdp *self, struct stream *s)
|
|||||||
"numberOfAreas %d", num_rects);
|
"numberOfAreas %d", num_rects);
|
||||||
for (index = 0; index < num_rects; index++)
|
for (index = 0; index < num_rects; index++)
|
||||||
{
|
{
|
||||||
if (!s_check_rem(s, 8))
|
if (!s_check_rem_and_log(s, 8, "Parsing [MS-RDPBCGR] TS_RECTANGLE16"))
|
||||||
{
|
{
|
||||||
LOG_DEVEL(LOG_LEVEL_ERROR, "Not enough bytes in the stream "
|
|
||||||
"len 8, remaining %d", s_rem(s));
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
/* Inclusive Rectangle (TS_RECTANGLE16) */
|
/* Inclusive Rectangle (TS_RECTANGLE16) */
|
||||||
@ -1186,7 +1178,7 @@ xrdp_rdp_process_screen_update(struct xrdp_rdp *self, struct stream *s)
|
|||||||
in_uint16_le(s, right);
|
in_uint16_le(s, right);
|
||||||
in_uint16_le(s, bottom);
|
in_uint16_le(s, bottom);
|
||||||
LOG_DEVEL(LOG_LEVEL_TRACE, "With field [MS-RDPBCGR] TS_RECTANGLE16 "
|
LOG_DEVEL(LOG_LEVEL_TRACE, "With field [MS-RDPBCGR] TS_RECTANGLE16 "
|
||||||
"left %d top %d right %d bottom %d",
|
"left %d, top %d, right %d, bottom %d",
|
||||||
left, top, right, bottom);
|
left, top, right, bottom);
|
||||||
cx = (right - left) + 1;
|
cx = (right - left) + 1;
|
||||||
cy = (bottom - top) + 1;
|
cy = (bottom - top) + 1;
|
||||||
@ -1216,8 +1208,8 @@ xrdp_rdp_send_fontmap(struct xrdp_rdp *self)
|
|||||||
|
|
||||||
if (xrdp_rdp_init_data(self, s) != 0)
|
if (xrdp_rdp_init_data(self, s) != 0)
|
||||||
{
|
{
|
||||||
LOG_DEVEL(LOG_LEVEL_ERROR,
|
LOG(LOG_LEVEL_ERROR,
|
||||||
"xrdp_rdp_send_fontmap: xrdp_rdp_init_data failed");
|
"xrdp_rdp_send_fontmap: xrdp_rdp_init_data failed");
|
||||||
free_stream(s);
|
free_stream(s);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
@ -1233,8 +1225,8 @@ xrdp_rdp_send_fontmap(struct xrdp_rdp *self)
|
|||||||
|
|
||||||
if (xrdp_rdp_send_data(self, s, 0x28) != 0)
|
if (xrdp_rdp_send_data(self, s, 0x28) != 0)
|
||||||
{
|
{
|
||||||
LOG_DEVEL(LOG_LEVEL_ERROR,
|
LOG(LOG_LEVEL_ERROR,
|
||||||
"xrdp_rdp_send_data: xrdp_rdp_init_data failed");
|
"Sending [MS-RDPBCGR] TS_FONT_MAP_PDU failed");
|
||||||
free_stream(s);
|
free_stream(s);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
@ -1250,6 +1242,11 @@ xrdp_rdp_process_data_font(struct xrdp_rdp *self, struct stream *s)
|
|||||||
{
|
{
|
||||||
int seq;
|
int seq;
|
||||||
|
|
||||||
|
if (!s_check_rem_and_log(s, 6, "Parsing [MS-RDPBCGR] TS_FONT_LIST_PDU"))
|
||||||
|
{
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
in_uint8s(s, 2); /* NumberFonts: 0x0, SHOULD be set to 0 */
|
in_uint8s(s, 2); /* NumberFonts: 0x0, SHOULD be set to 0 */
|
||||||
in_uint8s(s, 2); /* TotalNumberFonts: 0x0, SHOULD be set to 0 */
|
in_uint8s(s, 2); /* TotalNumberFonts: 0x0, SHOULD be set to 0 */
|
||||||
in_uint16_le(s, seq); /* ListFlags */
|
in_uint16_le(s, seq); /* ListFlags */
|
||||||
@ -1294,8 +1291,8 @@ xrdp_rdp_send_disconnect_query_response(struct xrdp_rdp *self)
|
|||||||
|
|
||||||
if (xrdp_rdp_init_data(self, s) != 0)
|
if (xrdp_rdp_init_data(self, s) != 0)
|
||||||
{
|
{
|
||||||
LOG_DEVEL(LOG_LEVEL_ERROR,
|
LOG(LOG_LEVEL_ERROR,
|
||||||
"xrdp_rdp_send_disconnect_query_response: xrdp_rdp_init_data failed");
|
"xrdp_rdp_send_disconnect_query_response: xrdp_rdp_init_data failed");
|
||||||
free_stream(s);
|
free_stream(s);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
@ -1305,8 +1302,8 @@ xrdp_rdp_send_disconnect_query_response(struct xrdp_rdp *self)
|
|||||||
|
|
||||||
if (xrdp_rdp_send_data(self, s, PDUTYPE2_SHUTDOWN_DENIED) != 0)
|
if (xrdp_rdp_send_data(self, s, PDUTYPE2_SHUTDOWN_DENIED) != 0)
|
||||||
{
|
{
|
||||||
LOG_DEVEL(LOG_LEVEL_ERROR,
|
LOG(LOG_LEVEL_ERROR,
|
||||||
"xrdp_rdp_send_disconnect_query_response: xrdp_rdp_send_data failed");
|
"Sending [MS-RDPBCGR] TS_SHUTDOWN_DENIED_PDU failed");
|
||||||
free_stream(s);
|
free_stream(s);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
@ -1328,8 +1325,8 @@ xrdp_rdp_send_disconnect_reason(struct xrdp_rdp *self, int reason)
|
|||||||
|
|
||||||
if (xrdp_rdp_init_data(self, s) != 0)
|
if (xrdp_rdp_init_data(self, s) != 0)
|
||||||
{
|
{
|
||||||
LOG_DEVEL(LOG_LEVEL_ERROR,
|
LOG(LOG_LEVEL_ERROR,
|
||||||
"xrdp_rdp_send_disconnect_reason: xrdp_rdp_init_data failed");
|
"xrdp_rdp_send_disconnect_reason: xrdp_rdp_init_data failed");
|
||||||
free_stream(s);
|
free_stream(s);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
@ -1341,8 +1338,8 @@ xrdp_rdp_send_disconnect_reason(struct xrdp_rdp *self, int reason)
|
|||||||
|
|
||||||
if (xrdp_rdp_send_data(self, s, RDP_DATA_PDU_DISCONNECT) != 0)
|
if (xrdp_rdp_send_data(self, s, RDP_DATA_PDU_DISCONNECT) != 0)
|
||||||
{
|
{
|
||||||
LOG_DEVEL(LOG_LEVEL_ERROR,
|
LOG(LOG_LEVEL_ERROR,
|
||||||
"xrdp_rdp_send_disconnect_reason: xrdp_rdp_send_data failed");
|
"Sending [MS-RDPBCGR] TS_SET_ERROR_INFO_PDU failed");
|
||||||
free_stream(s);
|
free_stream(s);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
@ -1359,6 +1356,10 @@ xrdp_rdp_process_frame_ack(struct xrdp_rdp *self, struct stream *s)
|
|||||||
{
|
{
|
||||||
int frame_id;
|
int frame_id;
|
||||||
|
|
||||||
|
if (!s_check_rem_and_log(s, 4, "Parsing [MS-RDPRFX] TS_FRAME_ACKNOWLEDGE_PDU"))
|
||||||
|
{
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
in_uint32_le(s, frame_id);
|
in_uint32_le(s, frame_id);
|
||||||
LOG_DEVEL(LOG_LEVEL_TRACE, "Received [MS-RDPRFX] TS_FRAME_ACKNOWLEDGE_PDU "
|
LOG_DEVEL(LOG_LEVEL_TRACE, "Received [MS-RDPRFX] TS_FRAME_ACKNOWLEDGE_PDU "
|
||||||
"frameID %d", frame_id);
|
"frameID %d", frame_id);
|
||||||
@ -1387,10 +1388,8 @@ xrdp_rdp_process_suppress(struct xrdp_rdp *self, struct stream *s)
|
|||||||
int right;
|
int right;
|
||||||
int bottom;
|
int bottom;
|
||||||
|
|
||||||
if (!s_check_rem(s, 1))
|
if (!s_check_rem_and_log(s, 1, "Parsing [MS-RDPBCGR] TS_SUPPRESS_OUTPUT_PDU"))
|
||||||
{
|
{
|
||||||
LOG_DEVEL(LOG_LEVEL_ERROR, "Not enough bytes in the stream "
|
|
||||||
"len 1, remaining %d", s_rem(s));
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
in_uint8(s, allowDisplayUpdates);
|
in_uint8(s, allowDisplayUpdates);
|
||||||
@ -1415,10 +1414,8 @@ xrdp_rdp_process_suppress(struct xrdp_rdp *self, struct stream *s)
|
|||||||
case 1: /* ALLOW_DISPLAY_UPDATES */
|
case 1: /* ALLOW_DISPLAY_UPDATES */
|
||||||
self->client_info.suppress_output = 0;
|
self->client_info.suppress_output = 0;
|
||||||
LOG_DEVEL(LOG_LEVEL_DEBUG, "Client requested display output to be enabled");
|
LOG_DEVEL(LOG_LEVEL_DEBUG, "Client requested display output to be enabled");
|
||||||
if (!s_check_rem(s, 11))
|
if (!s_check_rem_and_log(s, 11, "Parsing [MS-RDPBCGR] Padding and TS_RECTANGLE16"))
|
||||||
{
|
{
|
||||||
LOG_DEVEL(LOG_LEVEL_ERROR, "Not enough bytes in the stream "
|
|
||||||
"len 11, remaining %d", s_rem(s));
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
in_uint8s(s, 3); /* pad */
|
in_uint8s(s, 3); /* pad */
|
||||||
@ -1455,10 +1452,8 @@ xrdp_rdp_process_data(struct xrdp_rdp *self, struct stream *s)
|
|||||||
int compressedType;
|
int compressedType;
|
||||||
int compressedLength;
|
int compressedLength;
|
||||||
|
|
||||||
if (!s_check_rem(s, 12))
|
if (!s_check_rem_and_log(s, 12, "Parsing [MS-RDPBCGR] TS_SHAREDATAHEADER"))
|
||||||
{
|
{
|
||||||
LOG_DEVEL(LOG_LEVEL_ERROR, "Not enough bytes in the stream "
|
|
||||||
"len 12, remaining %d", s_rem(s));
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
in_uint8s(s, 6); /* shareID (4 bytes), padding (1 byte), streamID (1 byte) */
|
in_uint8s(s, 6); /* shareID (4 bytes), padding (1 byte), streamID (1 byte) */
|
||||||
@ -1466,6 +1461,11 @@ xrdp_rdp_process_data(struct xrdp_rdp *self, struct stream *s)
|
|||||||
in_uint8(s, pduType2);
|
in_uint8(s, pduType2);
|
||||||
in_uint8(s, compressedType);
|
in_uint8(s, compressedType);
|
||||||
in_uint16_le(s, compressedLength);
|
in_uint16_le(s, compressedLength);
|
||||||
|
LOG_DEVEL(LOG_LEVEL_TRACE, "Received [MS-RDPBCGR] TS_SHAREDATAHEADER "
|
||||||
|
"shareID (ignored), streamID (ignored), uncompressedLength %d, "
|
||||||
|
"pduType2 0x%2.2x, compressedType 0x%2.2x, compressedLength %d",
|
||||||
|
uncompressedLength, pduType2, compressedType, compressedLength);
|
||||||
|
|
||||||
if (compressedType != 0)
|
if (compressedType != 0)
|
||||||
{
|
{
|
||||||
/* don't support compression */
|
/* don't support compression */
|
||||||
@ -1476,15 +1476,11 @@ xrdp_rdp_process_data(struct xrdp_rdp *self, struct stream *s)
|
|||||||
}
|
}
|
||||||
if (compressedLength > uncompressedLength)
|
if (compressedLength > uncompressedLength)
|
||||||
{
|
{
|
||||||
LOG_DEVEL(LOG_LEVEL_ERROR, "The compressed length %d is larger than "
|
LOG(LOG_LEVEL_ERROR, "The compressed length %d is larger than "
|
||||||
"the uncompressed length %d, failing the processing of this "
|
"the uncompressed length %d, failing the processing of this "
|
||||||
"PDU", compressedLength, uncompressedLength);
|
"PDU", compressedLength, uncompressedLength);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
LOG_DEVEL(LOG_LEVEL_TRACE, "Received [MS-RDPBCGR] TS_SHAREDATAHEADER "
|
|
||||||
"shareID (ignored), streamID (ignored), uncompressedLength %d, "
|
|
||||||
"pduType2 0x%2.2x, compressedType 0x%2.2x, compressedLength %d",
|
|
||||||
uncompressedLength, pduType2, compressedType, compressedLength);
|
|
||||||
|
|
||||||
switch (pduType2)
|
switch (pduType2)
|
||||||
{
|
{
|
||||||
@ -1520,7 +1516,9 @@ xrdp_rdp_process_data(struct xrdp_rdp *self, struct stream *s)
|
|||||||
xrdp_rdp_process_frame_ack(self, s);
|
xrdp_rdp_process_frame_ack(self, s);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
LOG_DEVEL(LOG_LEVEL_WARNING, "unknown pduType2 %d (ignoring)", pduType2);
|
LOG(LOG_LEVEL_WARNING,
|
||||||
|
"Received unknown [MS-RDPBCGR] TS_SHAREDATAHEADER pduType2 %d (ignoring)",
|
||||||
|
pduType2);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
@ -1529,12 +1527,7 @@ xrdp_rdp_process_data(struct xrdp_rdp *self, struct stream *s)
|
|||||||
int
|
int
|
||||||
xrdp_rdp_disconnect(struct xrdp_rdp *self)
|
xrdp_rdp_disconnect(struct xrdp_rdp *self)
|
||||||
{
|
{
|
||||||
int rv;
|
return xrdp_sec_disconnect(self->sec_layer);
|
||||||
|
|
||||||
LOG_DEVEL(LOG_LEVEL_TRACE, "in xrdp_rdp_disconnect");
|
|
||||||
rv = xrdp_sec_disconnect(self->sec_layer);
|
|
||||||
LOG_DEVEL(LOG_LEVEL_TRACE, "out xrdp_rdp_disconnect");
|
|
||||||
return rv;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
@ -1543,28 +1536,30 @@ xrdp_rdp_send_deactivate(struct xrdp_rdp *self)
|
|||||||
{
|
{
|
||||||
struct stream *s;
|
struct stream *s;
|
||||||
|
|
||||||
LOG_DEVEL(LOG_LEVEL_TRACE, "in xrdp_rdp_send_deactivate");
|
|
||||||
make_stream(s);
|
make_stream(s);
|
||||||
init_stream(s, 8192);
|
init_stream(s, 8192);
|
||||||
|
|
||||||
if (xrdp_rdp_init(self, s) != 0)
|
if (xrdp_rdp_init(self, s) != 0)
|
||||||
{
|
{
|
||||||
free_stream(s);
|
free_stream(s);
|
||||||
LOG(LOG_LEVEL_ERROR, "out xrdp_rdp_send_deactivate error");
|
LOG(LOG_LEVEL_ERROR, "xrdp_rdp_send_deactivate: xrdp_rdp_init failed");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* TODO: why are all the fields missing from the TS_DEACTIVATE_ALL_PDU? */
|
||||||
s_mark_end(s);
|
s_mark_end(s);
|
||||||
|
LOG_DEVEL(LOG_LEVEL_TRACE, "Sending [MS-RDPBCGR] TS_DEACTIVATE_ALL_PDU "
|
||||||
|
"shareID <not set>, lengthSourceDescriptor <not set>, "
|
||||||
|
"sourceDescriptor <not set>");
|
||||||
|
|
||||||
if (xrdp_rdp_send(self, s, PDUTYPE_DEACTIVATEALLPDU) != 0)
|
if (xrdp_rdp_send(self, s, PDUTYPE_DEACTIVATEALLPDU) != 0)
|
||||||
{
|
{
|
||||||
free_stream(s);
|
free_stream(s);
|
||||||
LOG(LOG_LEVEL_ERROR, "out xrdp_rdp_send_deactivate error");
|
LOG(LOG_LEVEL_ERROR, "Sending [MS-RDPBCGR] TS_DEACTIVATE_ALL_PDU failed");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
free_stream(s);
|
free_stream(s);
|
||||||
LOG_DEVEL(LOG_LEVEL_TRACE, "out xrdp_rdp_send_deactivate");
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1586,12 +1581,12 @@ xrdp_rdp_send_session_info(struct xrdp_rdp *self, const char *data,
|
|||||||
|
|
||||||
if (data == NULL)
|
if (data == NULL)
|
||||||
{
|
{
|
||||||
LOG_DEVEL(LOG_LEVEL_ERROR, "data must not be null");
|
LOG(LOG_LEVEL_ERROR, "data must not be null");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
if (data_bytes < 4)
|
if (data_bytes < 4)
|
||||||
{
|
{
|
||||||
LOG_DEVEL(LOG_LEVEL_ERROR, "data_bytes must greater than or equal to 4");
|
LOG(LOG_LEVEL_ERROR, "data_bytes must greater than or equal to 4");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1600,31 +1595,26 @@ xrdp_rdp_send_session_info(struct xrdp_rdp *self, const char *data,
|
|||||||
|
|
||||||
if (xrdp_rdp_init_data(self, s) != 0)
|
if (xrdp_rdp_init_data(self, s) != 0)
|
||||||
{
|
{
|
||||||
LOG_DEVEL(LOG_LEVEL_ERROR, "xrdp_rdp_send_session_info: xrdp_rdp_init_data failed");
|
LOG(LOG_LEVEL_ERROR, "xrdp_rdp_send_session_info: xrdp_rdp_init_data failed");
|
||||||
free_stream(s);
|
free_stream(s);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (s_check_rem_out(s, data_bytes))
|
if (!s_check_rem_out_and_log(s, data_bytes, "Sending [MS-RDPBCGR] TS_SAVE_SESSION_INFO_PDU_DATA"))
|
||||||
{
|
{
|
||||||
out_uint8a(s, data, data_bytes);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
LOG_DEVEL(LOG_LEVEL_ERROR, "Not enough space in the stream "
|
|
||||||
"len %d, remaining %d", data_bytes, s_rem_out(s));
|
|
||||||
free_stream(s);
|
free_stream(s);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
out_uint8a(s, data, data_bytes);
|
||||||
s_mark_end(s);
|
s_mark_end(s);
|
||||||
LOG_DEVEL(LOG_LEVEL_TRACE, "Sending [MS-RDPBCGR] TS_SAVE_SESSION_INFO_PDU_DATA "
|
LOG_DEVEL(LOG_LEVEL_TRACE, "Sending [MS-RDPBCGR] TS_SAVE_SESSION_INFO_PDU_DATA "
|
||||||
"infoType 0x%8.8x",
|
"infoType 0x%8.8x, infoData <omitted from log>",
|
||||||
*((unsigned int *) data));
|
*((unsigned int *) data));
|
||||||
|
|
||||||
if (xrdp_rdp_send_data(self, s, RDP_DATA_PDU_LOGON) != 0)
|
if (xrdp_rdp_send_data(self, s, RDP_DATA_PDU_LOGON) != 0)
|
||||||
{
|
{
|
||||||
LOG_DEVEL(LOG_LEVEL_ERROR, "xrdp_rdp_send_session_info: xrdp_rdp_send_data failed");
|
LOG(LOG_LEVEL_ERROR, "Sending [MS-RDPBCGR] TS_SAVE_SESSION_INFO_PDU_DATA failed");
|
||||||
free_stream(s);
|
free_stream(s);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
@ -45,30 +45,94 @@ static tui8 g_pad_92[48] =
|
|||||||
92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92
|
92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92
|
||||||
};
|
};
|
||||||
|
|
||||||
/* TODO: this appears to be a MS-RDPBCGR 2.2.1.12 LICENSE_VALID_CLIENT_DATA
|
|
||||||
with the security header included */
|
/*****************************************************************************/
|
||||||
|
/* Licensing request v2 PDU
|
||||||
|
*
|
||||||
|
* [MS-RDPBCGR] TS_SECURITY_HEADER - Basic
|
||||||
|
* [MS-RDPELE] SERVER_LICENSE_REQUEST with PREAMBLE_VERSION_2_0
|
||||||
|
*/
|
||||||
/* some compilers need unsigned char to avoid warnings */
|
/* some compilers need unsigned char to avoid warnings */
|
||||||
static tui8 g_lic1[322] =
|
static tui8 g_lic1[322] =
|
||||||
{
|
{
|
||||||
|
/* [MS-RDPBCGR] TS_SECURITY_HEADER - Basic
|
||||||
|
* flags (2) = 0x0080 (SEC_LICENSE_PKT)
|
||||||
|
* flagsHi (2) = unused (arbitrary data)
|
||||||
|
* [MS-RDPBCGR] LICENSE_PREAMBLE
|
||||||
|
* bMsgType (1) = 0x01 (LICENSE_REQUEST)
|
||||||
|
* flags (1) = 0x02 (PREAMBLE_VERSION_2_0)
|
||||||
|
* wMsgSize (2) = 318 (excludes the 4 bytes TS_SECURITY_HEADER Basic)
|
||||||
|
*/
|
||||||
0x80, 0x00, 0x3e, 0x01, 0x01, 0x02, 0x3e, 0x01,
|
0x80, 0x00, 0x3e, 0x01, 0x01, 0x02, 0x3e, 0x01,
|
||||||
|
/* [MS-RDPELE] SERVER_LICENSE_REQUEST
|
||||||
|
* ServerRandom (32) = <see hex below>
|
||||||
|
*/
|
||||||
0x7b, 0x3c, 0x31, 0xa6, 0xae, 0xe8, 0x74, 0xf6,
|
0x7b, 0x3c, 0x31, 0xa6, 0xae, 0xe8, 0x74, 0xf6,
|
||||||
0xb4, 0xa5, 0x03, 0x90, 0xe7, 0xc2, 0xc7, 0x39,
|
0xb4, 0xa5, 0x03, 0x90, 0xe7, 0xc2, 0xc7, 0x39,
|
||||||
0xba, 0x53, 0x1c, 0x30, 0x54, 0x6e, 0x90, 0x05,
|
0xba, 0x53, 0x1c, 0x30, 0x54, 0x6e, 0x90, 0x05,
|
||||||
0xd0, 0x05, 0xce, 0x44, 0x18, 0x91, 0x83, 0x81,
|
0xd0, 0x05, 0xce, 0x44, 0x18, 0x91, 0x83, 0x81,
|
||||||
|
/* [MS-RDPELE] SERVER_LICENSE_REQUEST - ProductInfo
|
||||||
|
* [MS-RDPELE] PRODUCT_INFO
|
||||||
|
* dwVersion (4) = 0x00040000
|
||||||
|
* cbCompanyName (4) = 0x0000002c (44)
|
||||||
|
*/
|
||||||
0x00, 0x00, 0x04, 0x00, 0x2c, 0x00, 0x00, 0x00,
|
0x00, 0x00, 0x04, 0x00, 0x2c, 0x00, 0x00, 0x00,
|
||||||
|
/*
|
||||||
|
* pbCompanyName (44) = UTF-16("Microsoft Corporation")
|
||||||
|
* cbProductId (4) = 0x00000008 (8)
|
||||||
|
*/
|
||||||
0x4d, 0x00, 0x69, 0x00, 0x63, 0x00, 0x72, 0x00,
|
0x4d, 0x00, 0x69, 0x00, 0x63, 0x00, 0x72, 0x00,
|
||||||
0x6f, 0x00, 0x73, 0x00, 0x6f, 0x00, 0x66, 0x00,
|
0x6f, 0x00, 0x73, 0x00, 0x6f, 0x00, 0x66, 0x00,
|
||||||
0x74, 0x00, 0x20, 0x00, 0x43, 0x00, 0x6f, 0x00,
|
0x74, 0x00, 0x20, 0x00, 0x43, 0x00, 0x6f, 0x00,
|
||||||
0x72, 0x00, 0x70, 0x00, 0x6f, 0x00, 0x72, 0x00,
|
0x72, 0x00, 0x70, 0x00, 0x6f, 0x00, 0x72, 0x00,
|
||||||
0x61, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6f, 0x00,
|
0x61, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6f, 0x00,
|
||||||
0x6e, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00,
|
0x6e, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00,
|
||||||
|
/*
|
||||||
|
* pbProductId (8) = UTF-16("236")
|
||||||
|
*/
|
||||||
0x32, 0x00, 0x33, 0x00, 0x36, 0x00, 0x00, 0x00,
|
0x32, 0x00, 0x33, 0x00, 0x36, 0x00, 0x00, 0x00,
|
||||||
|
/* [MS-RDPELE] SERVER_LICENSE_REQUEST - KeyExchangeList
|
||||||
|
* [MS-RDPBCGR] LICENSE_BINARY_BLOB
|
||||||
|
* wBlobType (2) = 0x000d (BB_KEY_EXCHG_ALG_BLOB)
|
||||||
|
* wBlobLen (2) = 0x0004 (4)
|
||||||
|
* blobData (4) = 0x00000001 (KEY_EXCHANGE_ALG_RSA)
|
||||||
|
*/
|
||||||
0x0d, 0x00, 0x04, 0x00, 0x01, 0x00, 0x00, 0x00,
|
0x0d, 0x00, 0x04, 0x00, 0x01, 0x00, 0x00, 0x00,
|
||||||
|
/* [MS-RDPELE] SERVER_LICENSE_REQUEST - ServerCertificate
|
||||||
|
* [MS-RDPBCGR] LICENSE_BINARY_BLOB
|
||||||
|
* wBlobType (2) = BB_CERTIFICATE_BLOB (0x0003)
|
||||||
|
* wBlobLen (2) = 0x00b8 (184)
|
||||||
|
* blobData = <SERVER_CERTIFICATE>
|
||||||
|
*
|
||||||
|
* [MS-RDPBCGR] SERVER_CERTIFICATE
|
||||||
|
* dwVersion (31 bits) = 0x00000001 (CERT_CHAIN_VERSION_1)
|
||||||
|
* t (1 bit) = 0 (temporary certificate)
|
||||||
|
*/
|
||||||
0x03, 0x00, 0xb8, 0x00, 0x01, 0x00, 0x00, 0x00,
|
0x03, 0x00, 0xb8, 0x00, 0x01, 0x00, 0x00, 0x00,
|
||||||
|
/*
|
||||||
|
* certData = <PROPRIETARYSERVERCERTIFICATE>
|
||||||
|
*
|
||||||
|
* [MS-RDPBCGR] PROPRIETARYSERVERCERTIFICATE
|
||||||
|
* dwSigAlgId (4) = 0x00000001 (SIGNATURE_ALG_RSA)
|
||||||
|
* dwKeyAlgId (4) = 0x00000001 (KEY_EXCHANGE_ALG_RSA)
|
||||||
|
* wPublicKeyBlobType (2) = 0x0006 (BB_RSA_KEY_BLOB)
|
||||||
|
* wPublicKeyBlobLen (2) = 0x005c (92)
|
||||||
|
* PublicKeyBlob = <RSA_PUBLIC_KEY>
|
||||||
|
*
|
||||||
|
* [MS-RDPBCGR] RSA_PUBLIC_KEY
|
||||||
|
* magic (4) = 0x31415352
|
||||||
|
* keylen (4) = 0x00000048 (72)
|
||||||
|
* bitlen (4) = 0x00000200 (512)
|
||||||
|
* datalen (4) = 0x0000003f (63)
|
||||||
|
* pubExp (4) = 0x00010001 (65537)
|
||||||
|
*/
|
||||||
0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
|
0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
|
||||||
0x06, 0x00, 0x5c, 0x00, 0x52, 0x53, 0x41, 0x31,
|
0x06, 0x00, 0x5c, 0x00, 0x52, 0x53, 0x41, 0x31,
|
||||||
0x48, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00,
|
0x48, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00,
|
||||||
0x3f, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00,
|
0x3f, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00,
|
||||||
|
/*
|
||||||
|
* modulus (72) = <see hex below>
|
||||||
|
*/
|
||||||
0x01, 0xc7, 0xc9, 0xf7, 0x8e, 0x5a, 0x38, 0xe4,
|
0x01, 0xc7, 0xc9, 0xf7, 0x8e, 0x5a, 0x38, 0xe4,
|
||||||
0x29, 0xc3, 0x00, 0x95, 0x2d, 0xdd, 0x4c, 0x3e,
|
0x29, 0xc3, 0x00, 0x95, 0x2d, 0xdd, 0x4c, 0x3e,
|
||||||
0x50, 0x45, 0x0b, 0x0d, 0x9e, 0x2a, 0x5d, 0x18,
|
0x50, 0x45, 0x0b, 0x0d, 0x9e, 0x2a, 0x5d, 0x18,
|
||||||
@ -78,6 +142,14 @@ static tui8 g_lic1[322] =
|
|||||||
0xc8, 0xc7, 0xb4, 0xa8, 0x47, 0xc8, 0x50, 0x71,
|
0xc8, 0xc7, 0xb4, 0xa8, 0x47, 0xc8, 0x50, 0x71,
|
||||||
0x74, 0x29, 0x53, 0x89, 0x6d, 0x9c, 0xed, 0x70,
|
0x74, 0x29, 0x53, 0x89, 0x6d, 0x9c, 0xed, 0x70,
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
/* [MS-RDPELE] SERVER_LICENSE_REQUEST - ServerCertificate
|
||||||
|
* [MS-RDPBCGR] LICENSE_BINARY_BLOB - blobData
|
||||||
|
* [MS-RDPBCGR] SERVER_CERTIFICATE - certData
|
||||||
|
* [MS-RDPBCGR] PROPRIETARYSERVERCERTIFICATE
|
||||||
|
* wSignatureBlobType (2) = 0x0008 (BB_RSA_SIGNATURE_BLOB)
|
||||||
|
* wSignatureBlobLen (2) = 0x0048 (72)
|
||||||
|
* SignatureBlob (72) = <see hex below, calculated using [MS-RDPBCGR] 5.3.3.1.2>
|
||||||
|
*/
|
||||||
0x08, 0x00, 0x48, 0x00, 0xa8, 0xf4, 0x31, 0xb9,
|
0x08, 0x00, 0x48, 0x00, 0xa8, 0xf4, 0x31, 0xb9,
|
||||||
0xab, 0x4b, 0xe6, 0xb4, 0xf4, 0x39, 0x89, 0xd6,
|
0xab, 0x4b, 0xe6, 0xb4, 0xf4, 0x39, 0x89, 0xd6,
|
||||||
0xb1, 0xda, 0xf6, 0x1e, 0xec, 0xb1, 0xf0, 0x54,
|
0xb1, 0xda, 0xf6, 0x1e, 0xec, 0xb1, 0xf0, 0x54,
|
||||||
@ -87,26 +159,90 @@ static tui8 g_lic1[322] =
|
|||||||
0xcb, 0x11, 0xc3, 0xf2, 0xdb, 0x09, 0x42, 0x68,
|
0xcb, 0x11, 0xc3, 0xf2, 0xdb, 0x09, 0x42, 0x68,
|
||||||
0x29, 0x56, 0x58, 0x01, 0x56, 0xdb, 0x59, 0x03,
|
0x29, 0x56, 0x58, 0x01, 0x56, 0xdb, 0x59, 0x03,
|
||||||
0x69, 0xdb, 0x7d, 0x37, 0x00, 0x00, 0x00, 0x00,
|
0x69, 0xdb, 0x7d, 0x37, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
/* <last 4 bytes of SignatureBlob>
|
||||||
|
*
|
||||||
|
* [MS-RDPELE] SERVER_LICENSE_REQUEST - ScopeList
|
||||||
|
* [MS-RDPELE] SCOPE_LIST
|
||||||
|
* ScopeCount (4) = 0x00000001 (1)
|
||||||
|
* ScopeArray = <LICENSE_BINARY_BLOB>
|
||||||
|
*
|
||||||
|
* [MS-RDPBCGR] LICENSE_BINARY_BLOB
|
||||||
|
* wBlobType (2) = 0x000e (BB_SCOPE_BLOB)
|
||||||
|
* wBlobLen (2) = 0x000e (14)
|
||||||
|
* blobData (14) = ISO-8859-1("microsoft.com")
|
||||||
|
*/
|
||||||
0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
|
0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
|
||||||
0x0e, 0x00, 0x0e, 0x00, 0x6d, 0x69, 0x63, 0x72,
|
0x0e, 0x00, 0x0e, 0x00, 0x6d, 0x69, 0x63, 0x72,
|
||||||
0x6f, 0x73, 0x6f, 0x66, 0x74, 0x2e, 0x63, 0x6f,
|
0x6f, 0x73, 0x6f, 0x66, 0x74, 0x2e, 0x63, 0x6f,
|
||||||
0x6d, 0x00
|
0x6d, 0x00
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
/* Licensing success response v2 PDU
|
||||||
|
*
|
||||||
|
* [MS-RDPBCGR] TS_SECURITY_HEADER - Basic
|
||||||
|
* [MS-RDPELE] LICENSE_ERROR_MESSAGE with STATUS_VALID_CLIENT
|
||||||
|
*/
|
||||||
/* some compilers need unsigned char to avoid warnings */
|
/* some compilers need unsigned char to avoid warnings */
|
||||||
static tui8 g_lic2[20] =
|
static tui8 g_lic2[20] =
|
||||||
{
|
{
|
||||||
|
/* [MS-RDPBCGR] TS_SECURITY_HEADER - Basic
|
||||||
|
* flags (2) = 0x0080 (SEC_LICENSE_PKT)
|
||||||
|
* flagsHi (2) = unused (arbitrary data)
|
||||||
|
* [MS-RDPBCGR] LICENSE_PREAMBLE
|
||||||
|
* bMsgType (1) = 0xff (ERROR_ALERT)
|
||||||
|
* flags (1) = 0x02 (PREAMBLE_VERSION_2_0)
|
||||||
|
* wMsgSize (2) = 0x10 (16, excludes the 4 bytes TS_SECURITY_HEADER Basic)
|
||||||
|
*/
|
||||||
0x80, 0x00, 0x10, 0x00, 0xff, 0x02, 0x10, 0x00,
|
0x80, 0x00, 0x10, 0x00, 0xff, 0x02, 0x10, 0x00,
|
||||||
|
/*
|
||||||
|
* [MS-RDPBCGR] LICENSE_ERROR_MESSAGE
|
||||||
|
* dwErrorCode (4) = 0x00000007 (STATUS_VALID_CLIENT)
|
||||||
|
* dwStateTransition (4) = 0x00000002 (ST_NO_TRANSITION)
|
||||||
|
* bbErrorInfo = <LICENSE_BINARY_BLOB>
|
||||||
|
*/
|
||||||
0x07, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
|
0x07, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
|
||||||
|
/*
|
||||||
|
* [MS-RDPBCGR] LICENSE_BINARY_BLOB
|
||||||
|
* wBlobType (2) = 0x1428 <ignored by client> (should be 0x0004 BB_ERROR_BLOB)
|
||||||
|
* wBlobLen (2) = 0x0000 (0)
|
||||||
|
*/
|
||||||
0x28, 0x14, 0x00, 0x00
|
0x28, 0x14, 0x00, 0x00
|
||||||
};
|
};
|
||||||
|
|
||||||
/* mce */
|
/*****************************************************************************/
|
||||||
|
/* Licensing success response v3 PDU
|
||||||
|
*
|
||||||
|
* [MS-RDPBCGR] TS_SECURITY_HEADER - Basic
|
||||||
|
* [MS-RDPELE] LICENSE_ERROR_MESSAGE with STATUS_VALID_CLIENT
|
||||||
|
*
|
||||||
|
* used for Media Center Edition
|
||||||
|
*/
|
||||||
/* some compilers need unsigned char to avoid warnings */
|
/* some compilers need unsigned char to avoid warnings */
|
||||||
static tui8 g_lic3[20] =
|
static tui8 g_lic3[20] =
|
||||||
{
|
{
|
||||||
|
/* S */
|
||||||
|
/* [MS-RDPBCGR] TS_SECURITY_HEADER - Basic
|
||||||
|
* flags (2) = 0x0280 (SEC_LICENSE_PKT | SEC_LICENSE_ENCRYPT_CS)
|
||||||
|
* flagsHi (2) = unused (arbitrary data)
|
||||||
|
* [MS-RDPBCGR] LICENSE_PREAMBLE
|
||||||
|
* bMsgType (1) = 0xff (ERROR_ALERT)
|
||||||
|
* flags (1) = 0x03 (PREAMBLE_VERSION_3_0)
|
||||||
|
* wMsgSize (2) = 0x0010 (16, excludes the 4 bytes TS_SECURITY_HEADER Basic)
|
||||||
|
*/
|
||||||
0x80, 0x02, 0x10, 0x00, 0xff, 0x03, 0x10, 0x00,
|
0x80, 0x02, 0x10, 0x00, 0xff, 0x03, 0x10, 0x00,
|
||||||
|
/*
|
||||||
|
* [MS-RDPBCGR] LICENSE_ERROR_MESSAGE
|
||||||
|
* dwErrorCode (4) = 0x00000007 (STATUS_VALID_CLIENT)
|
||||||
|
* dwStateTransition (4) = 0x00000002 (ST_NO_TRANSITION)
|
||||||
|
* bbErrorInfo = <LICENSE_BINARY_BLOB>
|
||||||
|
*/
|
||||||
0x07, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
|
0x07, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
|
||||||
|
/*
|
||||||
|
* [MS-RDPBCGR] LICENSE_BINARY_BLOB
|
||||||
|
* wBlobType (2) = 0x99f3 <ignored by client> (should be 0x0004 BB_ERROR_BLOB)
|
||||||
|
* wBlobLen (2) = 0x0000 (0)
|
||||||
|
*/
|
||||||
0xf3, 0x99, 0x00, 0x00
|
0xf3, 0x99, 0x00, 0x00
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -487,7 +623,7 @@ xrdp_sec_init(struct xrdp_sec *self, struct stream *s)
|
|||||||
{
|
{
|
||||||
if (xrdp_mcs_init(self->mcs_layer, s) != 0)
|
if (xrdp_mcs_init(self->mcs_layer, s) != 0)
|
||||||
{
|
{
|
||||||
LOG_DEVEL(LOG_LEVEL_ERROR, "xrdp_sec_init: xrdp_mcs_init failed");
|
LOG(LOG_LEVEL_ERROR, "xrdp_sec_init: xrdp_mcs_init failed");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -614,6 +750,7 @@ xrdp_sec_encrypt(struct xrdp_sec *self, char *data, int len)
|
|||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
* convert utf-16 encoded string from stream into utf-8 string.
|
* convert utf-16 encoded string from stream into utf-8 string.
|
||||||
* note: src_bytes doesn't include the null-terminator char.
|
* note: src_bytes doesn't include the null-terminator char.
|
||||||
|
* Copied From: xrdp_sec.c
|
||||||
*/
|
*/
|
||||||
static int
|
static int
|
||||||
unicode_utf16_in(struct stream *s, int src_bytes, char *dst, int dst_len)
|
unicode_utf16_in(struct stream *s, int src_bytes, char *dst, int dst_len)
|
||||||
@ -626,10 +763,8 @@ unicode_utf16_in(struct stream *s, int src_bytes, char *dst, int dst_len)
|
|||||||
LOG_DEVEL(LOG_LEVEL_TRACE, "unicode_utf16_in: uni_len %d, dst_len %d", src_bytes, dst_len);
|
LOG_DEVEL(LOG_LEVEL_TRACE, "unicode_utf16_in: uni_len %d, dst_len %d", src_bytes, dst_len);
|
||||||
if (src_bytes == 0)
|
if (src_bytes == 0)
|
||||||
{
|
{
|
||||||
if (!s_check_rem(s, 2))
|
if (!s_check_rem_and_log(s, 2, "Parsing UTF-16"))
|
||||||
{
|
{
|
||||||
LOG_DEVEL(LOG_LEVEL_ERROR, "Not enough bytes in the stream "
|
|
||||||
"len 2, remaining %d", s_rem(s));
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
LOG_DEVEL(LOG_LEVEL_TRACE, "unicode_utf16_in: num_chars 0, dst '' (empty string)");
|
LOG_DEVEL(LOG_LEVEL_TRACE, "unicode_utf16_in: num_chars 0, dst '' (empty string)");
|
||||||
@ -641,10 +776,8 @@ unicode_utf16_in(struct stream *s, int src_bytes, char *dst, int dst_len)
|
|||||||
src = g_new0(twchar, bytes);
|
src = g_new0(twchar, bytes);
|
||||||
for (i = 0; i < bytes / 2; ++i)
|
for (i = 0; i < bytes / 2; ++i)
|
||||||
{
|
{
|
||||||
if (!s_check_rem(s, 2))
|
if (!s_check_rem_and_log(s, 2, "Parsing UTF-16"))
|
||||||
{
|
{
|
||||||
LOG_DEVEL(LOG_LEVEL_ERROR, "Not enough bytes in the stream "
|
|
||||||
"len 2, remaining %d", s_rem(s));
|
|
||||||
g_free(src);
|
g_free(src);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
@ -680,10 +813,8 @@ xrdp_sec_process_logon_info(struct xrdp_sec *self, struct stream *s)
|
|||||||
|
|
||||||
/* initialize (zero out) local variables */
|
/* initialize (zero out) local variables */
|
||||||
g_memset(tmpdata, 0, sizeof(char) * 256);
|
g_memset(tmpdata, 0, sizeof(char) * 256);
|
||||||
if (!s_check_rem(s, 8))
|
if (!s_check_rem_and_log(s, 8, "Parsing [MS-RDPBCGR] TS_INFO_PACKET"))
|
||||||
{
|
{
|
||||||
LOG_DEVEL(LOG_LEVEL_ERROR, "Not enough bytes in the stream "
|
|
||||||
"len 8, remaining %d", s_rem(s));
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
in_uint8s(s, 4);
|
in_uint8s(s, 4);
|
||||||
@ -701,7 +832,7 @@ xrdp_sec_process_logon_info(struct xrdp_sec *self, struct stream *s)
|
|||||||
if (flags & RDP_LOGON_LEAVE_AUDIO)
|
if (flags & RDP_LOGON_LEAVE_AUDIO)
|
||||||
{
|
{
|
||||||
self->rdp_layer->client_info.sound_code = 1;
|
self->rdp_layer->client_info.sound_code = 1;
|
||||||
LOG_DEVEL(LOG_LEVEL_DEBUG, "TS_INFO_PACKET flag INFO_REMOTECONSOLEAUDIO found");
|
LOG_DEVEL(LOG_LEVEL_DEBUG, "[MS-RDPBCGR] TS_INFO_PACKET flag INFO_REMOTECONSOLEAUDIO found");
|
||||||
LOG(LOG_LEVEL_DEBUG,
|
LOG(LOG_LEVEL_DEBUG,
|
||||||
"Client requested that audio on the server be played on the server.");
|
"Client requested that audio on the server be played on the server.");
|
||||||
}
|
}
|
||||||
@ -709,14 +840,14 @@ xrdp_sec_process_logon_info(struct xrdp_sec *self, struct stream *s)
|
|||||||
if (flags & RDP_LOGON_RAIL)
|
if (flags & RDP_LOGON_RAIL)
|
||||||
{
|
{
|
||||||
self->rdp_layer->client_info.rail_enable = 1;
|
self->rdp_layer->client_info.rail_enable = 1;
|
||||||
LOG_DEVEL(LOG_LEVEL_DEBUG, "TS_INFO_PACKET flag INFO_RAIL found");
|
LOG_DEVEL(LOG_LEVEL_DEBUG, "[MS-RDPBCGR] TS_INFO_PACKET flag INFO_RAIL found");
|
||||||
LOG(LOG_LEVEL_DEBUG,
|
LOG(LOG_LEVEL_DEBUG,
|
||||||
"Client requested Remote Application Integrated Locally (RAIL).");
|
"Client requested Remote Application Integrated Locally (RAIL).");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (flags & RDP_LOGON_AUTO)
|
if (flags & RDP_LOGON_AUTO)
|
||||||
{
|
{
|
||||||
LOG_DEVEL(LOG_LEVEL_DEBUG, "TS_INFO_PACKET flag INFO_AUTOLOGON found");
|
LOG_DEVEL(LOG_LEVEL_DEBUG, "[MS-RDPBCGR] TS_INFO_PACKET flag INFO_AUTOLOGON found");
|
||||||
/* todo, for now not allowing autologon and mce both */
|
/* todo, for now not allowing autologon and mce both */
|
||||||
if (!self->rdp_layer->client_info.is_mce)
|
if (!self->rdp_layer->client_info.is_mce)
|
||||||
{
|
{
|
||||||
@ -731,7 +862,7 @@ xrdp_sec_process_logon_info(struct xrdp_sec *self, struct stream *s)
|
|||||||
|
|
||||||
if (flags & RDP_COMPRESSION)
|
if (flags & RDP_COMPRESSION)
|
||||||
{
|
{
|
||||||
LOG_DEVEL(LOG_LEVEL_DEBUG, "TS_INFO_PACKET flag INFO_COMPRESSION found, "
|
LOG_DEVEL(LOG_LEVEL_DEBUG, "[MS-RDPBCGR] TS_INFO_PACKET flag INFO_COMPRESSION found, "
|
||||||
"CompressionType 0x%1.1x", (flags & 0x00001E00) >> 9);
|
"CompressionType 0x%1.1x", (flags & 0x00001E00) >> 9);
|
||||||
/* TODO: check the client's supported compression type vs the server
|
/* TODO: check the client's supported compression type vs the server
|
||||||
compression used */
|
compression used */
|
||||||
@ -748,10 +879,8 @@ xrdp_sec_process_logon_info(struct xrdp_sec *self, struct stream *s)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!s_check_rem(s, 2))
|
if (!s_check_rem_and_log(s, 2, "Parsing [MS-RDPBCGR] TS_INFO_PACKET cbDomain"))
|
||||||
{
|
{
|
||||||
LOG_DEVEL(LOG_LEVEL_ERROR, "Not enough bytes in the stream "
|
|
||||||
"len 2, remaining %d", s_rem(s));
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
in_uint16_le(s, len_domain);
|
in_uint16_le(s, len_domain);
|
||||||
@ -764,10 +893,8 @@ xrdp_sec_process_logon_info(struct xrdp_sec *self, struct stream *s)
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!s_check_rem(s, 2))
|
if (!s_check_rem_and_log(s, 2, "Parsing [MS-RDPBCGR] TS_INFO_PACKET cbUserName"))
|
||||||
{
|
{
|
||||||
LOG_DEVEL(LOG_LEVEL_ERROR, "Not enough bytes in the stream "
|
|
||||||
"len 2, remaining %d", s_rem(s));
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
in_uint16_le(s, len_user);
|
in_uint16_le(s, len_user);
|
||||||
@ -791,10 +918,8 @@ xrdp_sec_process_logon_info(struct xrdp_sec *self, struct stream *s)
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!s_check_rem(s, 2))
|
if (!s_check_rem_and_log(s, 2, "Parsing [MS-RDPBCGR] TS_INFO_PACKET cbPassword"))
|
||||||
{
|
{
|
||||||
LOG_DEVEL(LOG_LEVEL_ERROR, "Not enough bytes in the stream "
|
|
||||||
"len 2, remaining %d", s_rem(s));
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
in_uint16_le(s, len_password);
|
in_uint16_le(s, len_password);
|
||||||
@ -807,10 +932,8 @@ xrdp_sec_process_logon_info(struct xrdp_sec *self, struct stream *s)
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!s_check_rem(s, 2))
|
if (!s_check_rem_and_log(s, 2, "Parsing [MS-RDPBCGR] TS_INFO_PACKET cbAlternateShell"))
|
||||||
{
|
{
|
||||||
LOG_DEVEL(LOG_LEVEL_ERROR, "Not enough bytes in the stream "
|
|
||||||
"len 2, remaining %d", s_rem(s));
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
in_uint16_le(s, len_program);
|
in_uint16_le(s, len_program);
|
||||||
@ -823,10 +946,8 @@ xrdp_sec_process_logon_info(struct xrdp_sec *self, struct stream *s)
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!s_check_rem(s, 2))
|
if (!s_check_rem_and_log(s, 2, "Parsing [MS-RDPBCGR] TS_INFO_PACKET cbWorkingDir"))
|
||||||
{
|
{
|
||||||
LOG_DEVEL(LOG_LEVEL_ERROR, "Not enough bytes in the stream "
|
|
||||||
"len 2, remaining %d", s_rem(s));
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
in_uint16_le(s, len_directory);
|
in_uint16_le(s, len_directory);
|
||||||
@ -841,13 +962,13 @@ xrdp_sec_process_logon_info(struct xrdp_sec *self, struct stream *s)
|
|||||||
|
|
||||||
if (unicode_utf16_in(s, len_domain, self->rdp_layer->client_info.domain, sizeof(self->rdp_layer->client_info.domain) - 1) != 0)
|
if (unicode_utf16_in(s, len_domain, self->rdp_layer->client_info.domain, sizeof(self->rdp_layer->client_info.domain) - 1) != 0)
|
||||||
{
|
{
|
||||||
LOG_DEVEL(LOG_LEVEL_ERROR, "ERROR reading domain");
|
LOG(LOG_LEVEL_ERROR, "ERROR reading domain");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (unicode_utf16_in(s, len_user, self->rdp_layer->client_info.username, sizeof(self->rdp_layer->client_info.username) - 1) != 0)
|
if (unicode_utf16_in(s, len_user, self->rdp_layer->client_info.username, sizeof(self->rdp_layer->client_info.username) - 1) != 0)
|
||||||
{
|
{
|
||||||
LOG_DEVEL(LOG_LEVEL_ERROR, "ERROR reading user name");
|
LOG(LOG_LEVEL_ERROR, "ERROR reading user name");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -855,7 +976,7 @@ xrdp_sec_process_logon_info(struct xrdp_sec *self, struct stream *s)
|
|||||||
{
|
{
|
||||||
if (unicode_utf16_in(s, len_password, self->rdp_layer->client_info.password, sizeof(self->rdp_layer->client_info.password) - 1) != 0)
|
if (unicode_utf16_in(s, len_password, self->rdp_layer->client_info.password, sizeof(self->rdp_layer->client_info.password) - 1) != 0)
|
||||||
{
|
{
|
||||||
LOG_DEVEL(LOG_LEVEL_ERROR, "ERROR reading password");
|
LOG(LOG_LEVEL_ERROR, "ERROR reading password");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -872,10 +993,8 @@ xrdp_sec_process_logon_info(struct xrdp_sec *self, struct stream *s)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (!s_check_rem(s, len_password + 2))
|
if (!s_check_rem_and_log(s, len_password + 2, "Parsing [MS-RDPBCGR] TS_INFO_PACKET Password"))
|
||||||
{
|
{
|
||||||
LOG_DEVEL(LOG_LEVEL_ERROR, "Not enough bytes in the stream "
|
|
||||||
"len %d, remaining %d", len_password + 2, s_rem(s));
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
in_uint8s(s, len_password + 2);
|
in_uint8s(s, len_password + 2);
|
||||||
@ -898,13 +1017,13 @@ xrdp_sec_process_logon_info(struct xrdp_sec *self, struct stream *s)
|
|||||||
|
|
||||||
if (unicode_utf16_in(s, len_program, self->rdp_layer->client_info.program, sizeof(self->rdp_layer->client_info.program) - 1) != 0)
|
if (unicode_utf16_in(s, len_program, self->rdp_layer->client_info.program, sizeof(self->rdp_layer->client_info.program) - 1) != 0)
|
||||||
{
|
{
|
||||||
LOG_DEVEL(LOG_LEVEL_ERROR, "ERROR reading program");
|
LOG(LOG_LEVEL_ERROR, "ERROR reading program");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (unicode_utf16_in(s, len_directory, self->rdp_layer->client_info.directory, sizeof(self->rdp_layer->client_info.directory) - 1) != 0)
|
if (unicode_utf16_in(s, len_directory, self->rdp_layer->client_info.directory, sizeof(self->rdp_layer->client_info.directory) - 1) != 0)
|
||||||
{
|
{
|
||||||
LOG_DEVEL(LOG_LEVEL_ERROR, "ERROR reading directory");
|
LOG(LOG_LEVEL_ERROR, "ERROR reading directory");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -920,7 +1039,7 @@ xrdp_sec_process_logon_info(struct xrdp_sec *self, struct stream *s)
|
|||||||
self->rdp_layer->client_info.directory);
|
self->rdp_layer->client_info.directory);
|
||||||
LOG(LOG_LEVEL_DEBUG, "Client supplied domain: %s", self->rdp_layer->client_info.domain);
|
LOG(LOG_LEVEL_DEBUG, "Client supplied domain: %s", self->rdp_layer->client_info.domain);
|
||||||
LOG(LOG_LEVEL_DEBUG, "Client supplied username: %s", self->rdp_layer->client_info.username);
|
LOG(LOG_LEVEL_DEBUG, "Client supplied username: %s", self->rdp_layer->client_info.username);
|
||||||
LOG(LOG_LEVEL_DEBUG, "Client supplied password: ommitted from the log");
|
LOG(LOG_LEVEL_DEBUG, "Client supplied password: <ommitted from log>");
|
||||||
LOG(LOG_LEVEL_DEBUG, "Client supplied program: %s", self->rdp_layer->client_info.program);
|
LOG(LOG_LEVEL_DEBUG, "Client supplied program: %s", self->rdp_layer->client_info.program);
|
||||||
LOG(LOG_LEVEL_DEBUG, "Client supplied directory: %s", self->rdp_layer->client_info.directory);
|
LOG(LOG_LEVEL_DEBUG, "Client supplied directory: %s", self->rdp_layer->client_info.directory);
|
||||||
|
|
||||||
@ -928,10 +1047,9 @@ xrdp_sec_process_logon_info(struct xrdp_sec *self, struct stream *s)
|
|||||||
TS_EXTENDED_INFO_PACKET should be parsed */
|
TS_EXTENDED_INFO_PACKET should be parsed */
|
||||||
if (flags & RDP_LOGON_BLOB) /* INFO_ENABLEWINDOWSKEY */
|
if (flags & RDP_LOGON_BLOB) /* INFO_ENABLEWINDOWSKEY */
|
||||||
{
|
{
|
||||||
if (!s_check_rem(s, 4))
|
if (!s_check_rem_and_log(s, 4, "Parsing [MS-RDPBCGR] TS_EXTENDED_INFO_PACKET "
|
||||||
|
"clientAddressFamily and cbClientAddress"))
|
||||||
{
|
{
|
||||||
LOG_DEVEL(LOG_LEVEL_ERROR, "Not enough bytes in the stream "
|
|
||||||
"len 4, remaining %d", s_rem(s));
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
/* TS_EXTENDED_INFO_PACKET requiered fields */
|
/* TS_EXTENDED_INFO_PACKET requiered fields */
|
||||||
@ -939,19 +1057,17 @@ xrdp_sec_process_logon_info(struct xrdp_sec *self, struct stream *s)
|
|||||||
in_uint16_le(s, len_ip);
|
in_uint16_le(s, len_ip);
|
||||||
if (unicode_utf16_in(s, len_ip - 2, tmpdata, sizeof(tmpdata) - 1) != 0)
|
if (unicode_utf16_in(s, len_ip - 2, tmpdata, sizeof(tmpdata) - 1) != 0)
|
||||||
{
|
{
|
||||||
LOG_DEVEL(LOG_LEVEL_ERROR, "ERROR reading ip");
|
LOG(LOG_LEVEL_ERROR, "ERROR reading ip");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
if (!s_check_rem(s, 2))
|
if (!s_check_rem_and_log(s, 2, "Parsing [MS-RDPBCGR] TS_EXTENDED_INFO_PACKET clientDir"))
|
||||||
{
|
{
|
||||||
LOG_DEVEL(LOG_LEVEL_ERROR, "Not enough bytes in the stream "
|
|
||||||
"len 2, remaining %d", s_rem(s));
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
in_uint16_le(s, len_dll);
|
in_uint16_le(s, len_dll);
|
||||||
if (unicode_utf16_in(s, len_dll - 2, tmpdata, sizeof(tmpdata) - 1) != 0)
|
if (unicode_utf16_in(s, len_dll - 2, tmpdata, sizeof(tmpdata) - 1) != 0)
|
||||||
{
|
{
|
||||||
LOG_DEVEL(LOG_LEVEL_ERROR, "ERROR reading clientDir");
|
LOG(LOG_LEVEL_ERROR, "ERROR reading clientDir");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
LOG_DEVEL(LOG_LEVEL_TRACE, "Received [MS-RDPBCGR] TS_EXTENDED_INFO_PACKET "
|
LOG_DEVEL(LOG_LEVEL_TRACE, "Received [MS-RDPBCGR] TS_EXTENDED_INFO_PACKET "
|
||||||
@ -961,19 +1077,19 @@ xrdp_sec_process_logon_info(struct xrdp_sec *self, struct stream *s)
|
|||||||
|
|
||||||
/* TODO: MS-BCGR 2.2.1.11.1.1.1 says that all fields after the
|
/* TODO: MS-BCGR 2.2.1.11.1.1.1 says that all fields after the
|
||||||
client directory are optional. */
|
client directory are optional. */
|
||||||
if (!s_check_rem(s, 4 + 62 + 22 + 62 + 26 + 4))
|
if (!s_check_rem_and_log(s, 4 + 64 + 20 + 64 + 20 + 4 + 4,
|
||||||
|
"Parsing [MS-RDPBCGR] TS_EXTENDED_INFO_PACKET "
|
||||||
|
"clientTimeZone, clientSessionId, and performanceFlags"))
|
||||||
{
|
{
|
||||||
LOG_DEVEL(LOG_LEVEL_ERROR, "Not enough bytes in the stream "
|
|
||||||
"len %d, remaining %d", 4 + 62 + 22 + 62 + 26 + 4, s_rem(s));
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
/* TS_TIME_ZONE_INFORMATION */
|
/* TS_TIME_ZONE_INFORMATION */
|
||||||
in_uint8s(s, 4); /* Bias (4) */
|
in_uint8s(s, 4); /* Bias (4) */
|
||||||
in_uint8s(s, 62); /* StandardName (64) */
|
in_uint8s(s, 64); /* StandardName (64) */
|
||||||
in_uint8s(s, 22); /* StandardDate (16), StandardBias (4) */
|
in_uint8s(s, 20); /* StandardDate (16), StandardBias (4) */
|
||||||
in_uint8s(s, 62); /* DaylightName (64) */
|
in_uint8s(s, 64); /* DaylightName (64) */
|
||||||
in_uint8s(s, 26); /* DaylightDate (16), DaylightBias (4) */
|
in_uint8s(s, 20); /* DaylightDate (16), DaylightBias (4) */
|
||||||
/* TS_EXTENDED_INFO_PACKET clientSessionId (4) */
|
in_uint8s(s, 4); /* TS_EXTENDED_INFO_PACKET clientSessionId (4) */
|
||||||
|
|
||||||
/* TS_EXTENDED_INFO_PACKET optional fields */
|
/* TS_EXTENDED_INFO_PACKET optional fields */
|
||||||
in_uint32_le(s, self->rdp_layer->client_info.rdp5_performanceflags);
|
in_uint32_le(s, self->rdp_layer->client_info.rdp5_performanceflags);
|
||||||
@ -1005,18 +1121,18 @@ xrdp_sec_send_lic_initial(struct xrdp_sec *self)
|
|||||||
|
|
||||||
if (xrdp_mcs_init(self->mcs_layer, s) != 0)
|
if (xrdp_mcs_init(self->mcs_layer, s) != 0)
|
||||||
{
|
{
|
||||||
LOG_DEVEL(LOG_LEVEL_ERROR, "xrdp_sec_send_lic_initial: xrdp_mcs_init failed");
|
LOG(LOG_LEVEL_ERROR, "xrdp_sec_send_lic_initial: xrdp_mcs_init failed");
|
||||||
free_stream(s);
|
free_stream(s);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
out_uint8a(s, g_lic1, 322);
|
out_uint8a(s, g_lic1, sizeof(g_lic1));
|
||||||
s_mark_end(s);
|
s_mark_end(s);
|
||||||
|
|
||||||
LOG_DEVEL(LOG_LEVEL_TRACE, "Sending g_lic1");
|
LOG_DEVEL(LOG_LEVEL_TRACE, "Sending [MS-RDPELE] SERVER_LICENSE_REQUEST");
|
||||||
if (xrdp_mcs_send(self->mcs_layer, s, MCS_GLOBAL_CHANNEL) != 0)
|
if (xrdp_mcs_send(self->mcs_layer, s, MCS_GLOBAL_CHANNEL) != 0)
|
||||||
{
|
{
|
||||||
LOG_DEVEL(LOG_LEVEL_ERROR, "xrdp_sec_send_lic_initial: xrdp_mcs_send failed");
|
LOG(LOG_LEVEL_ERROR, "Sending [MS-RDPELE] SERVER_LICENSE_REQUEST failed");
|
||||||
free_stream(s);
|
free_stream(s);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
@ -1026,6 +1142,10 @@ xrdp_sec_send_lic_initial(struct xrdp_sec *self)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
/*
|
||||||
|
* Send a [MS-RDPELE] LICENSE_ERROR_MESSAGE with STATUS_VALID_CLIENT
|
||||||
|
* See also: [MS-RDPELE] 1.3.3 Licensing PDU Flows
|
||||||
|
*/
|
||||||
/* returns error */
|
/* returns error */
|
||||||
static int
|
static int
|
||||||
xrdp_sec_send_lic_response(struct xrdp_sec *self)
|
xrdp_sec_send_lic_response(struct xrdp_sec *self)
|
||||||
@ -1037,18 +1157,18 @@ xrdp_sec_send_lic_response(struct xrdp_sec *self)
|
|||||||
|
|
||||||
if (xrdp_mcs_init(self->mcs_layer, s) != 0)
|
if (xrdp_mcs_init(self->mcs_layer, s) != 0)
|
||||||
{
|
{
|
||||||
LOG_DEVEL(LOG_LEVEL_ERROR, "xrdp_sec_send_lic_response: xrdp_mcs_init failed");
|
LOG(LOG_LEVEL_ERROR, "xrdp_sec_send_lic_response: xrdp_mcs_init failed");
|
||||||
free_stream(s);
|
free_stream(s);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
out_uint8a(s, g_lic2, 20);
|
out_uint8a(s, g_lic2, sizeof(g_lic2));
|
||||||
s_mark_end(s);
|
s_mark_end(s);
|
||||||
|
|
||||||
LOG_DEVEL(LOG_LEVEL_TRACE, "Sending g_lic2");
|
LOG_DEVEL(LOG_LEVEL_TRACE, "Sending [MS-RDPELE] LICENSE_ERROR_MESSAGE with STATUS_VALID_CLIENT");
|
||||||
if (xrdp_mcs_send(self->mcs_layer, s, MCS_GLOBAL_CHANNEL) != 0)
|
if (xrdp_mcs_send(self->mcs_layer, s, MCS_GLOBAL_CHANNEL) != 0)
|
||||||
{
|
{
|
||||||
LOG_DEVEL(LOG_LEVEL_ERROR, "xrdp_sec_send_lic_response: xrdp_mcs_send failed");
|
LOG(LOG_LEVEL_ERROR, "Sending [MS-RDPELE] LICENSE_ERROR_MESSAGE with STATUS_VALID_CLIENT failed");
|
||||||
free_stream(s);
|
free_stream(s);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
@ -1069,7 +1189,7 @@ xrdp_sec_send_media_lic_response(struct xrdp_sec *self)
|
|||||||
|
|
||||||
if (xrdp_mcs_init(self->mcs_layer, s) != 0)
|
if (xrdp_mcs_init(self->mcs_layer, s) != 0)
|
||||||
{
|
{
|
||||||
LOG_DEVEL(LOG_LEVEL_ERROR, "xrdp_sec_send_media_lic_response: xrdp_mcs_init failed");
|
LOG(LOG_LEVEL_ERROR, "xrdp_sec_send_media_lic_response: xrdp_mcs_init failed");
|
||||||
free_stream(s);
|
free_stream(s);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
@ -1077,10 +1197,10 @@ xrdp_sec_send_media_lic_response(struct xrdp_sec *self)
|
|||||||
out_uint8a(s, g_lic3, sizeof(g_lic3));
|
out_uint8a(s, g_lic3, sizeof(g_lic3));
|
||||||
s_mark_end(s);
|
s_mark_end(s);
|
||||||
|
|
||||||
LOG_DEVEL(LOG_LEVEL_TRACE, "Sending g_lic3");
|
LOG_DEVEL(LOG_LEVEL_TRACE, "Sending [MS-RDPELE] LICENSE_ERROR_MESSAGE with STATUS_VALID_CLIENT");
|
||||||
if (xrdp_mcs_send(self->mcs_layer, s, MCS_GLOBAL_CHANNEL) != 0)
|
if (xrdp_mcs_send(self->mcs_layer, s, MCS_GLOBAL_CHANNEL) != 0)
|
||||||
{
|
{
|
||||||
LOG_DEVEL(LOG_LEVEL_ERROR, "xrdp_sec_send_media_lic_response: xrdp_mcs_send failed");
|
LOG(LOG_LEVEL_ERROR, "Sending [MS-RDPELE] LICENSE_ERROR_MESSAGE with STATUS_VALID_CLIENT failed");
|
||||||
free_stream(s);
|
free_stream(s);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
@ -1294,7 +1414,7 @@ xrdp_sec_recv_fastpath(struct xrdp_sec *self, struct stream *s)
|
|||||||
|
|
||||||
if (xrdp_fastpath_recv(self->fastpath_layer, s) != 0)
|
if (xrdp_fastpath_recv(self->fastpath_layer, s) != 0)
|
||||||
{
|
{
|
||||||
LOG_DEVEL(LOG_LEVEL_ERROR, "xrdp_sec_recv_fastpath: xrdp_fastpath_recv failed");
|
LOG(LOG_LEVEL_ERROR, "xrdp_sec_recv_fastpath: xrdp_fastpath_recv failed");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1302,24 +1422,22 @@ xrdp_sec_recv_fastpath(struct xrdp_sec *self, struct stream *s)
|
|||||||
{
|
{
|
||||||
if (self->crypt_level == CRYPT_LEVEL_FIPS)
|
if (self->crypt_level == CRYPT_LEVEL_FIPS)
|
||||||
{
|
{
|
||||||
if (!s_check_rem(s, 12))
|
if (!s_check_rem_and_log(s, 12, "Parsing [MS-RDPBCGR] TS_FP_FIPS_INFO"))
|
||||||
{
|
{
|
||||||
LOG_DEVEL(LOG_LEVEL_ERROR, "Not enough bytes in the stream "
|
|
||||||
"len 12, remaining %d", s_rem(s));
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
/* TS_FP_FIPS_INFO */
|
/* TS_FP_FIPS_INFO */
|
||||||
in_uint16_le(s, len);
|
in_uint16_le(s, len);
|
||||||
in_uint8(s, ver); /* length (2 bytes) */
|
in_uint8(s, ver); /* length (2 bytes) */
|
||||||
if (len != 0x10) /* length MUST set to 0x10 */
|
|
||||||
{
|
|
||||||
LOG_DEVEL(LOG_LEVEL_ERROR, "xrdp_sec_recv_fastpath: CRYPT_LEVEL_FIPS - "
|
|
||||||
"invalid fastpath length. Expected 16, received %d", len);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
in_uint8(s, pad);
|
in_uint8(s, pad);
|
||||||
LOG_DEVEL(LOG_LEVEL_TRACE, "Received header [MS-RDPBCGR] TS_FP_FIPS_INFO "
|
LOG_DEVEL(LOG_LEVEL_TRACE, "Received header [MS-RDPBCGR] TS_FP_FIPS_INFO "
|
||||||
"length %d, version %d, padlen %d", len, ver, pad);
|
"length %d, version %d, padlen %d", len, ver, pad);
|
||||||
|
if (len != 0x10) /* length MUST set to 0x10 */
|
||||||
|
{
|
||||||
|
LOG(LOG_LEVEL_ERROR, "Received header [MS-RDPBCGR] TS_FP_FIPS_INFO "
|
||||||
|
"invalid fastpath length. Expected 16, received %d", len);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
/* remainder of TS_FP_INPUT_PDU */
|
/* remainder of TS_FP_INPUT_PDU */
|
||||||
in_uint8s(s, 8); /* dataSignature (8 bytes), skip for now */
|
in_uint8s(s, 8); /* dataSignature (8 bytes), skip for now */
|
||||||
@ -1330,10 +1448,9 @@ xrdp_sec_recv_fastpath(struct xrdp_sec *self, struct stream *s)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (!s_check_rem(s, 8))
|
if (!s_check_rem_and_log(s, 8,
|
||||||
|
"Parsing [MS-RDPBCGR] TS_FP_INPUT_PDU dataSignature"))
|
||||||
{
|
{
|
||||||
LOG_DEVEL(LOG_LEVEL_ERROR, "Not enough bytes in the stream "
|
|
||||||
"len 8, remaining %d", s_rem(s));
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
/* remainder of TS_FP_INPUT_PDU */
|
/* remainder of TS_FP_INPUT_PDU */
|
||||||
@ -1348,10 +1465,8 @@ xrdp_sec_recv_fastpath(struct xrdp_sec *self, struct stream *s)
|
|||||||
* If numberEvents is not provided in fpInputHeader, it will be provided
|
* If numberEvents is not provided in fpInputHeader, it will be provided
|
||||||
* as one additional byte here.
|
* as one additional byte here.
|
||||||
*/
|
*/
|
||||||
if (!s_check_rem(s, 8))
|
if (!s_check_rem_and_log(s, 8, "Parsing [MS-RDPBCGR] TS_FP_INPUT_PDU numEvents"))
|
||||||
{
|
{
|
||||||
LOG_DEVEL(LOG_LEVEL_ERROR, "Not enough bytes in the stream "
|
|
||||||
"len 8, remaining %d", s_rem(s));
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
in_uint8(s, self->fastpath_layer->numEvents); /* numEvents (1 byte) (optional) */
|
in_uint8(s, self->fastpath_layer->numEvents); /* numEvents (1 byte) (optional) */
|
||||||
@ -1390,10 +1505,8 @@ xrdp_sec_recv(struct xrdp_sec *self, struct stream *s, int *chan)
|
|||||||
the security header is optional (eg. TLS connections), so this
|
the security header is optional (eg. TLS connections), so this
|
||||||
check should really be after the check if the security header is present,
|
check should really be after the check if the security header is present,
|
||||||
this currently seems to be working by coincidence at the moment. */
|
this currently seems to be working by coincidence at the moment. */
|
||||||
if (!s_check_rem(s, 4))
|
if (!s_check_rem_and_log(s, 4, "Parsing [MS-RDPBCGR] TS_SECURITY_HEADER"))
|
||||||
{
|
{
|
||||||
LOG_DEVEL(LOG_LEVEL_ERROR, "Not enough bytes in the stream "
|
|
||||||
"len 4, remaining %d", s_rem(s));
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1415,34 +1528,37 @@ xrdp_sec_recv(struct xrdp_sec *self, struct stream *s, int *chan)
|
|||||||
{
|
{
|
||||||
if (self->crypt_level == CRYPT_LEVEL_FIPS)
|
if (self->crypt_level == CRYPT_LEVEL_FIPS)
|
||||||
{
|
{
|
||||||
if (!s_check_rem(s, 12))
|
if (!s_check_rem_and_log(s, 12, "Parsing [MS-RDPBCGR] TS_SECURITY_HEADER2"))
|
||||||
{
|
{
|
||||||
LOG_DEVEL(LOG_LEVEL_ERROR, "Not enough bytes in the stream "
|
|
||||||
"len 12, remaining %d", s_rem(s));
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
/* TS_SECURITY_HEADER2 */
|
/* TS_SECURITY_HEADER2 */
|
||||||
in_uint16_le(s, len); /* length */
|
in_uint16_le(s, len); /* length */
|
||||||
in_uint8(s, ver); /* version */
|
in_uint8(s, ver); /* version */
|
||||||
if ((len != 16) || (ver != 1))
|
|
||||||
{
|
|
||||||
LOG_DEVEL(LOG_LEVEL_ERROR, "xrdp_sec_recv: error - unknown version %d "
|
|
||||||
"or unexpected length %d", ver, len);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
in_uint8(s, pad); /* padlen */
|
in_uint8(s, pad); /* padlen */
|
||||||
in_uint8s(s, 8); /* signature(8) */
|
in_uint8s(s, 8); /* signature(8) */
|
||||||
LOG_DEVEL(LOG_LEVEL_TRACE, "Received header [MS-RDPBCGR] TS_SECURITY_HEADER2 "
|
LOG_DEVEL(LOG_LEVEL_TRACE, "Received header [MS-RDPBCGR] TS_SECURITY_HEADER2 "
|
||||||
"length %d, version %d, padlen %d, dataSignature (ignored)",
|
"length %d, version %d, padlen %d, dataSignature (ignored)",
|
||||||
len, ver, pad);
|
len, ver, pad);
|
||||||
|
if (len != 16)
|
||||||
|
{
|
||||||
|
LOG(LOG_LEVEL_ERROR, "Received header [MS-RDPBCGR] TS_SECURITY_HEADER2 "
|
||||||
|
"has unexpected length. Expected 16, actual %d", len);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
if (ver != 1)
|
||||||
|
{
|
||||||
|
LOG(LOG_LEVEL_ERROR, "Received header [MS-RDPBCGR] TS_SECURITY_HEADER2 "
|
||||||
|
"has unexpected version. Expected 1, actual %d", ver);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
xrdp_sec_fips_decrypt(self, s->p, (int)(s->end - s->p));
|
xrdp_sec_fips_decrypt(self, s->p, (int)(s->end - s->p));
|
||||||
s->end -= pad;
|
s->end -= pad;
|
||||||
}
|
}
|
||||||
else if (self->crypt_level > CRYPT_LEVEL_NONE)
|
else if (self->crypt_level > CRYPT_LEVEL_NONE)
|
||||||
{
|
{
|
||||||
if (!s_check_rem(s, 8))
|
if (!s_check_rem_and_log(s, 8, "Parsing [MS-RDPBCGR] TS_SECURITY_HEADER1"))
|
||||||
{
|
{
|
||||||
LOG_DEVEL(LOG_LEVEL_ERROR, "xrdp_sec_recv: error - not enough bytes in the stream");
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
/* TS_SECURITY_HEADER1 */
|
/* TS_SECURITY_HEADER1 */
|
||||||
@ -1455,23 +1571,20 @@ xrdp_sec_recv(struct xrdp_sec *self, struct stream *s, int *chan)
|
|||||||
|
|
||||||
if (flags & SEC_CLIENT_RANDOM) /* 0x01 TS_SECURITY_PACKET */
|
if (flags & SEC_CLIENT_RANDOM) /* 0x01 TS_SECURITY_PACKET */
|
||||||
{
|
{
|
||||||
if (!s_check_rem(s, 4))
|
if (!s_check_rem_and_log(s, 4, "Parsing [MS-RDPBCGR] TS_SECURITY_PACKET"))
|
||||||
{
|
{
|
||||||
LOG_DEVEL(LOG_LEVEL_ERROR, "Not enough bytes in the stream "
|
|
||||||
"len 4, remaining %d", s_rem(s));
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
in_uint32_le(s, len);
|
in_uint32_le(s, len);
|
||||||
/* 512, 2048 bit */
|
/* 512, 2048 bit */
|
||||||
if ((len != 64 + 8) && (len != 256 + 8))
|
if ((len != 64 + 8) && (len != 256 + 8))
|
||||||
{
|
{
|
||||||
LOG_DEVEL(LOG_LEVEL_ERROR, "xrdp_sec_recv : error - unexpected length %d", len);
|
LOG(LOG_LEVEL_ERROR, "xrdp_sec_recv : error - unexpected length %d", len);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
if (!s_check_rem(s, len - 8))
|
if (!s_check_rem_and_log(s, len - 8,
|
||||||
|
"Parsing [MS-RDPBCGR] TS_SECURITY_PACKET encryptedClientRandom"))
|
||||||
{
|
{
|
||||||
LOG_DEVEL(LOG_LEVEL_ERROR, "Not enough bytes in the stream "
|
|
||||||
"len %d, remaining %d", (len - 8), s_rem(s));
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
in_uint8a(s, self->client_crypt_random, len - 8);
|
in_uint8a(s, self->client_crypt_random, len - 8);
|
||||||
@ -1658,7 +1771,7 @@ xrdp_sec_send(struct xrdp_sec *self, struct stream *s, int chan)
|
|||||||
|
|
||||||
if (xrdp_mcs_send(self->mcs_layer, s, chan) != 0)
|
if (xrdp_mcs_send(self->mcs_layer, s, chan) != 0)
|
||||||
{
|
{
|
||||||
LOG_DEVEL(LOG_LEVEL_ERROR, "xrdp_sec_send: xrdp_mcs_send failed");
|
LOG(LOG_LEVEL_ERROR, "xrdp_sec_send: xrdp_mcs_send failed");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1688,8 +1801,8 @@ xrdp_sec_init_fastpath(struct xrdp_sec *self, struct stream *s)
|
|||||||
{
|
{
|
||||||
if (xrdp_fastpath_init(self->fastpath_layer, s) != 0)
|
if (xrdp_fastpath_init(self->fastpath_layer, s) != 0)
|
||||||
{
|
{
|
||||||
LOG_DEVEL(LOG_LEVEL_ERROR,
|
LOG(LOG_LEVEL_ERROR,
|
||||||
"xrdp_sec_init_fastpath: xrdp_fastpath_init failed");
|
"xrdp_sec_init_fastpath: xrdp_fastpath_init failed");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
if (self->crypt_level == CRYPT_LEVEL_FIPS)
|
if (self->crypt_level == CRYPT_LEVEL_FIPS)
|
||||||
@ -1791,8 +1904,8 @@ xrdp_sec_send_fastpath(struct xrdp_sec *self, struct stream *s)
|
|||||||
}
|
}
|
||||||
if (error != 0)
|
if (error != 0)
|
||||||
{
|
{
|
||||||
LOG_DEVEL(LOG_LEVEL_ERROR,
|
LOG(LOG_LEVEL_ERROR,
|
||||||
"xrdp_sec_send_fastpath: xrdp_fastpath_send failed");
|
"xrdp_sec_send_fastpath: xrdp_fastpath_send failed");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
@ -2135,28 +2248,24 @@ xrdp_sec_process_mcs_data_channels(struct xrdp_sec *self, struct stream *s)
|
|||||||
LOG(LOG_LEVEL_DEBUG, "All channels are disabled by configuration");
|
LOG(LOG_LEVEL_DEBUG, "All channels are disabled by configuration");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
if (!s_check_rem(s, 4))
|
if (!s_check_rem_and_log(s, 4, "Parsing [MS-RDPBCGR] TS_UD_CS_NET"))
|
||||||
{
|
{
|
||||||
LOG_DEVEL(LOG_LEVEL_ERROR, "Not enough bytes in the stream "
|
|
||||||
"len 4, remaining %d", s_rem(s));
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
in_uint32_le(s, num_channels);
|
in_uint32_le(s, num_channels);
|
||||||
if (num_channels > 31)
|
|
||||||
{
|
|
||||||
LOG_DEVEL(LOG_LEVEL_ERROR, "Protocol error: too many channels requested. "
|
|
||||||
"max 31, received %d", num_channels);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
LOG_DEVEL(LOG_LEVEL_TRACE, "Received [MS-RDPBCGR] TS_UD_CS_NET "
|
LOG_DEVEL(LOG_LEVEL_TRACE, "Received [MS-RDPBCGR] TS_UD_CS_NET "
|
||||||
"channelCount %d", num_channels);
|
"channelCount %d", num_channels);
|
||||||
|
if (num_channels > 31)
|
||||||
|
{
|
||||||
|
LOG(LOG_LEVEL_ERROR, "[MS-RDPBCGR] Protocol error: too many channels requested. "
|
||||||
|
"max 31, received %d", num_channels);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
for (index = 0; index < num_channels; index++)
|
for (index = 0; index < num_channels; index++)
|
||||||
{
|
{
|
||||||
channel_item = g_new0(struct mcs_channel_item, 1);
|
channel_item = g_new0(struct mcs_channel_item, 1);
|
||||||
if (!s_check_rem(s, 12))
|
if (!s_check_rem_and_log(s, 12, "Parsing [MS-RDPBCGR] TS_UD_CS_NET.CHANNEL_DEF"))
|
||||||
{
|
{
|
||||||
LOG_DEVEL(LOG_LEVEL_ERROR, "Not enough bytes in the stream "
|
|
||||||
"len 12, remaining %d", s_rem(s));
|
|
||||||
g_free(channel_item);
|
g_free(channel_item);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
@ -2213,28 +2322,32 @@ xrdp_sec_process_mcs_data_monitors(struct xrdp_sec *self, struct stream *s)
|
|||||||
LOG(LOG_LEVEL_INFO, "Multi-monitor is disabled by server config");
|
LOG(LOG_LEVEL_INFO, "Multi-monitor is disabled by server config");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
if (!s_check_rem_and_log(s, 8, "Parsing [MS-RDPBCGR] TS_UD_CS_MONITOR"))
|
||||||
|
{
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
in_uint32_le(s, flags); /* flags */
|
in_uint32_le(s, flags); /* flags */
|
||||||
|
in_uint32_le(s, monitorCount);
|
||||||
|
LOG_DEVEL(LOG_LEVEL_TRACE, "Received [MS-RDPBCGR] TS_UD_CS_MONITOR "
|
||||||
|
"flags 0x%8.8x, monitorCount %d", flags, monitorCount);
|
||||||
|
|
||||||
//verify flags - must be 0x0
|
//verify flags - must be 0x0
|
||||||
if (flags != 0)
|
if (flags != 0)
|
||||||
{
|
{
|
||||||
LOG_DEVEL(LOG_LEVEL_ERROR,
|
LOG(LOG_LEVEL_ERROR,
|
||||||
"Protocol error: TS_UD_CS_MONITOR flags MUST be zero, "
|
"[MS-RDPBCGR] Protocol error: TS_UD_CS_MONITOR flags MUST be zero, "
|
||||||
"received: 0x%8.8x", flags);
|
"received: 0x%8.8x", flags);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
in_uint32_le(s, monitorCount);
|
|
||||||
//verify monitorCount - max 16
|
//verify monitorCount - max 16
|
||||||
if (monitorCount > 16)
|
if (monitorCount > 16)
|
||||||
{
|
{
|
||||||
LOG(LOG_LEVEL_ERROR,
|
LOG(LOG_LEVEL_ERROR,
|
||||||
"Protocol error: TS_UD_CS_MONITOR monitorCount "
|
"[MS-RDPBCGR] Protocol error: TS_UD_CS_MONITOR monitorCount "
|
||||||
"MUST be less than 16, received: %d", monitorCount);
|
"MUST be less than 16, received: %d", monitorCount);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
LOG_DEVEL(LOG_LEVEL_TRACE, "Received [MS-RDPBCGR] TS_UD_CS_MONITOR "
|
|
||||||
"flags 0x%8.8x, monitorCount %d", flags, monitorCount);
|
|
||||||
|
|
||||||
client_info->monitorCount = monitorCount;
|
client_info->monitorCount = monitorCount;
|
||||||
|
|
||||||
x1 = 0;
|
x1 = 0;
|
||||||
@ -2245,6 +2358,10 @@ xrdp_sec_process_mcs_data_monitors(struct xrdp_sec *self, struct stream *s)
|
|||||||
/* Add client_monitor_data to client_info struct, will later pass to X11rdp */
|
/* Add client_monitor_data to client_info struct, will later pass to X11rdp */
|
||||||
for (index = 0; index < monitorCount; index++)
|
for (index = 0; index < monitorCount; index++)
|
||||||
{
|
{
|
||||||
|
if (!s_check_rem_and_log(s, 20, "Parsing [MS-RDPBCGR] TS_UD_CS_MONITOR.TS_MONITOR_DEF"))
|
||||||
|
{
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
in_uint32_le(s, client_info->minfo[index].left);
|
in_uint32_le(s, client_info->minfo[index].left);
|
||||||
in_uint32_le(s, client_info->minfo[index].top);
|
in_uint32_le(s, client_info->minfo[index].top);
|
||||||
in_uint32_le(s, client_info->minfo[index].right);
|
in_uint32_le(s, client_info->minfo[index].right);
|
||||||
@ -2354,10 +2471,8 @@ xrdp_sec_process_mcs_data(struct xrdp_sec *self)
|
|||||||
/* set p to beginning */
|
/* set p to beginning */
|
||||||
s->p = s->data;
|
s->p = s->data;
|
||||||
/* skip header */
|
/* skip header */
|
||||||
if (!s_check_rem(s, 23))
|
if (!s_check_rem_and_log(s, 23, "Parsing [ITU T.124] ConferenceCreateRequest"))
|
||||||
{
|
{
|
||||||
LOG_DEVEL(LOG_LEVEL_ERROR, "Not enough bytes in the stream "
|
|
||||||
"len 23, remaining %d", s_rem(s));
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
in_uint8s(s, 23); /* skip [ITU T.124] ConferenceCreateRequest fields until userData */
|
in_uint8s(s, 23); /* skip [ITU T.124] ConferenceCreateRequest fields until userData */
|
||||||
@ -2367,50 +2482,55 @@ xrdp_sec_process_mcs_data(struct xrdp_sec *self)
|
|||||||
hold_p = s->p;
|
hold_p = s->p;
|
||||||
in_uint16_le(s, tag);
|
in_uint16_le(s, tag);
|
||||||
in_uint16_le(s, size);
|
in_uint16_le(s, size);
|
||||||
|
LOG_DEVEL(LOG_LEVEL_TRACE, "Received header [MS-RDPBCGR] TS_UD_HEADER "
|
||||||
|
"type 0x%4.4x, length %d", tag, size);
|
||||||
|
|
||||||
if ((size < 4) || (!s_check_rem(s, size - 4)))
|
if (size < 4)
|
||||||
|
{
|
||||||
|
LOG(LOG_LEVEL_WARNING, "[MS-RDPBCGR] Protocol error: Invalid TS_UD_HEADER length value. "
|
||||||
|
"expected >= 4, actual %d", size);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (!s_check_rem_and_log(s, size - 4,
|
||||||
|
"Parsing [MS-RDPBCGR] GCC Conference Create Request client data field"))
|
||||||
{
|
{
|
||||||
LOG(LOG_LEVEL_WARNING, "Not enough bytes in the stream "
|
|
||||||
"len %d, remaining %d", size - 4, s_rem(s));
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
LOG_DEVEL(LOG_LEVEL_TRACE, "Received header [MS-RDPBCGR] TS_UD_HEADER "
|
|
||||||
"type 0x%4.4x, length %d", tag, size);
|
|
||||||
switch (tag)
|
switch (tag)
|
||||||
{
|
{
|
||||||
case SEC_TAG_CLI_INFO: /* CS_CORE 0xC001 */
|
case SEC_TAG_CLI_INFO: /* CS_CORE 0xC001 */
|
||||||
if (xrdp_sec_process_mcs_data_CS_CORE(self, s) != 0)
|
if (xrdp_sec_process_mcs_data_CS_CORE(self, s) != 0)
|
||||||
{
|
{
|
||||||
LOG_DEVEL(LOG_LEVEL_ERROR,
|
LOG(LOG_LEVEL_ERROR,
|
||||||
"xrdp_sec_process_mcs_data: xrdp_sec_process_mcs_data_CS_CORE failed");
|
"Processing [MS-RDPBCGR] TS_UD_CS_CORE failed");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case SEC_TAG_CLI_CRYPT: /* CS_SECURITY 0xC002 */
|
case SEC_TAG_CLI_CRYPT: /* CS_SECURITY 0xC002 */
|
||||||
if (xrdp_sec_process_mcs_data_CS_SECURITY(self, s) != 0)
|
if (xrdp_sec_process_mcs_data_CS_SECURITY(self, s) != 0)
|
||||||
{
|
{
|
||||||
LOG_DEVEL(LOG_LEVEL_ERROR,
|
LOG(LOG_LEVEL_ERROR,
|
||||||
"xrdp_sec_process_mcs_data: xrdp_sec_process_mcs_data_CS_SECURITY failed");
|
"Processing [MS-RDPBCGR] TS_UD_CS_SEC failed");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case SEC_TAG_CLI_CHANNELS: /* CS_NET 0xC003 */
|
case SEC_TAG_CLI_CHANNELS: /* CS_NET 0xC003 */
|
||||||
if (xrdp_sec_process_mcs_data_channels(self, s) != 0)
|
if (xrdp_sec_process_mcs_data_channels(self, s) != 0)
|
||||||
{
|
{
|
||||||
LOG_DEVEL(LOG_LEVEL_ERROR,
|
LOG(LOG_LEVEL_ERROR,
|
||||||
"xrdp_sec_process_mcs_data: xrdp_sec_process_mcs_data_channels failed");
|
"Processing [MS-RDPBCGR] TS_UD_CS_NET failed");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case SEC_TAG_CLI_4: /* CS_CLUSTER 0xC004 */
|
case SEC_TAG_CLI_4: /* CS_CLUSTER 0xC004 */
|
||||||
LOG_DEVEL(LOG_LEVEL_TRACE, "Received [MS-RDPBCGR] TS_UD_CS_CLUSTER - no-op");
|
LOG_DEVEL(LOG_LEVEL_DEBUG, "Received [MS-RDPBCGR] TS_UD_CS_CLUSTER - no-op");
|
||||||
break;
|
break;
|
||||||
case SEC_TAG_CLI_MONITOR: /* CS_MONITOR 0xC005 */
|
case SEC_TAG_CLI_MONITOR: /* CS_MONITOR 0xC005 */
|
||||||
if (xrdp_sec_process_mcs_data_monitors(self, s) != 0)
|
if (xrdp_sec_process_mcs_data_monitors(self, s) != 0)
|
||||||
{
|
{
|
||||||
LOG_DEVEL(LOG_LEVEL_ERROR,
|
LOG(LOG_LEVEL_ERROR,
|
||||||
"xrdp_sec_process_mcs_data: xrdp_sec_process_mcs_data_monitors failed");
|
"Processing [MS-RDPBCGR] TS_UD_CS_MONITOR failed");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@ -2476,10 +2596,8 @@ xrdp_sec_in_mcs_data(struct xrdp_sec *self)
|
|||||||
s = &(self->client_mcs_data);
|
s = &(self->client_mcs_data);
|
||||||
/* get hostname, it's unicode */
|
/* get hostname, it's unicode */
|
||||||
s->p = s->data;
|
s->p = s->data;
|
||||||
if (!s_check_rem(s, 47))
|
if (!s_check_rem_and_log(s, 47, "Parsing [ITU T.124] ConferenceCreateRequest"))
|
||||||
{
|
{
|
||||||
LOG_DEVEL(LOG_LEVEL_ERROR, "Not enough bytes in the stream "
|
|
||||||
"len 47, remaining %d", s_rem(s));
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
in_uint8s(s, 47); /* skip [ITU T.124] ConferenceCreateRequest up to the
|
in_uint8s(s, 47); /* skip [ITU T.124] ConferenceCreateRequest up to the
|
||||||
@ -2493,10 +2611,8 @@ xrdp_sec_in_mcs_data(struct xrdp_sec *self)
|
|||||||
like we do in xrdp_sec_process_mcs_data_CS_CORE? */
|
like we do in xrdp_sec_process_mcs_data_CS_CORE? */
|
||||||
while (index < 16 && c != 0)
|
while (index < 16 && c != 0)
|
||||||
{
|
{
|
||||||
if (!s_check_rem(s, 2))
|
if (!s_check_rem_and_log(s, 2, "Parsing [MS-RDPBCGR] TS_UD_CS_CORE clientName"))
|
||||||
{
|
{
|
||||||
LOG_DEVEL(LOG_LEVEL_ERROR, "Not enough bytes in the stream "
|
|
||||||
"len 2, remaining %d", s_rem(s));
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
in_uint8(s, c);
|
in_uint8(s, c);
|
||||||
@ -2506,30 +2622,24 @@ xrdp_sec_in_mcs_data(struct xrdp_sec *self)
|
|||||||
}
|
}
|
||||||
/* get build */
|
/* get build */
|
||||||
s->p = s->data;
|
s->p = s->data;
|
||||||
if (!s_check_rem(s, 43 + 4))
|
if (!s_check_rem_and_log(s, 43 + 4, "Parsing [MS-RDPBCGR] TS_UD_CS_CORE clientBuild"))
|
||||||
{
|
{
|
||||||
LOG_DEVEL(LOG_LEVEL_ERROR, "Not enough bytes in the stream "
|
|
||||||
"len 47, remaining %d", s_rem(s));
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
in_uint8s(s, 43);
|
in_uint8s(s, 43);
|
||||||
in_uint32_le(s, client_info->build); /* [MS-RDPBCGR] TS_UD_CS_CORE clientBuild */
|
in_uint32_le(s, client_info->build); /* [MS-RDPBCGR] TS_UD_CS_CORE clientBuild */
|
||||||
/* get keylayout */
|
/* get keylayout */
|
||||||
s->p = s->data;
|
s->p = s->data;
|
||||||
if (!s_check_rem(s, 39 + 4))
|
if (!s_check_rem_and_log(s, 39 + 4, "Parsing [MS-RDPBCGR] TS_UD_CS_CORE keyboardLayout"))
|
||||||
{
|
{
|
||||||
LOG_DEVEL(LOG_LEVEL_ERROR, "Not enough bytes in the stream "
|
|
||||||
"len 43, remaining %d", s_rem(s));
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
in_uint8s(s, 39);
|
in_uint8s(s, 39);
|
||||||
in_uint32_le(s, client_info->keylayout); /* [MS-RDPBCGR] TS_UD_CS_CORE keyboardLayout */
|
in_uint32_le(s, client_info->keylayout); /* [MS-RDPBCGR] TS_UD_CS_CORE keyboardLayout */
|
||||||
/* get keyboard type / subtype */
|
/* get keyboard type / subtype */
|
||||||
s->p = s->data;
|
s->p = s->data;
|
||||||
if (!s_check_rem(s, 79 + 8))
|
if (!s_check_rem_and_log(s, 79 + 8, "Parsing [MS-RDPBCGR] TS_UD_CS_CORE keyboardType"))
|
||||||
{
|
{
|
||||||
LOG_DEVEL(LOG_LEVEL_ERROR, "Not enough bytes in the stream "
|
|
||||||
"len 87, remaining %d", s_rem(s));
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
in_uint8s(s, 79);
|
in_uint8s(s, 79);
|
||||||
@ -2642,12 +2752,12 @@ xrdp_sec_incoming(struct xrdp_sec *self)
|
|||||||
self->rdp_layer->client_info.ssl_protocols,
|
self->rdp_layer->client_info.ssl_protocols,
|
||||||
self->rdp_layer->client_info.tls_ciphers) != 0)
|
self->rdp_layer->client_info.tls_ciphers) != 0)
|
||||||
{
|
{
|
||||||
LOG_DEVEL(LOG_LEVEL_ERROR, "xrdp_sec_incoming: trans_set_tls_mode failed");
|
LOG(LOG_LEVEL_ERROR, "xrdp_sec_incoming: trans_set_tls_mode failed");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
LOG_DEVEL(LOG_LEVEL_DEBUG, "Using TLS security, and "
|
LOG(LOG_LEVEL_DEBUG, "Using TLS security, and "
|
||||||
"setting RDP security crypto to LEVEL_NONE and METHOD_NONE");
|
"setting RDP security crypto to LEVEL_NONE and METHOD_NONE");
|
||||||
self->crypt_level = CRYPT_LEVEL_NONE;
|
self->crypt_level = CRYPT_LEVEL_NONE;
|
||||||
self->crypt_method = CRYPT_METHOD_NONE;
|
self->crypt_method = CRYPT_METHOD_NONE;
|
||||||
self->rsa_key_bytes = 0;
|
self->rsa_key_bytes = 0;
|
||||||
@ -2658,13 +2768,13 @@ xrdp_sec_incoming(struct xrdp_sec *self)
|
|||||||
/* init rdp security */
|
/* init rdp security */
|
||||||
if (xrdp_sec_init_rdp_security(self) != 0)
|
if (xrdp_sec_init_rdp_security(self) != 0)
|
||||||
{
|
{
|
||||||
LOG_DEVEL(LOG_LEVEL_ERROR, "xrdp_sec_incoming: xrdp_sec_init_rdp_security failed");
|
LOG(LOG_LEVEL_ERROR, "xrdp_sec_incoming: xrdp_sec_init_rdp_security failed");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
if (self->crypt_method != CRYPT_METHOD_NONE)
|
if (self->crypt_method != CRYPT_METHOD_NONE)
|
||||||
{
|
{
|
||||||
LOG_DEVEL(LOG_LEVEL_DEBUG, "Using RDP security, and "
|
LOG(LOG_LEVEL_DEBUG, "Using RDP security, and "
|
||||||
"reading the server configuration");
|
"reading the server configuration");
|
||||||
|
|
||||||
g_memset(key_file, 0, sizeof(char) * 256);
|
g_memset(key_file, 0, sizeof(char) * 256);
|
||||||
g_random(self->server_random, 32);
|
g_random(self->server_random, 32);
|
||||||
@ -2677,7 +2787,7 @@ xrdp_sec_incoming(struct xrdp_sec *self)
|
|||||||
if (file_by_name_read_section(key_file, "keys", items, values) != 0)
|
if (file_by_name_read_section(key_file, "keys", items, values) != 0)
|
||||||
{
|
{
|
||||||
/* this is a show stopper */
|
/* this is a show stopper */
|
||||||
LOG(LOG_LEVEL_ALWAYS, "XRDP cannot read file: %s "
|
LOG(LOG_LEVEL_ERROR, "XRDP cannot read file: %s "
|
||||||
"(check permissions)", key_file);
|
"(check permissions)", key_file);
|
||||||
list_delete(items);
|
list_delete(items);
|
||||||
list_delete(values);
|
list_delete(values);
|
||||||
@ -2727,7 +2837,7 @@ xrdp_sec_incoming(struct xrdp_sec *self)
|
|||||||
/* negotiate mcs layer */
|
/* negotiate mcs layer */
|
||||||
if (xrdp_mcs_incoming(self->mcs_layer) != 0)
|
if (xrdp_mcs_incoming(self->mcs_layer) != 0)
|
||||||
{
|
{
|
||||||
LOG_DEVEL(LOG_LEVEL_ERROR, "xrdp_sec_incoming: xrdp_mcs_incoming failed");
|
LOG(LOG_LEVEL_ERROR, "xrdp_sec_incoming: xrdp_mcs_incoming failed");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2740,7 +2850,7 @@ xrdp_sec_incoming(struct xrdp_sec *self)
|
|||||||
|
|
||||||
if (xrdp_sec_in_mcs_data(self) != 0)
|
if (xrdp_sec_in_mcs_data(self) != 0)
|
||||||
{
|
{
|
||||||
LOG_DEVEL(LOG_LEVEL_ERROR, "xrdp_sec_incoming: xrdp_sec_in_mcs_data failed");
|
LOG(LOG_LEVEL_ERROR, "xrdp_sec_incoming: xrdp_sec_in_mcs_data failed");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -789,7 +789,7 @@ xfuse_add_clip_dir_item(const char *filename, int flags, int size, int lindex)
|
|||||||
if (g_xfs == NULL)
|
if (g_xfs == NULL)
|
||||||
{
|
{
|
||||||
LOG_DEVEL(LOG_LEVEL_ERROR,
|
LOG_DEVEL(LOG_LEVEL_ERROR,
|
||||||
"xfuse_add_clip_dir_item() called with no filesystem")
|
"xfuse_add_clip_dir_item() called with no filesystem");
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
Loading…
Reference in New Issue
Block a user