ntdll: Use malloc() to allocate the system processor information.

Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Alexandre Julliard 2020-07-14 10:35:14 +02:00
parent fe7b8d70d5
commit 242dc8989a
1 changed files with 14 additions and 17 deletions

View File

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