Fixed uninitialized DeviceArray

This commit is contained in:
akallabeth 2022-05-01 10:57:11 +02:00 committed by akallabeth
parent 0b752cbfce
commit 575dbf523f
2 changed files with 21 additions and 12 deletions

View File

@ -180,7 +180,7 @@ static BOOL freerdp_client_add_drive(rdpSettings* settings, const char* path, co
}
free(dname);
if (!device)
return FALSE;
goto fail;
if (!path)
goto fail;

View File

@ -207,16 +207,17 @@ int freerdp_addin_replace_argument_value(ADDIN_ARGV* args, const char* previous,
BOOL freerdp_device_collection_add(rdpSettings* settings, RDPDR_DEVICE* device)
{
UINT32 count;
UINT32 count, old;
WINPR_ASSERT(settings);
WINPR_ASSERT(device);
count = settings->DeviceCount + 1;
if (freerdp_settings_get_uint32(settings, FreeRDP_DeviceArraySize) < count)
count = freerdp_settings_get_uint32(settings, FreeRDP_DeviceCount) + 1;
old = freerdp_settings_get_uint32(settings, FreeRDP_DeviceArraySize);
if (old < count)
{
UINT32 new_size;
UINT32 new_size = old * 2;
RDPDR_DEVICE** new_array;
new_size = freerdp_settings_get_uint32(settings, FreeRDP_DeviceArraySize) * 2;
if (new_size == 0)
new_size = count * 2;
@ -227,6 +228,8 @@ BOOL freerdp_device_collection_add(rdpSettings* settings, RDPDR_DEVICE* device)
return FALSE;
settings->DeviceArray = new_array;
memset(&settings->DeviceArray[old], 0, (new_size - old) * sizeof(RDPDR_DEVICE*));
if (!freerdp_settings_set_uint32(settings, FreeRDP_DeviceArraySize, new_size))
return FALSE;
}
@ -447,6 +450,10 @@ RDPDR_DEVICE* freerdp_device_clone(const RDPDR_DEVICE* device)
RDPDR_PARALLEL* parallel;
RDPDR_SMARTCARD* smartcard;
} copy;
if (!device)
return NULL;
const char* args[] = { device->Name };
WINPR_ASSERT(device);
@ -539,16 +546,17 @@ void freerdp_device_collection_free(rdpSettings* settings)
WINPR_ASSERT(settings);
for (index = 0; index < settings->DeviceCount; index++)
if (settings->DeviceArray)
{
RDPDR_DEVICE* device = (RDPDR_DEVICE*)settings->DeviceArray[index];
freerdp_device_free(device);
for (index = 0; index < settings->DeviceArraySize; index++)
freerdp_settings_set_pointer_array(settings, FreeRDP_DeviceArray, index, NULL);
}
free(settings->DeviceArray);
freerdp_settings_set_pointer(settings, FreeRDP_DeviceArray, NULL);
freerdp_settings_set_uint32(settings, FreeRDP_DeviceArraySize, 0);
settings->DeviceArray = NULL;
settings->DeviceCount = 0;
freerdp_settings_set_uint32(settings, FreeRDP_DeviceCount, 0);
}
BOOL freerdp_static_channel_collection_del(rdpSettings* settings, const char* name)
@ -1393,10 +1401,11 @@ BOOL freerdp_settings_set_pointer_array(rdpSettings* settings, size_t id, size_t
{
case FreeRDP_DeviceArray:
maxOffset = freerdp_settings_get_uint32(settings, FreeRDP_DeviceArraySize);
if ((offset >= maxOffset) || !data)
if (offset >= maxOffset)
goto fail;
freerdp_device_free(settings->DeviceArray[offset]);
settings->DeviceArray[offset] = freerdp_device_clone(data);
return TRUE;
case FreeRDP_TargetNetAddresses:
maxOffset = freerdp_settings_get_uint32(settings, FreeRDP_TargetNetAddressCount);
if ((offset >= maxOffset) || !data)