diff --git a/dlls/ntdll/unix/system.c b/dlls/ntdll/unix/system.c index eedd67fba12..835cf8d1349 100644 --- a/dlls/ntdll/unix/system.c +++ b/dlls/ntdll/unix/system.c @@ -2182,6 +2182,11 @@ NTSTATUS WINAPI NtQuerySystemInformation( SYSTEM_INFORMATION_CLASS class, ret = STATUS_INFO_LENGTH_MISMATCH; break; } + if (!(sppi = calloc( out_cpus, sizeof(*sppi) ))) + { + ret = STATUS_NO_MEMORY; + break; + } else #ifdef __APPLE__ { @@ -2196,8 +2201,6 @@ NTSTATUS WINAPI NtQuerySystemInformation( SYSTEM_INFORMATION_CLASS class, { int i; cpus = min(cpus,out_cpus); - len = sizeof(SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION) * cpus; - sppi = RtlAllocateHeap(GetProcessHeap(), HEAP_ZERO_MEMORY, len); for (i = 0; i < cpus; i++) { sppi[i].IdleTime.QuadPart = pinfo[i].cpu_ticks[CPU_STATE_IDLE]; @@ -2214,7 +2217,7 @@ NTSTATUS WINAPI NtQuerySystemInformation( SYSTEM_INFORMATION_CLASS class, { unsigned long clk_tck = sysconf(_SC_CLK_TCK); unsigned long usr,nice,sys,idle,remainder[8]; - int i, count; + int i, count, id; char name[32]; char line[255]; @@ -2230,17 +2233,12 @@ NTSTATUS WINAPI NtQuerySystemInformation( SYSTEM_INFORMATION_CLASS class, for (i = 0; i + 5 < count; ++i) sys += remainder[i]; sys += idle; usr += nice; - cpus = atoi( name + 3 ) + 1; - if (cpus > out_cpus) break; - len = sizeof(SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION) * cpus; - if (sppi) - sppi = RtlReAllocateHeap( GetProcessHeap(), HEAP_ZERO_MEMORY, sppi, len ); - else - sppi = RtlAllocateHeap( GetProcessHeap(), HEAP_ZERO_MEMORY, len ); - - sppi[cpus-1].IdleTime.QuadPart = (ULONGLONG)idle * 10000000 / clk_tck; - sppi[cpus-1].KernelTime.QuadPart = (ULONGLONG)sys * 10000000 / clk_tck; - sppi[cpus-1].UserTime.QuadPart = (ULONGLONG)usr * 10000000 / clk_tck; + id = atoi( name + 3 ) + 1; + if (id > out_cpus) break; + if (id > cpus) cpus = id; + sppi[id-1].IdleTime.QuadPart = (ULONGLONG)idle * 10000000 / clk_tck; + sppi[id-1].KernelTime.QuadPart = (ULONGLONG)sys * 10000000 / clk_tck; + sppi[id-1].UserTime.QuadPart = (ULONGLONG)usr * 10000000 / clk_tck; } fclose(cpuinfo); } @@ -2251,8 +2249,6 @@ NTSTATUS WINAPI NtQuerySystemInformation( SYSTEM_INFORMATION_CLASS class, static int i = 1; unsigned int n; cpus = min(NtCurrentTeb()->Peb->NumberOfProcessors, out_cpus); - len = sizeof(SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION) * cpus; - sppi = RtlAllocateHeap(GetProcessHeap(), HEAP_ZERO_MEMORY, len); FIXME("stub info_class SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION\n"); /* many programs expect these values to change so fake change */ for (n = 0; n < cpus; n++) @@ -2264,6 +2260,7 @@ NTSTATUS WINAPI NtQuerySystemInformation( SYSTEM_INFORMATION_CLASS class, i++; } + len = sizeof(*sppi) * cpus; if (size >= len) { if (!info) ret = STATUS_ACCESS_VIOLATION; @@ -2271,7 +2268,7 @@ NTSTATUS WINAPI NtQuerySystemInformation( SYSTEM_INFORMATION_CLASS class, } else ret = STATUS_INFO_LENGTH_MISMATCH; - RtlFreeHeap(GetProcessHeap(),0,sppi); + free( sppi ); break; }