diff --git a/channels/drdynvc/drdynvc_main.c b/channels/drdynvc/drdynvc_main.c index 42d422d25..afe9bb522 100644 --- a/channels/drdynvc/drdynvc_main.c +++ b/channels/drdynvc/drdynvc_main.c @@ -45,6 +45,7 @@ struct drdynvc_plugin int PriorityCharge1; int PriorityCharge2; int PriorityCharge3; + int channel_error; IWTSVirtualChannelManager* channel_mgr; }; @@ -65,7 +66,7 @@ static int drdynvc_write_variable_uint(STREAM* stream, uint32 val) } else { - cb = 3; + cb = 2; stream_write_uint32(stream, val); } return cb; @@ -82,6 +83,9 @@ int drdynvc_write_data(drdynvcPlugin* drdynvc, uint32 ChannelId, uint8* data, ui DEBUG_DVC("ChannelId=%d size=%d", ChannelId, data_size); + if (drdynvc->channel_error != CHANNEL_RC_OK) + return 1; + data_out = stream_new(CHANNEL_CHUNK_LENGTH); stream_set_pos(data_out, 1); cbChId = drdynvc_write_variable_uint(data_out, ChannelId); @@ -139,6 +143,7 @@ int drdynvc_write_data(drdynvcPlugin* drdynvc, uint32 ChannelId, uint8* data, ui } if (error != CHANNEL_RC_OK) { + drdynvc->channel_error = error; DEBUG_WARN("VirtualChannelWrite failed %d", error); return 1; } @@ -182,6 +187,8 @@ static int drdynvc_process_capability_request(drdynvcPlugin* drdynvc, int Sp, in DEBUG_WARN("VirtualChannelWrite failed %d", error); return 1; } + drdynvc->channel_error = error; + return 0; } @@ -329,6 +336,7 @@ static void drdynvc_process_connect(rdpSvcPlugin* plugin) DEBUG_DVC("connecting"); drdynvc->channel_mgr = dvcman_new(drdynvc); + drdynvc->channel_error = 0; dvcman_load_plugin(drdynvc->channel_mgr, svc_plugin_get_data(plugin)); dvcman_init(drdynvc->channel_mgr); } diff --git a/libfreerdp-utils/svc_plugin.c b/libfreerdp-utils/svc_plugin.c index 72379d57d..ac0c51cc8 100644 --- a/libfreerdp-utils/svc_plugin.c +++ b/libfreerdp-utils/svc_plugin.c @@ -384,8 +384,12 @@ int svc_plugin_send(rdpSvcPlugin* plugin, STREAM* data_out) DEBUG_SVC("length %d", stream_get_length(data_out)); - error = plugin->channel_entry_points.pVirtualChannelWrite(plugin->priv->open_handle, - stream_get_data(data_out), stream_get_length(data_out), data_out); + if (!plugin || !plugin->priv) + error = CHANNEL_RC_BAD_INIT_HANDLE; + else + error = plugin->channel_entry_points.pVirtualChannelWrite(plugin->priv->open_handle, + stream_get_data(data_out), stream_get_length(data_out), data_out); + if (error != CHANNEL_RC_OK) { stream_free(data_out);