Bug 1470932 - Get principal from nsGlobalWindowInner directly in MediaManaager::IsActivelyCapturingOrHasAPermission(). r?jib draft
authorChris Pearce <cpearce@mozilla.com>
Wed, 04 Jul 2018 12:53:18 +1200
changeset 813892 65b004eda9db7133ae165744604f5d5bc93a1199
parent 813890 16e3ee6b12e9e67913b98b8a38614a3e820e780d
push id115040
push userbmo:cpearce@mozilla.com
push dateWed, 04 Jul 2018 02:24:28 +0000
reviewersjib
bugs1470932
milestone63.0a1
Bug 1470932 - Get principal from nsGlobalWindowInner directly in MediaManaager::IsActivelyCapturingOrHasAPermission(). r?jib nsGlobalWindowInner::GetExtantDoc() can potentially return null, and we're not null checking its return value in MediaManaager::IsActivelyCapturingOrHasAPermission() which I think is the cause of this crash. So instead of getting the principal from the window's extant doc, we can get the principal directly from the nsGlobalWindowInner. MozReview-Commit-ID: BUwiJGLss2a
dom/media/MediaManager.cpp
--- a/dom/media/MediaManager.cpp
+++ b/dom/media/MediaManager.cpp
@@ -3928,31 +3928,31 @@ MediaManager::IsActivelyCapturingOrHasAP
     if (win && win->WindowID() == aWindowId) {
       return true;
     }
   }
 
   // Or are persistent permissions (audio or video) granted?
 
   auto* window = nsGlobalWindowInner::GetInnerWindowWithId(aWindowId);
-  if (NS_WARN_IF(!window)) {
+  if (NS_WARN_IF(!window) || NS_WARN_IF(!window->GetPrincipal())) {
     return false;
   }
   // Check if this site has persistent permissions.
   nsresult rv;
   nsCOMPtr<nsIPermissionManager> mgr =
     do_GetService(NS_PERMISSIONMANAGER_CONTRACTID, &rv);
   if (NS_WARN_IF(NS_FAILED(rv))) {
     return false; // no permission manager no permissions!
   }
 
   uint32_t audio = nsIPermissionManager::UNKNOWN_ACTION;
   uint32_t video = nsIPermissionManager::UNKNOWN_ACTION;
   {
-    auto* principal = window->GetExtantDoc()->NodePrincipal();
+    auto* principal = window->GetPrincipal();
     rv = mgr->TestExactPermissionFromPrincipal(principal, "microphone", &audio);
     if (NS_WARN_IF(NS_FAILED(rv))) {
       return false;
     }
     rv = mgr->TestExactPermissionFromPrincipal(principal, "camera", &video);
     if (NS_WARN_IF(NS_FAILED(rv))) {
       return false;
     }