From cca20ae131782ff5f1011c9ec7cac0e13924c287 Mon Sep 17 00:00:00 2001 From: Moonchild Date: Tue, 12 Aug 2025 17:01:36 +0200 Subject: [PATCH] Issue #2258 - Part 2: Move XCTO:nosniff check into sniffers. This fixes a regression for the JSON viewer from part 1 as it relies on sniffing to prettify (and should carve out the exception even if `nosniff` headers are sent). No real functional changes otherwise. Just catering to a corner case. --- image/imgLoader.cpp | 7 +++++++ netwerk/base/nsNetUtil.cpp | 10 ---------- netwerk/protocol/http/nsHttpChannel.cpp | 2 +- netwerk/streamconv/converters/nsUnknownDecoder.cpp | 8 +++++--- toolkit/components/mediasniffer/nsMediaSniffer.cpp | 4 ++++ 5 files changed, 17 insertions(+), 14 deletions(-) diff --git a/image/imgLoader.cpp b/image/imgLoader.cpp index d8e50cb2eb..f3e614d0a2 100644 --- a/image/imgLoader.cpp +++ b/image/imgLoader.cpp @@ -2489,6 +2489,13 @@ imgLoader::GetMIMETypeFromContent(nsIRequest* aRequest, uint32_t aLength, nsACString& aContentType) { + nsCOMPtr channel(do_QueryInterface(aRequest)); + if (channel) { + nsCOMPtr loadInfo = channel->GetLoadInfo(); + if (loadInfo->GetSkipContentSniffing()) { + return NS_ERROR_NOT_AVAILABLE; + } + } return GetMimeTypeFromContent((const char*)aContents, aLength, aContentType); } diff --git a/netwerk/base/nsNetUtil.cpp b/netwerk/base/nsNetUtil.cpp index d6db22098a..ce62cfa8fc 100644 --- a/netwerk/base/nsNetUtil.cpp +++ b/netwerk/base/nsNetUtil.cpp @@ -2129,16 +2129,6 @@ NS_SniffContent(const char *aSnifferType, nsIRequest *aRequest, const uint8_t *aData, uint32_t aLength, nsACString &aSniffedType) { - // In case XCTO nosniff was present, we could just skip sniffing here - nsCOMPtr channel = do_QueryInterface(aRequest); - if (channel) { - nsCOMPtr loadInfo = channel->GetLoadInfo(); - if (loadInfo->GetSkipContentSniffing()) { - aSniffedType.Truncate(); - return; - } - } - typedef nsCategoryCache ContentSnifferCache; extern ContentSnifferCache* gNetSniffers; extern ContentSnifferCache* gDataSniffers; diff --git a/netwerk/protocol/http/nsHttpChannel.cpp b/netwerk/protocol/http/nsHttpChannel.cpp index c28606982e..dba009ea30 100644 --- a/netwerk/protocol/http/nsHttpChannel.cpp +++ b/netwerk/protocol/http/nsHttpChannel.cpp @@ -1106,7 +1106,7 @@ ProcessXCTO(nsIURI* aURI, nsHttpResponseHead* aResponseHead, nsILoadInfo* aLoadI policyType == nsIContentPolicy::TYPE_SUBDOCUMENT) { // If the header XCTO nosniff is set for any browsing context, then // we set the skipContentSniffing flag on the Loadinfo. Within - // NS_SniffContent we then bail early and do not do any sniffing. + // GetMIMETypeFromContent we then bail early and do not do any sniffing. aLoadInfo->SetSkipContentSniffing(true); return NS_OK; } diff --git a/netwerk/streamconv/converters/nsUnknownDecoder.cpp b/netwerk/streamconv/converters/nsUnknownDecoder.cpp index f12f02b4f8..bab9b84c98 100644 --- a/netwerk/streamconv/converters/nsUnknownDecoder.cpp +++ b/netwerk/streamconv/converters/nsUnknownDecoder.cpp @@ -317,9 +317,11 @@ nsUnknownDecoder::GetMIMETypeFromContent(nsIRequest* aRequest, { // Note: This is only used by sniffer, therefore we do not need to lock anything here. nsCOMPtr channel(do_QueryInterface(aRequest)); - nsCOMPtr loadInfo = channel->GetLoadInfo(); - if (loadInfo->GetSkipContentSniffing()) { - return NS_OK; + if (channel) { + nsCOMPtr loadInfo = channel->GetLoadInfo(); + if (loadInfo->GetSkipContentSniffing()) { + return NS_ERROR_NOT_AVAILABLE; + } } mBuffer = const_cast(reinterpret_cast(aData)); mBufferLen = aLength; diff --git a/toolkit/components/mediasniffer/nsMediaSniffer.cpp b/toolkit/components/mediasniffer/nsMediaSniffer.cpp index d00dea894b..5c6fee065e 100644 --- a/toolkit/components/mediasniffer/nsMediaSniffer.cpp +++ b/toolkit/components/mediasniffer/nsMediaSniffer.cpp @@ -138,6 +138,10 @@ nsMediaSniffer::GetMIMETypeFromContent(nsIRequest* aRequest, nsACString& aSniffedType) { nsCOMPtr channel = do_QueryInterface(aRequest); if (channel) { + nsCOMPtr loadInfo = channel->GetLoadInfo(); + if (loadInfo->GetSkipContentSniffing()) { + return NS_ERROR_NOT_AVAILABLE; + } nsLoadFlags loadFlags = 0; channel->GetLoadFlags(&loadFlags); if (!(loadFlags & nsIChannel::LOAD_MEDIA_SNIFFER_OVERRIDES_CONTENT_TYPE)) {