Skip to content

Commit 36cbf1b

Browse files
committed
Fixed error handling for channel load failures.
1 parent 6ebf452 commit 36cbf1b

File tree

24 files changed

+216
-165
lines changed

24 files changed

+216
-165
lines changed

channels/audin/client/audin_main.c

Lines changed: 13 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -832,23 +832,21 @@ UINT DVCPluginEntry(IDRDYNVC_ENTRY_POINTS* pEntryPoints)
832832
assert(pEntryPoints->GetPlugin);
833833

834834
audin = (AUDIN_PLUGIN*) pEntryPoints->GetPlugin(pEntryPoints, "audin");
835-
if (audin == NULL)
836-
{
837-
audin = (AUDIN_PLUGIN*) calloc(1, sizeof(AUDIN_PLUGIN));
838-
if (!audin)
839-
{
840-
WLog_ERR(TAG, "calloc failed!");
841-
return CHANNEL_RC_NO_MEMORY;
842-
}
843-
844-
audin->iface.Initialize = audin_plugin_initialize;
845-
audin->iface.Connected = NULL;
846-
audin->iface.Disconnected = NULL;
847-
audin->iface.Terminated = audin_plugin_terminated;
835+
if (audin != NULL)
836+
return CHANNEL_RC_ALREADY_INITIALIZED;
848837

849-
error = pEntryPoints->RegisterPlugin(pEntryPoints, "audin", (IWTSPlugin*) audin);
838+
audin = (AUDIN_PLUGIN*) calloc(1, sizeof(AUDIN_PLUGIN));
839+
if (!audin)
840+
{
841+
WLog_ERR(TAG, "calloc failed!");
842+
return CHANNEL_RC_NO_MEMORY;
850843
}
851844

845+
audin->iface.Initialize = audin_plugin_initialize;
846+
audin->iface.Connected = NULL;
847+
audin->iface.Disconnected = NULL;
848+
audin->iface.Terminated = audin_plugin_terminated;
849+
852850
args = pEntryPoints->GetPluginData(pEntryPoints);
853851
audin->rdpcontext = ((freerdp*)((rdpSettings*) pEntryPoints->GetRdpSettings(pEntryPoints))->instance)->context;
854852

@@ -894,7 +892,7 @@ UINT DVCPluginEntry(IDRDYNVC_ENTRY_POINTS* pEntryPoints)
894892
if (audin->device == NULL)
895893
WLog_ERR(TAG, "no sound device.");
896894

897-
error = CHANNEL_RC_OK;
895+
error = pEntryPoints->RegisterPlugin(pEntryPoints, "audin", (IWTSPlugin*) audin);
898896

899897
out:
900898
if (error != CHANNEL_RC_OK)

channels/cliprdr/client/cliprdr_main.c

Lines changed: 32 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -159,10 +159,10 @@ static UINT cliprdr_process_general_capability(cliprdrPlugin* cliprdr, wStream*
159159
WLog_ERR(TAG, "cliprdr_get_client_interface failed!");
160160
return ERROR_INTERNAL_ERROR;
161161
}
162-
162+
163163
Stream_Read_UINT32(s, version); /* version (4 bytes) */
164164
Stream_Read_UINT32(s, generalFlags); /* generalFlags (4 bytes) */
165-
165+
166166
DEBUG_CLIPRDR("Version: %d", version);
167167
#ifdef WITH_DEBUG_CLIPRDR
168168
cliprdr_print_general_capability_flags(generalFlags);
@@ -179,15 +179,15 @@ static UINT cliprdr_process_general_capability(cliprdrPlugin* cliprdr, wStream*
179179

180180
if (cliprdr->canLockClipData)
181181
cliprdr->canLockClipData = (generalFlags & CB_CAN_LOCK_CLIPDATA) ? TRUE : FALSE;
182-
182+
183183
cliprdr->capabilitiesReceived = TRUE;
184184

185185
if (!context->custom)
186186
{
187187
WLog_ERR(TAG, "context->custom not set!");
188188
return ERROR_INTERNAL_ERROR;
189189
}
190-
190+
191191
capabilities.cCapabilitiesSets = 1;
192192
capabilities.capabilitySets = (CLIPRDR_CAPABILITY_SET*) &(generalCapabilitySet);
193193
generalCapabilitySet.capabilitySetType = CB_CAPSTYPE_GENERAL;
@@ -215,7 +215,7 @@ static UINT cliprdr_process_clip_caps(cliprdrPlugin* cliprdr, wStream* s, UINT16
215215
UINT16 cCapabilitiesSets;
216216
UINT16 capabilitySetType;
217217
UINT error = CHANNEL_RC_OK;
218-
218+
219219
Stream_Read_UINT16(s, cCapabilitiesSets); /* cCapabilitiesSets (2 bytes) */
220220
Stream_Seek_UINT16(s); /* pad1 (2 bytes) */
221221

@@ -235,7 +235,7 @@ static UINT cliprdr_process_clip_caps(cliprdrPlugin* cliprdr, wStream* s, UINT16
235235
return error;
236236
}
237237
break;
238-
238+
239239
default:
240240
WLog_ERR(TAG, "unknown cliprdr capability set: %d", capabilitySetType);
241241
return CHANNEL_RC_BAD_PROC;
@@ -273,13 +273,13 @@ static UINT cliprdr_process_monitor_ready(cliprdrPlugin* cliprdr, wStream* s, UI
273273
* When the server capabilities pdu is not used, default capabilities
274274
* corresponding to a generalFlags field set to zero are assumed.
275275
*/
276-
276+
277277
cliprdr->useLongFormatNames = FALSE;
278278
cliprdr->streamFileClipEnabled = FALSE;
279279
cliprdr->fileClipNoFilePaths = TRUE;
280280
cliprdr->canLockClipData = FALSE;
281281
}
282-
282+
283283
monitorReady.msgType = CB_MONITOR_READY;
284284
monitorReady.msgFlags = flags;
285285
monitorReady.dataLen = length;
@@ -354,7 +354,7 @@ static UINT cliprdr_process_filecontents_response(cliprdrPlugin* cliprdr, wStrea
354354
WLog_ERR(TAG, "context->custom not set!");
355355
return ERROR_INTERNAL_ERROR;
356356
}
357-
357+
358358
if (Stream_GetRemainingLength(s) < 4)
359359
{
360360
WLog_ERR(TAG, "not enought remaining data");
@@ -366,7 +366,7 @@ static UINT cliprdr_process_filecontents_response(cliprdrPlugin* cliprdr, wStrea
366366
response.dataLen = length;
367367

368368
Stream_Read_UINT32(s, response.streamId); /* streamId (4 bytes) */
369-
369+
370370
response.cbRequested = length - 4;
371371
response.requestedData = Stream_Pointer(s); /* requestedFileContentsData */
372372

@@ -434,7 +434,7 @@ static UINT cliprdr_process_unlock_clipdata(cliprdrPlugin* cliprdr, wStream* s,
434434
WLog_ERR(TAG, "context->custom not set!");
435435
return ERROR_INTERNAL_ERROR;
436436
}
437-
437+
438438
if (Stream_GetRemainingLength(s) < 4)
439439
{
440440
WLog_ERR(TAG, "not enought remaining data");
@@ -637,7 +637,7 @@ UINT cliprdr_client_format_list(CliprdrClientContext* context, CLIPRDR_FORMAT_LI
637637
if (!cliprdr->useLongFormatNames)
638638
{
639639
length = formatList->numFormats * 36;
640-
640+
641641
s = cliprdr_packet_new(CB_FORMAT_LIST, 0, length);
642642

643643
if (!s)
@@ -649,40 +649,40 @@ UINT cliprdr_client_format_list(CliprdrClientContext* context, CLIPRDR_FORMAT_LI
649649
for (index = 0; index < formatList->numFormats; index++)
650650
{
651651
format = (CLIPRDR_FORMAT*) &(formatList->formats[index]);
652-
652+
653653
Stream_Write_UINT32(s, format->formatId); /* formatId (4 bytes) */
654-
654+
655655
formatNameSize = 0;
656656
formatNameLength = 0;
657657

658658
szFormatName = format->formatName;
659-
659+
660660
if (asciiNames)
661661
{
662662
if (szFormatName)
663663
formatNameLength = strlen(szFormatName);
664-
664+
665665
if (formatNameLength > 31)
666666
formatNameLength = 31;
667-
667+
668668
Stream_Write(s, szFormatName, formatNameLength);
669669
Stream_Zero(s, 32 - formatNameLength);
670670
}
671671
else
672672
{
673673
wszFormatName = NULL;
674-
674+
675675
if (szFormatName)
676676
formatNameSize = ConvertToUnicode(CP_UTF8, 0, szFormatName, -1, &wszFormatName, 0);
677-
677+
678678
if (formatNameSize > 15)
679679
formatNameSize = 15;
680-
681-
if (wszFormatName)
680+
681+
if (wszFormatName)
682682
Stream_Write(s, wszFormatName, formatNameSize * 2);
683683

684684
Stream_Zero(s, 32 - (formatNameSize * 2));
685-
685+
686686
free(wszFormatName);
687687
}
688688
}
@@ -1218,9 +1218,9 @@ static UINT cliprdr_virtual_channel_event_disconnected(cliprdrPlugin* cliprdr)
12181218

12191219
if (MessageQueue_PostQuit(cliprdr->queue, 0) && (WaitForSingleObject(cliprdr->thread, INFINITE) == WAIT_FAILED))
12201220
{
1221-
rc = GetLastError();
1222-
WLog_ERR(TAG, "WaitForSingleObject failed with error %lu", rc);
1223-
return rc;
1221+
rc = GetLastError();
1222+
WLog_ERR(TAG, "WaitForSingleObject failed with error %lu", rc);
1223+
return rc;
12241224
}
12251225

12261226
MessageQueue_Free(cliprdr->queue);
@@ -1257,7 +1257,9 @@ static UINT cliprdr_virtual_channel_event_terminated(cliprdrPlugin* cliprdr)
12571257
return CHANNEL_RC_OK;
12581258
}
12591259

1260-
static VOID VCAPITYPE cliprdr_virtual_channel_init_event(LPVOID pInitHandle, UINT event, LPVOID pData, UINT dataLength)
1260+
static UINT VCAPITYPE cliprdr_virtual_channel_init_event(LPVOID pInitHandle,
1261+
UINT event, LPVOID pData,
1262+
UINT dataLength)
12611263
{
12621264
cliprdrPlugin* cliprdr;
12631265
UINT error = CHANNEL_RC_OK;
@@ -1267,7 +1269,7 @@ static VOID VCAPITYPE cliprdr_virtual_channel_init_event(LPVOID pInitHandle, UIN
12671269
if (!cliprdr)
12681270
{
12691271
WLog_ERR(TAG, "error no match");
1270-
return;
1272+
return CHANNEL_RC_BAD_INIT_HANDLE;
12711273
}
12721274

12731275
switch (event)
@@ -1290,7 +1292,7 @@ static VOID VCAPITYPE cliprdr_virtual_channel_init_event(LPVOID pInitHandle, UIN
12901292
if (error && cliprdr->context->rdpcontext)
12911293
setChannelError(cliprdr->context->rdpcontext, error, "cliprdr_virtual_channel_init_event reported an error");
12921294

1293-
return;
1295+
return error;
12941296
}
12951297

12961298
/* cliprdr is always built-in */
@@ -1358,14 +1360,14 @@ BOOL VCAPITYPE VirtualChannelEntry(PCHANNEL_ENTRY_POINTS pEntryPoints)
13581360
cliprdr->streamFileClipEnabled = FALSE;
13591361
cliprdr->fileClipNoFilePaths = TRUE;
13601362
cliprdr->canLockClipData = FALSE;
1361-
1363+
13621364
WLog_Print(cliprdr->log, WLOG_DEBUG, "VirtualChannelEntry");
13631365

13641366
CopyMemory(&(cliprdr->channelEntryPoints), pEntryPoints, sizeof(CHANNEL_ENTRY_POINTS_FREERDP));
13651367

13661368
rc = cliprdr->channelEntryPoints.pVirtualChannelInit(&cliprdr->InitHandle,
13671369
&cliprdr->channelDef, 1, VIRTUAL_CHANNEL_VERSION_WIN2000, cliprdr_virtual_channel_init_event);
1368-
1370+
13691371
if (CHANNEL_RC_OK != rc)
13701372
{
13711373
WLog_ERR(TAG, "pVirtualChannelInit failed with %s [%08X]",

channels/drdynvc/client/drdynvc_main.c

Lines changed: 22 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -241,7 +241,7 @@ IWTSVirtualChannelManager* dvcman_new(drdynvcPlugin* plugin)
241241
*
242242
* @return 0 on success, otherwise a Win32 error code
243243
*/
244-
UINT dvcman_load_addin(IWTSVirtualChannelManager* pChannelMgr, ADDIN_ARGV* args, rdpSettings* settings)
244+
static UINT dvcman_load_addin(IWTSVirtualChannelManager* pChannelMgr, ADDIN_ARGV* args, rdpSettings* settings)
245245
{
246246
DVCMAN_ENTRY_POINTS entryPoints;
247247
PDVC_PLUGIN_ENTRY pDVCPluginEntry = NULL;
@@ -261,7 +261,7 @@ UINT dvcman_load_addin(IWTSVirtualChannelManager* pChannelMgr, ADDIN_ARGV* args,
261261
entryPoints.args = args;
262262
entryPoints.settings = settings;
263263

264-
pDVCPluginEntry((IDRDYNVC_ENTRY_POINTS*) &entryPoints);
264+
return pDVCPluginEntry((IDRDYNVC_ENTRY_POINTS*) &entryPoints);
265265
}
266266

267267
return CHANNEL_RC_OK;
@@ -478,8 +478,8 @@ UINT dvcman_create_channel(IWTSVirtualChannelManager* pChannelMgr, UINT32 Channe
478478
context = dvcman->drdynvc->context;
479479
IFCALLRET(context->OnChannelConnected, error, context, ChannelName, listener->iface.pInterface);
480480

481-
if (error)
482-
WLog_ERR(TAG, "context.ReceiveSamples failed with error %lu", error);
481+
if (error)
482+
WLog_ERR(TAG, "context.ReceiveSamples failed with error %lu", error);
483483

484484
return error;
485485
}
@@ -1056,7 +1056,7 @@ static UINT drdynvc_process_close_request(drdynvcPlugin* drdynvc, int Sp, int cb
10561056
WLog_ERR(TAG, "dvcman_close_channel failed with error %lu!", error);
10571057
return error;
10581058
}
1059-
1059+
10601060
data_out = Stream_New(NULL, 4);
10611061

10621062
if (!data_out)
@@ -1214,6 +1214,10 @@ void* drdynvc_get_open_handle_data(DWORD openHandle)
12141214
void drdynvc_remove_open_handle_data(DWORD openHandle)
12151215
{
12161216
void* pOpenHandle = (void*) (size_t) openHandle;
1217+
1218+
if (!g_OpenHandles)
1219+
return;
1220+
12171221
ListDictionary_Remove(g_OpenHandles, pOpenHandle);
12181222

12191223
if (ListDictionary_Count(g_OpenHandles) < 1)
@@ -1411,7 +1415,9 @@ static UINT drdynvc_virtual_channel_event_connected(drdynvcPlugin* drdynvc, LPVO
14111415
for (index = 0; index < settings->DynamicChannelCount; index++)
14121416
{
14131417
args = settings->DynamicChannelArray[index];
1414-
dvcman_load_addin(drdynvc->channel_mgr, args, settings);
1418+
error = dvcman_load_addin(drdynvc->channel_mgr, args, settings);
1419+
if (CHANNEL_RC_OK != error)
1420+
goto error;
14151421
}
14161422

14171423
if ((error = dvcman_init(drdynvc->channel_mgr)))
@@ -1434,8 +1440,6 @@ static UINT drdynvc_virtual_channel_event_connected(drdynvcPlugin* drdynvc, LPVO
14341440

14351441
error:
14361442
drdynvc_remove_open_handle_data(drdynvc->OpenHandle);
1437-
MessageQueue_Free(drdynvc->queue);
1438-
drdynvc->queue = NULL;
14391443
return error;
14401444
}
14411445

@@ -1449,11 +1453,11 @@ static UINT drdynvc_virtual_channel_event_disconnected(drdynvcPlugin* drdynvc)
14491453
UINT status;
14501454

14511455
if (MessageQueue_PostQuit(drdynvc->queue, 0) && (WaitForSingleObject(drdynvc->thread, INFINITE) == WAIT_FAILED))
1452-
{
1453-
status = GetLastError();
1454-
WLog_ERR(TAG, "WaitForSingleObject failed with error %lu", status);
1455-
return status;
1456-
}
1456+
{
1457+
status = GetLastError();
1458+
WLog_ERR(TAG, "WaitForSingleObject failed with error %lu", status);
1459+
return status;
1460+
}
14571461

14581462
MessageQueue_Free(drdynvc->queue);
14591463
CloseHandle(drdynvc->thread);
@@ -1497,7 +1501,9 @@ static UINT drdynvc_virtual_channel_event_terminated(drdynvcPlugin* drdynvc)
14971501
return CHANNEL_RC_OK;
14981502
}
14991503

1500-
static void VCAPITYPE drdynvc_virtual_channel_init_event(LPVOID pInitHandle, UINT event, LPVOID pData, UINT dataLength)
1504+
static UINT VCAPITYPE drdynvc_virtual_channel_init_event(LPVOID pInitHandle,
1505+
UINT event, LPVOID pData,
1506+
UINT dataLength)
15011507
{
15021508
drdynvcPlugin* drdynvc;
15031509
UINT error = CHANNEL_RC_OK;
@@ -1507,7 +1513,7 @@ static void VCAPITYPE drdynvc_virtual_channel_init_event(LPVOID pInitHandle, UIN
15071513
if (!drdynvc)
15081514
{
15091515
WLog_ERR(TAG, "drdynvc_virtual_channel_init_event: error no match");
1510-
return;
1516+
return CHANNEL_RC_BAD_INIT_HANDLE;
15111517
}
15121518

15131519
switch (event)
@@ -1530,6 +1536,7 @@ static void VCAPITYPE drdynvc_virtual_channel_init_event(LPVOID pInitHandle, UIN
15301536
if (error && drdynvc->rdpcontext)
15311537
setChannelError(drdynvc->rdpcontext, error, "drdynvc_virtual_channel_init_event reported an error");
15321538

1539+
return error;
15331540
}
15341541

15351542
/**

0 commit comments

Comments
 (0)