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