diff --git a/libfreerdp/common/settings.c b/libfreerdp/common/settings.c index 795fa9fc0..74dbf3e9d 100644 --- a/libfreerdp/common/settings.c +++ b/libfreerdp/common/settings.c @@ -878,13 +878,16 @@ static BOOL resize_setting(rdpSettings* settings, FreeRDP_Settings_Keys_Pointer return freerdp_settings_set_pointer(settings, id, ptr); } -BOOL freerdp_capability_buffer_resize(rdpSettings* settings, size_t count) +BOOL freerdp_capability_buffer_resize(rdpSettings* settings, size_t count, BOOL force) { WINPR_ASSERT(settings); const uint32_t len = settings->ReceivedCapabilitiesSize; - if (len == count) - return TRUE; + if (!force) + { + if (len == count) + return TRUE; + } freerdp_capability_data_free(settings, count, FALSE); @@ -894,7 +897,7 @@ BOOL freerdp_capability_buffer_resize(rdpSettings* settings, size_t count) return TRUE; } - const size_t oldsize = settings->ReceivedCapabilitiesSize; + const size_t oldsize = force ? 0 : settings->ReceivedCapabilitiesSize; if (!resize_setting(settings, FreeRDP_ReceivedCapabilityDataSizes, oldsize, count, sizeof(uint32_t))) return FALSE; @@ -915,7 +918,7 @@ BOOL freerdp_capability_buffer_copy(rdpSettings* settings, const rdpSettings* sr if (src->ReceivedCapabilitiesSize == 0) return TRUE; - if (!freerdp_capability_buffer_resize(settings, src->ReceivedCapabilitiesSize)) + if (!freerdp_capability_buffer_resize(settings, src->ReceivedCapabilitiesSize, TRUE)) return FALSE; for (UINT32 x = 0; x < src->ReceivedCapabilitiesSize; x++) @@ -1576,7 +1579,7 @@ BOOL freerdp_settings_set_pointer_len(rdpSettings* settings, FreeRDP_Settings_Ke return freerdp_settings_set_pointer_len_(settings, id, FreeRDP_DynamicChannelArraySize, data, len, sizeof(ADDIN_ARGV*)); case FreeRDP_ReceivedCapabilityData: - if (!freerdp_capability_buffer_resize(settings, len)) + if (!freerdp_capability_buffer_resize(settings, len, FALSE)) return FALSE; if (data == NULL) { @@ -1584,7 +1587,7 @@ BOOL freerdp_settings_set_pointer_len(rdpSettings* settings, FreeRDP_Settings_Ke } return TRUE; case FreeRDP_ReceivedCapabilities: - if (!freerdp_capability_buffer_resize(settings, len)) + if (!freerdp_capability_buffer_resize(settings, len, FALSE)) return FALSE; if (data == NULL) { @@ -1603,7 +1606,7 @@ BOOL freerdp_settings_set_pointer_len(rdpSettings* settings, FreeRDP_Settings_Ke sizeof(UINT32)); case FreeRDP_ReceivedCapabilityDataSizes: - if (!freerdp_capability_buffer_resize(settings, len)) + if (!freerdp_capability_buffer_resize(settings, len, FALSE)) return FALSE; if (data == NULL) { diff --git a/libfreerdp/common/settings_getters.c b/libfreerdp/common/settings_getters.c index 90c4996cb..6256f259c 100644 --- a/libfreerdp/common/settings_getters.c +++ b/libfreerdp/common/settings_getters.c @@ -2373,7 +2373,7 @@ BOOL freerdp_settings_set_uint32(WINPR_ATTR_UNUSED rdpSettings* settings, break; case FreeRDP_ReceivedCapabilitiesSize: - return freerdp_capability_buffer_resize(settings, cnv.c); + return freerdp_capability_buffer_resize(settings, cnv.c, FALSE); case FreeRDP_RedirectedSessionId: settings->RedirectedSessionId = cnv.c; diff --git a/libfreerdp/core/settings.c b/libfreerdp/core/settings.c index fa9cf05fa..ceae4f9e7 100644 --- a/libfreerdp/core/settings.c +++ b/libfreerdp/core/settings.c @@ -980,7 +980,7 @@ rdpSettings* freerdp_settings_new(DWORD flags) if (!freerdp_settings_set_pointer_len(settings, FreeRDP_RdpServerCertificate, NULL, 1)) goto out_fail; - if (!freerdp_capability_buffer_resize(settings, 32)) + if (!freerdp_capability_buffer_resize(settings, 32, FALSE)) goto out_fail; { diff --git a/libfreerdp/core/settings.h b/libfreerdp/core/settings.h index 841b5805f..7828f01dc 100644 --- a/libfreerdp/core/settings.h +++ b/libfreerdp/core/settings.h @@ -48,7 +48,8 @@ FREERDP_LOCAL BOOL freerdp_settings_set_string_(rdpSettings* settings, FREERDP_LOCAL BOOL freerdp_settings_set_string_copy_(rdpSettings* settings, FreeRDP_Settings_Keys_String id, const char* val, size_t len, BOOL cleanup); -FREERDP_LOCAL BOOL freerdp_capability_buffer_resize(rdpSettings* settings, size_t count); +FREERDP_LOCAL BOOL freerdp_capability_buffer_resize(rdpSettings* settings, size_t count, + BOOL force); FREERDP_LOCAL BOOL identity_set_from_settings_with_pwd(SEC_WINNT_AUTH_IDENTITY_W* identity, const rdpSettings* settings,