Skip to content

Commit 9af5179

Browse files
Paul Gofmanrbernon
authored andcommitted
ntdll: Only allocate debug info with RTL_CRITICAL_SECTION_FLAG_FORCE_DEBUG_INFO in RtlInitializeCriticalSectionEx().
CW-Bug-Id: #23142
1 parent e0fbfa5 commit 9af5179

File tree

3 files changed

+26
-4
lines changed

3 files changed

+26
-4
lines changed

dlls/kernel32/tests/sync.c

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3099,7 +3099,7 @@ static void test_crit_section(void)
30993099
to override that. */
31003100
memset(&cs, 0, sizeof(cs));
31013101
InitializeCriticalSection(&cs);
3102-
ok(cs.DebugInfo != NULL, "Unexpected debug info pointer %p.\n", cs.DebugInfo);
3102+
todo_wine ok(cs.DebugInfo == (void *)(ULONG_PTR)-1, "Unexpected debug info pointer %p.\n", cs.DebugInfo);
31033103
DeleteCriticalSection(&cs);
31043104
ok(cs.DebugInfo == NULL, "Unexpected debug info pointer %p.\n", cs.DebugInfo);
31053105

@@ -3109,10 +3109,31 @@ static void test_crit_section(void)
31093109
return;
31103110
}
31113111

3112+
memset(&cs, 0, sizeof(cs));
3113+
ret = pInitializeCriticalSectionEx(&cs, 0, 0);
3114+
ok(ret, "Failed to initialize critical section.\n");
3115+
ok(cs.DebugInfo == (void *)(ULONG_PTR)-1, "Unexpected debug info pointer %p.\n", cs.DebugInfo);
3116+
DeleteCriticalSection(&cs);
3117+
todo_wine ok(cs.DebugInfo == NULL, "Unexpected debug info pointer %p.\n", cs.DebugInfo);
3118+
31123119
memset(&cs, 0, sizeof(cs));
31133120
ret = pInitializeCriticalSectionEx(&cs, 0, CRITICAL_SECTION_NO_DEBUG_INFO);
31143121
ok(ret, "Failed to initialize critical section.\n");
31153122
ok(cs.DebugInfo == (void *)(ULONG_PTR)-1, "Unexpected debug info pointer %p.\n", cs.DebugInfo);
3123+
DeleteCriticalSection(&cs);
3124+
todo_wine ok(cs.DebugInfo == NULL, "Unexpected debug info pointer %p.\n", cs.DebugInfo);
3125+
3126+
memset(&cs, 0, sizeof(cs));
3127+
ret = pInitializeCriticalSectionEx(&cs, 0, 0);
3128+
ok(ret, "Failed to initialize critical section.\n");
3129+
ok(cs.DebugInfo == (void *)(ULONG_PTR)-1, "Unexpected debug info pointer %p.\n", cs.DebugInfo);
3130+
DeleteCriticalSection(&cs);
3131+
todo_wine ok(cs.DebugInfo == NULL, "Unexpected debug info pointer %p.\n", cs.DebugInfo);
3132+
3133+
memset(&cs, 0, sizeof(cs));
3134+
ret = pInitializeCriticalSectionEx(&cs, 0, RTL_CRITICAL_SECTION_FLAG_FORCE_DEBUG_INFO);
3135+
ok(ret, "Failed to initialize critical section.\n");
3136+
ok(cs.DebugInfo && cs.DebugInfo != (void *)(ULONG_PTR)-1, "Unexpected debug info pointer %p.\n", cs.DebugInfo);
31163137

31173138
ret = TryEnterCriticalSection(&cs);
31183139
ok(ret, "Failed to enter critical section.\n");

dlls/ntdll/sync.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -206,7 +206,7 @@ static inline NTSTATUS wait_semaphore( RTL_CRITICAL_SECTION *crit, int timeout )
206206
*/
207207
NTSTATUS WINAPI RtlInitializeCriticalSection( RTL_CRITICAL_SECTION *crit )
208208
{
209-
return RtlInitializeCriticalSectionEx( crit, 0, 0 );
209+
return RtlInitializeCriticalSectionEx( crit, 0, RTL_CRITICAL_SECTION_FLAG_FORCE_DEBUG_INFO );
210210
}
211211

212212

@@ -215,7 +215,7 @@ NTSTATUS WINAPI RtlInitializeCriticalSection( RTL_CRITICAL_SECTION *crit )
215215
*/
216216
NTSTATUS WINAPI RtlInitializeCriticalSectionAndSpinCount( RTL_CRITICAL_SECTION *crit, ULONG spincount )
217217
{
218-
return RtlInitializeCriticalSectionEx( crit, spincount, 0 );
218+
return RtlInitializeCriticalSectionEx( crit, spincount, RTL_CRITICAL_SECTION_FLAG_FORCE_DEBUG_INFO );
219219
}
220220

221221

@@ -233,7 +233,7 @@ NTSTATUS WINAPI RtlInitializeCriticalSectionEx( RTL_CRITICAL_SECTION *crit, ULON
233233
* is done, then debug info should be managed through Rtlp[Allocate|Free]DebugInfo
234234
* so (e.g.) MakeCriticalSectionGlobal() doesn't free it using HeapFree().
235235
*/
236-
if (flags & RTL_CRITICAL_SECTION_FLAG_NO_DEBUG_INFO)
236+
if (!(flags & RTL_CRITICAL_SECTION_FLAG_FORCE_DEBUG_INFO))
237237
crit->DebugInfo = no_debug_info_marker;
238238
else
239239
{

include/winnt.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5693,6 +5693,7 @@ typedef struct _RTL_CRITICAL_SECTION {
56935693
#define RTL_CRITICAL_SECTION_FLAG_NO_DEBUG_INFO 0x1000000
56945694
#define RTL_CRITICAL_SECTION_FLAG_DYNAMIC_SPIN 0x2000000
56955695
#define RTL_CRITICAL_SECTION_FLAG_STATIC_INIT 0x4000000
5696+
#define RTL_CRITICAL_SECTION_FLAG_FORCE_DEBUG_INFO 0x10000000
56965697
#define RTL_CRITICAL_SECTION_ALL_FLAG_BITS 0xFF000000
56975698
#define RTL_CRITICAL_SECTION_FLAG_RESERVED (RTL_CRITICAL_SECTION_ALL_FLAG_BITS & ~0x7000000)
56985699

0 commit comments

Comments
 (0)