bug 1436914 - Stop reporting virtual memory size from CFG-enabled processes r?dmajor draft
authorChris H-C <chutten@mozilla.com>
Fri, 09 Mar 2018 14:13:27 -0500
changeset 765385 7dd4c502e607b67c6b755b6662684b26a6a50c39
parent 764977 55d91695f4bb951c224005155baef054a786c1f7
push id102061
push userbmo:chutten@mozilla.com
push dateFri, 09 Mar 2018 19:16:39 +0000
reviewersdmajor
bugs1436914
milestone60.0a1
bug 1436914 - Stop reporting virtual memory size from CFG-enabled processes r?dmajor If CFG is enabled, our Virtual Memory is ballooned by 2TB or so for Windows' indirect jump bitmap. This makes our vsize amounts rather unhelpful, so let's pretend the numbers aren't available. MozReview-Commit-ID: I4xj114mKPO
xpcom/base/nsMemoryReporterManager.cpp
xpcom/base/nsMemoryReporterManager.h
--- a/xpcom/base/nsMemoryReporterManager.cpp
+++ b/xpcom/base/nsMemoryReporterManager.cpp
@@ -34,16 +34,17 @@
 #include "mozilla/UniquePtrExtensions.h"
 #include "mozilla/dom/MemoryReportTypes.h"
 #include "mozilla/dom/ContentParent.h"
 #include "mozilla/gfx/GPUProcessManager.h"
 #include "mozilla/ipc/FileDescriptorUtils.h"
 
 #ifdef XP_WIN
 #include <process.h>
+#include <processthreadsapi.h>
 #ifndef getpid
 #define getpid _getpid
 #endif
 #else
 #include <unistd.h>
 #endif
 
 using namespace mozilla;
@@ -1510,16 +1511,25 @@ NS_IMPL_ISUPPORTS(DMDReporter, nsIMemory
 #endif  // MOZ_DMD
 
 /**
  ** nsMemoryReporterManager implementation
  **/
 
 NS_IMPL_ISUPPORTS(nsMemoryReporterManager, nsIMemoryReporterManager)
 
+#ifdef XP_WIN
+typedef BOOL (WINAPI *GetProcessMitigationPolicyFunc)(
+  HANDLE hProcess,
+  PROCESS_MITIGATION_POLICY MitigationPolicy,
+  PVOID lpBuffer,
+  SIZE_T dwLength
+);
+#endif // XP_WIN
+
 NS_IMETHODIMP
 nsMemoryReporterManager::Init()
 {
   if (!NS_IsMainThread()) {
     MOZ_CRASH();
   }
 
   // Under normal circumstances this function is only called once. However,
@@ -1617,17 +1627,32 @@ nsMemoryReporterManager::nsMemoryReporte
   , mSavedStrongReporters(nullptr)
   , mSavedWeakReporters(nullptr)
   , mNextGeneration(1)
   , mPendingProcessesState(nullptr)
   , mPendingReportersState(nullptr)
 #ifdef HAVE_JEMALLOC_STATS
   , mThreadPool(do_GetService(NS_STREAMTRANSPORTSERVICE_CONTRACTID))
 #endif
+  , mIsCFGEnabled(false)
 {
+#ifdef XP_WIN
+  HMODULE kernel32 = GetModuleHandleW(L"kernel32.dll");
+  FARPROC ptr = GetProcAddress(kernel32, "GetProcessMitigationPolicy");
+  if (ptr) {
+    auto GPMP_func = reinterpret_cast<GetProcessMitigationPolicyFunc>(ptr);
+    PROCESS_MITIGATION_CONTROL_FLOW_GUARD_POLICY pmcfgp;
+    if (GPMP_func(GetCurrentProcess(),
+                  ProcessControlFlowGuardPolicy,
+                  &pmcfgp,
+                  sizeof(pmcfgp))) {
+      mIsCFGEnabled = pmcfgp.EnableControlFlowGuard;
+    }
+  }
+#endif
 }
 
 nsMemoryReporterManager::~nsMemoryReporterManager()
 {
   delete mStrongReporters;
   delete mWeakReporters;
   NS_ASSERTION(!mSavedStrongReporters, "failed to restore strong reporters");
   NS_ASSERTION(!mSavedWeakReporters, "failed to restore weak reporters");
@@ -2272,27 +2297,35 @@ nsMemoryReporterManager::UnblockRegistra
   mIsRegistrationBlocked = false;
   return NS_OK;
 }
 
 NS_IMETHODIMP
 nsMemoryReporterManager::GetVsize(int64_t* aVsize)
 {
 #ifdef HAVE_VSIZE_AND_RESIDENT_REPORTERS
+  if (mIsCFGEnabled) {
+    aVsize = 0;
+    return NS_ERROR_NOT_AVAILABLE;
+  }
   return VsizeDistinguishedAmount(aVsize);
 #else
   *aVsize = 0;
   return NS_ERROR_NOT_AVAILABLE;
 #endif
 }
 
 NS_IMETHODIMP
 nsMemoryReporterManager::GetVsizeMaxContiguous(int64_t* aAmount)
 {
 #ifdef HAVE_VSIZE_MAX_CONTIGUOUS_REPORTER
+  if (mIsCFGEnabled) {
+    aAmount = 0;
+    return NS_ERROR_NOT_AVAILABLE;
+  }
   return VsizeMaxContiguousDistinguishedAmount(aAmount);
 #else
   *aAmount = 0;
   return NS_ERROR_NOT_AVAILABLE;
 #endif
 }
 
 NS_IMETHODIMP
--- a/xpcom/base/nsMemoryReporterManager.h
+++ b/xpcom/base/nsMemoryReporterManager.h
@@ -275,16 +275,18 @@ private:
   PendingProcessesState* mPendingProcessesState;
 
   // This is reinitialized each time a call to GetReports is initiated.
   PendingReportersState* mPendingReportersState;
 
   // Used in GetHeapAllocatedAsync() to run jemalloc_stats async.
   nsCOMPtr<nsIEventTarget> mThreadPool;
 
+  bool mIsCFGEnabled;
+
   PendingProcessesState* GetStateForGeneration(uint32_t aGeneration);
   static MOZ_MUST_USE bool
   StartChildReport(mozilla::MemoryReportingProcess* aChild,
                    const PendingProcessesState* aState);
 };
 
 #define NS_MEMORY_REPORTER_MANAGER_CID \
 { 0xfb97e4f5, 0x32dd, 0x497a, \