PSAPI #5: Check buffer size in GetProcessMemoryInfo
Felix Nawothnig
felix.nawothnig at t-online.de
Thu Jul 7 19:21:10 CDT 2005
Also changed the formatting of the function to fit the rest of my code
in there... hope you don't mind.
ChangeLog:
Make GetProcessMemoryInfo fail if the passed buffer is too small.
-------------- next part --------------
Index: dlls/psapi/psapi_main.c
===================================================================
RCS file: /home/wine/wine/dlls/psapi/psapi_main.c,v
retrieving revision 1.26
diff -u -r1.26 psapi_main.c
--- dlls/psapi/psapi_main.c 25 Jun 2005 17:56:56 -0000 1.26
+++ dlls/psapi/psapi_main.c 8 Jul 2005 00:19:43 -0000
@@ -516,33 +516,37 @@
* Retrieve memory usage information for a given process
*
*/
-BOOL WINAPI GetProcessMemoryInfo( HANDLE process, PPROCESS_MEMORY_COUNTERS counters, DWORD size )
+BOOL WINAPI GetProcessMemoryInfo(HANDLE hProcess,
+ PPROCESS_MEMORY_COUNTERS pmc, DWORD cb)
{
NTSTATUS status;
VM_COUNTERS vmc;
- TRACE( "(%p, %p, %ld)\n", process, counters, size );
+ if (cb < sizeof(PROCESS_MEMORY_COUNTERS))
+ {
+ SetLastError(ERROR_INSUFFICIENT_BUFFER);
+ return FALSE;
+ }
- status = NtQueryInformationProcess( process, ProcessVmCounters, &vmc, sizeof(vmc), NULL );
+ status = NtQueryInformationProcess(hProcess, ProcessVmCounters,
+ &vmc, sizeof(vmc), NULL);
if (status)
{
- SetLastError( RtlNtStatusToDosError( status ) );
+ SetLastError(RtlNtStatusToDosError(status));
return FALSE;
}
- /* FIXME: check size */
-
- counters->cb = sizeof(PROCESS_MEMORY_COUNTERS);
- counters->PageFaultCount = vmc.PageFaultCount;
- counters->PeakWorkingSetSize = vmc.PeakWorkingSetSize;
- counters->WorkingSetSize = vmc.WorkingSetSize;
- counters->QuotaPeakPagedPoolUsage = vmc.QuotaPeakPagedPoolUsage;
- counters->QuotaPagedPoolUsage = vmc.QuotaPagedPoolUsage;
- counters->QuotaPeakNonPagedPoolUsage = vmc.QuotaPeakNonPagedPoolUsage;
- counters->QuotaNonPagedPoolUsage = vmc.QuotaNonPagedPoolUsage;
- counters->PagefileUsage = vmc.PagefileUsage;
- counters->PeakPagefileUsage = vmc.PeakPagefileUsage;
+ pmc->cb = sizeof(PROCESS_MEMORY_COUNTERS);
+ pmc->PageFaultCount = vmc.PageFaultCount;
+ pmc->PeakWorkingSetSize = vmc.PeakWorkingSetSize;
+ pmc->WorkingSetSize = vmc.WorkingSetSize;
+ pmc->QuotaPeakPagedPoolUsage = vmc.QuotaPeakPagedPoolUsage;
+ pmc->QuotaPagedPoolUsage = vmc.QuotaPagedPoolUsage;
+ pmc->QuotaPeakNonPagedPoolUsage = vmc.QuotaPeakNonPagedPoolUsage;
+ pmc->QuotaNonPagedPoolUsage = vmc.QuotaNonPagedPoolUsage;
+ pmc->PagefileUsage = vmc.PagefileUsage;
+ pmc->PeakPagefileUsage = vmc.PeakPagefileUsage;
return TRUE;
}
Index: dlls/psapi/tests/psapi_main.c
===================================================================
RCS file: /home/wine/wine/dlls/psapi/tests/psapi_main.c,v
retrieving revision 1.2
diff -u -r1.2 psapi_main.c
--- dlls/psapi/tests/psapi_main.c 6 Jul 2005 15:46:47 -0000 1.2
+++ dlls/psapi/tests/psapi_main.c 8 Jul 2005 00:19:44 -0000
@@ -135,7 +135,7 @@
w32_err(pGetProcessMemoryInfo(NULL, &pmc, sizeof(pmc)), ERROR_INVALID_HANDLE);
todo_wine w32_err(pGetProcessMemoryInfo(hpSR, &pmc, sizeof(pmc)), ERROR_ACCESS_DENIED);
- todo_wine w32_err(pGetProcessMemoryInfo(hpQI, &pmc, sizeof(pmc)-1), ERROR_INSUFFICIENT_BUFFER);
+ w32_err(pGetProcessMemoryInfo(hpQI, &pmc, sizeof(pmc)-1), ERROR_INSUFFICIENT_BUFFER);
w32_suc(pGetProcessMemoryInfo(hpQI, &pmc, sizeof(pmc)));
}
More information about the wine-patches
mailing list