Merge pull request #11814 from akallabeth/caps-leak-fix

[core,settings] fix ReceivedCapabilities reset
This commit is contained in:
akallabeth
2025-08-26 14:21:00 +02:00
committed by GitHub
7 changed files with 39 additions and 8 deletions

View File

@@ -58,7 +58,8 @@ jobs:
openh264 \
alsa-lib \
cairo \
ocl-icd
ocl-icd \
security/heimdal
run: |
export LD_LIBRARY_PATH=/usr/lib/clang/18/lib/freebsd

View File

@@ -53,3 +53,4 @@ set(CHANNEL_RDPEAR_CLIENT ON CACHE BOOL "qa default")
set(CHANNEL_GFXREDIR ON CACHE BOOL "qa default")
set(CHANNEL_RDP2TCP ON CACHE BOOL "qa default")
set(CHANNEL_SSHAGENT ON CACHE BOOL "qa default")
set(KRB5_ROOT_FLAVOUR "Heimdal" CACHE STRING "qa default")

View File

@@ -19,6 +19,12 @@ include(CheckIncludeFile)
include(CheckIncludeFiles)
include(CheckTypeSize)
set(KRB5_ROOT_CONFIG "${KRB5_ROOT_CONFIG}" CACHE STRING
"Force kerberos implementation by setting full path to krb5-config"
)
set(KRB5_ROOT_FLAVOUR "${KRB5_ROOT_FLAVOUR}"
CACHE STRING "Force kerberos implementation by setting [mit|Heimdal]. Empty for default"
)
set(_KRB5_REQUIRED_VARS KRB5_FOUND KRB5_VERSION KRB5_FLAVOUR KRB5_INCLUDE_DIRS KRB5_LIBRARIES)
macro(PROVIDES_KRB5)

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)
{

View File

@@ -1335,6 +1335,16 @@ static BOOL retrieveSomeTgt(KRB_CREDENTIALS* credentials, const char* target, kr
if (rv)
return FALSE;
#if defined(WITH_KRB5_HEIMDAL)
if (!target_princ->realm)
{
rv = krb_log_exec(krb5_get_default_realm, credentials->ctx, &default_realm);
if (rv)
goto out;
target_princ->realm = default_realm;
}
#else
if (!target_princ->realm.length)
{
rv = krb_log_exec(krb5_get_default_realm, credentials->ctx, &default_realm);
@@ -1344,6 +1354,7 @@ static BOOL retrieveSomeTgt(KRB_CREDENTIALS* credentials, const char* target, kr
target_princ->realm.data = default_realm;
target_princ->realm.length = (unsigned int)strlen(default_realm);
}
#endif
/*
* First try with the account service. We were requested with something like
@@ -1356,6 +1367,7 @@ static BOOL retrieveSomeTgt(KRB_CREDENTIALS* credentials, const char* target, kr
ret = FALSE;
#if defined(WITH_KRB5_MIT)
/*
* if it's not working let's try with <host>$@<REALM> (note the dollar)
*/
@@ -1372,6 +1384,7 @@ static BOOL retrieveSomeTgt(KRB_CREDENTIALS* credentials, const char* target, kr
return FALSE;
ret = retrieveTgtForPrincipal(credentials, target_princ, creds);
#endif
out:
if (default_realm)