diff --git a/chrome/renderer/chrome_content_renderer_client.cc b/chrome/renderer/chrome_content_renderer_client.cc index abe1dbb4ec313..3e087e517fe86 100644 --- a/chrome/renderer/chrome_content_renderer_client.cc +++ b/chrome/renderer/chrome_content_renderer_client.cc @@ -1578,14 +1578,17 @@ bool ChromeContentRendererClient::IsSafeRedirectTarget( const std::optional& request_initiator) { #if BUILDFLAG(ENABLE_EXTENSIONS_CORE) if (target_url.SchemeIs(extensions::kExtensionScheme)) { - const extensions::Extension* extension = - extensions::RendererExtensionRegistry::Get()->GetExtensionOrAppByURL( - target_url, /*include_guid=*/true); + // Use a scoped_refptr to keep the extension alive, since this code can be + // executed on a worker thread. See https://crbug.com/443038597. + scoped_refptr extension = + extensions::RendererExtensionRegistry::Get() + ->GetRefCountedExtensionOrAppByURL(target_url, + /*include_guid=*/true); if (!extension) { return false; } if (extensions::WebAccessibleResourcesInfo::IsResourceWebAccessibleRedirect( - extension, target_url, request_initiator, upstream_url)) { + extension.get(), target_url, request_initiator, upstream_url)) { return true; } return extension->guid() == upstream_url.GetHost();