From 486caf55168a1de887d3f226e53515b06c503875 Mon Sep 17 00:00:00 2001 From: Armin Novak Date: Fri, 27 Feb 2026 12:39:55 +0100 Subject: [PATCH] [winpr] fix InitializeCriticalSectionAndSpinCount Check return values when used. --- libfreerdp/crypto/tls.c | 7 ++++++- winpr/libwinpr/synch/test/TestSynchCritical.c | 13 ++++++++++--- winpr/libwinpr/utils/collections/ArrayList.c | 3 ++- winpr/libwinpr/utils/collections/BufferPool.c | 5 ++++- winpr/libwinpr/utils/collections/HashTable.c | 3 ++- winpr/libwinpr/utils/collections/ObjectPool.c | 8 +++++++- winpr/libwinpr/utils/collections/StreamPool.c | 3 ++- winpr/libwinpr/utils/wlog/Appender.c | 6 +++++- winpr/libwinpr/utils/wlog/wlog.c | 3 ++- 9 files changed, 40 insertions(+), 11 deletions(-) diff --git a/libfreerdp/crypto/tls.c b/libfreerdp/crypto/tls.c index 3a87ece28..2662c04d8 100644 --- a/libfreerdp/crypto/tls.c +++ b/libfreerdp/crypto/tls.c @@ -495,7 +495,12 @@ static int bio_rdp_tls_new(BIO* bio) if (!(tls = calloc(1, sizeof(BIO_RDP_TLS)))) return 0; - InitializeCriticalSectionAndSpinCount(&tls->lock, 4000); + if (!InitializeCriticalSectionAndSpinCount(&tls->lock, 4000)) + { + free(tls); + return -1; + } + BIO_set_data(bio, (void*)tls); return 1; } diff --git a/winpr/libwinpr/synch/test/TestSynchCritical.c b/winpr/libwinpr/synch/test/TestSynchCritical.c index 3d7fb9ab4..d644614a8 100644 --- a/winpr/libwinpr/synch/test/TestSynchCritical.c +++ b/winpr/libwinpr/synch/test/TestSynchCritical.c @@ -152,9 +152,15 @@ static DWORD WINAPI TestSynchCritical_Main(LPVOID arg) DeleteCriticalSection(&critical); if (dwSpinCount % 2 == 0) - InitializeCriticalSectionAndSpinCount(&critical, dwSpinCount); + { + if (!InitializeCriticalSectionAndSpinCount(&critical, dwSpinCount)) + goto fail; + } else - InitializeCriticalSectionEx(&critical, dwSpinCount, 0); + { + if (!InitializeCriticalSectionEx(&critical, dwSpinCount, 0)) + goto fail; + } } DeleteCriticalSection(&critical); @@ -229,7 +235,8 @@ static DWORD WINAPI TestSynchCritical_Main(LPVOID arg) for (int j = 0; j < TEST_SYNC_CRITICAL_TEST1_RUNS; j++) { dwSpinCount = j * 100; - InitializeCriticalSectionAndSpinCount(&critical, dwSpinCount); + if (!InitializeCriticalSectionAndSpinCount(&critical, dwSpinCount)) + goto fail; gTestValueVulnerable = 0; gTestValueSerialized = 0; diff --git a/winpr/libwinpr/utils/collections/ArrayList.c b/winpr/libwinpr/utils/collections/ArrayList.c index 79d993ea4..a3e1e978e 100644 --- a/winpr/libwinpr/utils/collections/ArrayList.c +++ b/winpr/libwinpr/utils/collections/ArrayList.c @@ -591,7 +591,8 @@ wArrayList* ArrayList_New(BOOL synchronized) if (!ArrayList_EnsureCapacity(arrayList, 32)) goto fail; - InitializeCriticalSectionAndSpinCount(&arrayList->lock, 4000); + if (!InitializeCriticalSectionAndSpinCount(&arrayList->lock, 4000)) + goto fail; return arrayList; fail: WINPR_PRAGMA_DIAG_PUSH diff --git a/winpr/libwinpr/utils/collections/BufferPool.c b/winpr/libwinpr/utils/collections/BufferPool.c index 61dd01944..c0d1a8fa3 100644 --- a/winpr/libwinpr/utils/collections/BufferPool.c +++ b/winpr/libwinpr/utils/collections/BufferPool.c @@ -523,7 +523,10 @@ wBufferPool* BufferPool_New(BOOL synchronized, SSIZE_T fixedSize, DWORD alignmen pool->synchronized = synchronized; if (pool->synchronized) - InitializeCriticalSectionAndSpinCount(&pool->lock, 4000); + { + if (!InitializeCriticalSectionAndSpinCount(&pool->lock, 4000)) + goto out_error; + } if (pool->fixedSize) { diff --git a/winpr/libwinpr/utils/collections/HashTable.c b/winpr/libwinpr/utils/collections/HashTable.c index eab6f8437..49095773d 100644 --- a/winpr/libwinpr/utils/collections/HashTable.c +++ b/winpr/libwinpr/utils/collections/HashTable.c @@ -765,7 +765,8 @@ wHashTable* HashTable_New(BOOL synchronized) goto fail; table->synchronized = synchronized; - InitializeCriticalSectionAndSpinCount(&(table->lock), 4000); + if (!InitializeCriticalSectionAndSpinCount(&(table->lock), 4000)) + goto fail; table->numOfBuckets = 64; table->numOfElements = 0; table->bucketArray = (wKeyValuePair**)calloc(table->numOfBuckets, sizeof(wKeyValuePair*)); diff --git a/winpr/libwinpr/utils/collections/ObjectPool.c b/winpr/libwinpr/utils/collections/ObjectPool.c index b2a6fa7af..2444f1794 100644 --- a/winpr/libwinpr/utils/collections/ObjectPool.c +++ b/winpr/libwinpr/utils/collections/ObjectPool.c @@ -168,7 +168,13 @@ wObjectPool* ObjectPool_New(BOOL synchronized) pool->synchronized = synchronized; if (pool->synchronized) - InitializeCriticalSectionAndSpinCount(&pool->lock, 4000); + { + if (!InitializeCriticalSectionAndSpinCount(&pool->lock, 4000)) + { + free(pool); + return nullptr; + } + } } return pool; diff --git a/winpr/libwinpr/utils/collections/StreamPool.c b/winpr/libwinpr/utils/collections/StreamPool.c index b9533deda..36b1c6340 100644 --- a/winpr/libwinpr/utils/collections/StreamPool.c +++ b/winpr/libwinpr/utils/collections/StreamPool.c @@ -414,7 +414,8 @@ wStreamPool* StreamPool_New(BOOL synchronized, size_t defaultSize) if (!StreamPool_EnsureCapacity(pool, 32, TRUE)) goto fail; - InitializeCriticalSectionAndSpinCount(&pool->lock, 4000); + if (!InitializeCriticalSectionAndSpinCount(&pool->lock, 4000)) + goto fail; } return pool; diff --git a/winpr/libwinpr/utils/wlog/Appender.c b/winpr/libwinpr/utils/wlog/Appender.c index 8c463e150..d4f1cb40c 100644 --- a/winpr/libwinpr/utils/wlog/Appender.c +++ b/winpr/libwinpr/utils/wlog/Appender.c @@ -144,7 +144,11 @@ static wLogAppender* WLog_Appender_New(wLog* log, DWORD logAppenderType) return nullptr; } - InitializeCriticalSectionAndSpinCount(&appender->lock, 4000); + if (!InitializeCriticalSectionAndSpinCount(&appender->lock, 4000)) + { + WLog_Appender_Free(log, appender); + return nullptr; + } return appender; } diff --git a/winpr/libwinpr/utils/wlog/wlog.c b/winpr/libwinpr/utils/wlog/wlog.c index e8c4be0d1..1e0cb0a79 100644 --- a/winpr/libwinpr/utils/wlog/wlog.c +++ b/winpr/libwinpr/utils/wlog/wlog.c @@ -921,7 +921,8 @@ wLog* WLog_New(LPCSTR name, wLog* rootLogger) goto out_fail; } - InitializeCriticalSectionAndSpinCount(&log->lock, 4000); + if (!InitializeCriticalSectionAndSpinCount(&log->lock, 4000)) + goto out_fail; return log; out_fail: