[core,settings] fix ReceivedCapabilities reset

This commit is contained in:
akallabeth
2025-08-26 10:44:13 +02:00
parent 0f9d44efed
commit 83ffa524e9
3 changed files with 17 additions and 7 deletions

View File

@@ -897,7 +897,7 @@ BOOL freerdp_capability_buffer_resize(rdpSettings* settings, size_t count, BOOL
return TRUE;
}
const size_t oldsize = force ? 0 : settings->ReceivedCapabilitiesSize;
const size_t oldsize = settings->ReceivedCapabilitiesSize;
if (!resize_setting(settings, FreeRDP_ReceivedCapabilityDataSizes, oldsize, count,
sizeof(uint32_t)))
return FALSE;

View File

@@ -1289,6 +1289,14 @@ static void freerdp_settings_free_internal(rdpSettings* settings)
freerdp_settings_free_keys(settings, TRUE);
}
static void freerdp_settings_free_internal_ensure_reset(rdpSettings* settings)
{
settings->ServerLicenseProductIssuersCount = 0;
settings->ServerLicenseProductIssuers = NULL;
settings->ReceivedCapabilitiesSize = 0;
}
void freerdp_settings_free(rdpSettings* settings)
{
if (!settings)
@@ -1511,15 +1519,13 @@ BOOL freerdp_settings_copy(rdpSettings* _settings, const rdpSettings* settings)
/* This is required to free all non string buffers */
freerdp_settings_free_internal(_settings);
/* This copies everything except allocated non string buffers. reset all allocated buffers to
* NULL to fix issues during cleanup */
rc = freerdp_settings_clone_keys(_settings, settings);
_settings->ServerLicenseProductIssuersCount = 0;
_settings->ServerLicenseProductIssuers = NULL;
if (!rc)
goto out_fail;
freerdp_settings_free_internal_ensure_reset(_settings);
/* Begin copying */
if (!freerdp_settings_int_buffer_copy(_settings, settings))

View File

@@ -273,7 +273,7 @@ static BOOL update_write_bitmap_update(rdpUpdate* update, wStream* s,
if (!Stream_EnsureRemainingCapacity(s, 32))
return FALSE;
Stream_Write_UINT16(s, UPDATE_TYPE_BITMAP); /* updateType */
Stream_Write_UINT16(s, UPDATE_TYPE_BITMAP); /* updateType */
Stream_Write_UINT16(s, WINPR_ASSERTING_INT_CAST(
uint16_t, bitmapUpdate->number)); /* numberRectangles (2 bytes) */
@@ -1471,6 +1471,8 @@ static BOOL update_send_frame_acknowledge(rdpContext* context, UINT32 frameId)
WINPR_ASSERT(rdp);
WINPR_ASSERT(rdp->settings);
WINPR_ASSERT(rdp->settings->ReceivedCapabilities);
WINPR_ASSERT(rdp->settings->ReceivedCapabilitiesSize > CAPSET_TYPE_FRAME_ACKNOWLEDGE);
if (rdp->settings->ReceivedCapabilities[CAPSET_TYPE_FRAME_ACKNOWLEDGE])
{
UINT16 sec_flags = 0;
@@ -1554,6 +1556,8 @@ static BOOL update_send_play_sound(rdpContext* context, const PLAY_SOUND_UPDATE*
WINPR_ASSERT(rdp);
WINPR_ASSERT(rdp->settings);
WINPR_ASSERT(play_sound);
WINPR_ASSERT(rdp->settings->ReceivedCapabilities);
WINPR_ASSERT(rdp->settings->ReceivedCapabilitiesSize > CAPSET_TYPE_SOUND);
if (!rdp->settings->ReceivedCapabilities[CAPSET_TYPE_SOUND])
{
return TRUE;
@@ -2826,7 +2830,7 @@ static BOOL update_send_window_icon(rdpContext* context, const WINDOW_ORDER_INFO
s, WINPR_ASSERTING_INT_CAST(uint16_t, iconInfo->cbBitsMask)); /* CbBitsMask (2 bytes) */
Stream_Write_UINT16(
s, WINPR_ASSERTING_INT_CAST(uint16_t, iconInfo->cbBitsColor)); /* CbBitsColor (2 bytes) */
Stream_Write(s, iconInfo->bitsMask, iconInfo->cbBitsMask); /* BitsMask (variable) */
Stream_Write(s, iconInfo->bitsMask, iconInfo->cbBitsMask); /* BitsMask (variable) */
if (iconInfo->bpp <= 8)
{