Merge pull request #11910 from akallabeth/retry-fix

[client,common] improve retry handling
This commit is contained in:
akallabeth
2025-10-01 09:51:51 +02:00
committed by GitHub
2 changed files with 19 additions and 3 deletions

View File

@@ -1340,12 +1340,14 @@ BOOL client_auto_reconnect_ex(freerdp* instance, BOOL (*window_events)(freerdp*
WLog_INFO(TAG, "Network disconnect!");
break;
default:
WLog_DBG(TAG, "Other error: %s", freerdp_get_error_info_string(error));
return FALSE;
}
if (!freerdp_settings_get_bool(settings, FreeRDP_AutoReconnectionEnabled))
{
/* No auto-reconnect - just quit */
WLog_DBG(TAG, "AutoReconnect not enabled, quitting.");
return FALSE;
}
@@ -1364,13 +1366,15 @@ BOOL client_auto_reconnect_ex(freerdp* instance, BOOL (*window_events)(freerdp*
/* Quit retrying if max retries has been exceeded */
if ((maxRetries > 0) && (numRetries++ >= maxRetries))
{
WLog_DBG(TAG, "AutoReconnect retries exceeded.");
return FALSE;
}
/* Attempt the next reconnect */
WLog_INFO(TAG, "Attempting reconnect (%" PRIu32 " of %" PRIu32 ")", numRetries, maxRetries);
IFCALL(instance->RetryDialog, instance, "connection", numRetries, NULL);
const SSIZE_T delay =
IFCALLRESULT(5000, instance->RetryDialog, instance, "connection", numRetries, NULL);
if (freerdp_reconnect(instance))
return TRUE;
@@ -1383,10 +1387,13 @@ BOOL client_auto_reconnect_ex(freerdp* instance, BOOL (*window_events)(freerdp*
default:
break;
}
for (UINT32 x = 0; x < 50; x++)
for (UINT32 x = 0; x < delay / 10; x++)
{
if (!IFCALLRESULT(TRUE, window_events, instance))
{
WLog_ERR(TAG, "window_events failed!");
return FALSE;
}
Sleep(10);
}

View File

@@ -4,6 +4,7 @@
#include <winpr/crypto.h>
#include <winpr/json.h>
#include <freerdp/crypto/crypto.h>
#include <freerdp/settings.h>
#include <freerdp/codecs.h>
@@ -1669,7 +1670,15 @@ static BOOL fill_random(rdpSettings* src, FreeRDP_Settings_Keys_Pointer key, siz
uint8_t* data = freerdp_settings_get_pointer_writable(src, key);
if (!data)
return FALSE;
winpr_RAND(data, len * elem);
const size_t size = len * elem;
char* random = calloc(len, elem);
if (!random)
return FALSE;
char* b64 = crypto_base64_encode(random, size);
free(random);
memcpy(data, b64, size);
free(b64);
return TRUE;
}