Index: perfdata.c =================================================================== --- perfdata.c (revision 39693) +++ perfdata.c (working copy) @@ -241,7 +241,8 @@ HeapFree(GetProcessHeap(), 0, pPerfDataOld); } pPerfDataOld = pPerfData; - pPerfData = (PPERFDATA)HeapAlloc(GetProcessHeap(), 0, sizeof(PERFDATA) * ProcessCount); + /* Clear out process perf data structures with HEAP_ZERO_MEMORY flag: */ + pPerfData = (PPERFDATA)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(PERFDATA) * ProcessCount); pSPI = (PSYSTEM_PROCESS_INFORMATION)pBuffer; for (Idx=0; IdxImageName.Buffer) - wcscpy(pPerfData[Idx].ImageName, pSPI->ImageName.Buffer); - else + if (pSPI->ImageName.Buffer) { + /* Don't assume a UNICODE_STRING Buffer is zero terminated: */ + int len = pSPI->ImageName.Length / 2; + /* Check against max size and allow for terminating zero (already zeroed): */ + if(len >= MAX_PATH)len=MAX_PATH - 1; + wcsncpy(pPerfData[Idx].ImageName, pSPI->ImageName.Buffer, len); + } else { LoadStringW(hInst, IDS_IDLE_PROCESS, pPerfData[Idx].ImageName, sizeof(pPerfData[Idx].ImageName) / sizeof(pPerfData[Idx].ImageName[0])); + } pPerfData[Idx].ProcessId = pSPI->UniqueProcessId;