Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(236)

Unified Diff: third_party/WebKit/Source/core/frame/SubresourceIntegrity.cpp

Issue 2614813004: Fix a crash of SRI when used with web workers (Closed)
Patch Set: fix Created 3 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: third_party/WebKit/Source/core/frame/SubresourceIntegrity.cpp
diff --git a/third_party/WebKit/Source/core/frame/SubresourceIntegrity.cpp b/third_party/WebKit/Source/core/frame/SubresourceIntegrity.cpp
index edf24cfb00ae47929a47691367eb62e4d634dc73..6000fdc3706517b89f15e02d465564cde804591f 100644
--- a/third_party/WebKit/Source/core/frame/SubresourceIntegrity.cpp
+++ b/third_party/WebKit/Source/core/frame/SubresourceIntegrity.cpp
@@ -7,6 +7,7 @@
#include "core/HTMLNames.h"
#include "core/dom/Document.h"
#include "core/dom/Element.h"
+#include "core/dom/ExecutionContext.h"
#include "core/fetch/Resource.h"
#include "core/frame/UseCounter.h"
#include "core/inspector/ConsoleMessage.h"
@@ -38,8 +39,9 @@ static bool isValueCharacter(UChar c) {
return c >= 0x21 && c <= 0x7e;
}
-static void logErrorToConsole(const String& message, Document& document) {
- document.addConsoleMessage(ConsoleMessage::create(
+static void logErrorToConsole(const String& message,
+ ExecutionContext& executionContext) {
+ executionContext.addConsoleMessage(ConsoleMessage::create(
SecurityMessageSource, ErrorMessageLevel, message));
}
@@ -156,18 +158,18 @@ bool SubresourceIntegrity::CheckSubresourceIntegrity(
const char* content,
size_t size,
const KURL& resourceUrl,
- Document& document,
+ ExecutionContext& executionContext,
String& errorMessage) {
IntegrityMetadataSet metadataSet;
- IntegrityParseResult integrityParseResult =
- parseIntegrityAttribute(integrityMetadata, metadataSet, &document);
+ IntegrityParseResult integrityParseResult = parseIntegrityAttribute(
+ integrityMetadata, metadataSet, &executionContext);
// On failed parsing, there's no need to log an error here, as
// parseIntegrityAttribute() will output an appropriate console message.
if (integrityParseResult != IntegrityParseValidResult)
return true;
return CheckSubresourceIntegrity(metadataSet, content, size, resourceUrl,
- document, errorMessage);
+ executionContext, errorMessage);
}
bool SubresourceIntegrity::CheckSubresourceIntegrity(
@@ -175,7 +177,7 @@ bool SubresourceIntegrity::CheckSubresourceIntegrity(
const char* content,
size_t size,
const KURL& resourceUrl,
- Document& document,
+ ExecutionContext& executionContext,
String& errorMessage) {
if (!metadataSet.size())
return true;
@@ -202,7 +204,7 @@ bool SubresourceIntegrity::CheckSubresourceIntegrity(
hashVector.size());
if (DigestsEqual(digest, convertedHashVector)) {
- UseCounter::count(document,
+ UseCounter::count(&executionContext,
UseCounter::SRIElementWithMatchingIntegrityAttribute);
return true;
}
@@ -226,7 +228,7 @@ bool SubresourceIntegrity::CheckSubresourceIntegrity(
"There was an error computing an integrity value for resource '" +
resourceUrl.elidedString() + "'. The resource has been blocked.";
}
- UseCounter::count(document,
+ UseCounter::count(&executionContext,
UseCounter::SRIElementWithNonMatchingIntegrityAttribute);
return false;
}
@@ -317,9 +319,10 @@ SubresourceIntegrity::parseIntegrityAttribute(
}
SubresourceIntegrity::IntegrityParseResult
-SubresourceIntegrity::parseIntegrityAttribute(const WTF::String& attribute,
- IntegrityMetadataSet& metadataSet,
- Document* document) {
+SubresourceIntegrity::parseIntegrityAttribute(
+ const WTF::String& attribute,
+ IntegrityMetadataSet& metadataSet,
+ ExecutionContext* executionContext) {
Vector<UChar> characters;
attribute.stripWhiteSpace().appendTo(characters);
const UChar* position = characters.data();
@@ -351,13 +354,14 @@ SubresourceIntegrity::parseIntegrityAttribute(const WTF::String& attribute,
// Unknown hash algorithms are treated as if they're not present,
// and thus are not marked as an error, they're just skipped.
skipUntil<UChar, isASCIISpace>(position, end);
- if (document) {
+ if (executionContext) {
logErrorToConsole("Error parsing 'integrity' attribute ('" + attribute +
"'). The specified hash algorithm must be one of "
"'sha256', 'sha384', or 'sha512'.",
- *document);
+ *executionContext);
UseCounter::count(
- *document, UseCounter::SRIElementWithUnparsableIntegrityAttribute);
+ executionContext,
+ UseCounter::SRIElementWithUnparsableIntegrityAttribute);
}
continue;
}
@@ -365,14 +369,15 @@ SubresourceIntegrity::parseIntegrityAttribute(const WTF::String& attribute,
if (parseResult == AlgorithmUnparsable) {
error = true;
skipUntil<UChar, isASCIISpace>(position, end);
- if (document) {
+ if (executionContext) {
logErrorToConsole("Error parsing 'integrity' attribute ('" + attribute +
"'). The hash algorithm must be one of 'sha256', "
"'sha384', or 'sha512', followed by a '-' "
"character.",
- *document);
+ *executionContext);
UseCounter::count(
- *document, UseCounter::SRIElementWithUnparsableIntegrityAttribute);
+ executionContext,
+ UseCounter::SRIElementWithUnparsableIntegrityAttribute);
}
continue;
}
@@ -382,13 +387,14 @@ SubresourceIntegrity::parseIntegrityAttribute(const WTF::String& attribute,
if (!parseDigest(position, currentIntegrityEnd, digest)) {
error = true;
skipUntil<UChar, isASCIISpace>(position, end);
- if (document) {
+ if (executionContext) {
logErrorToConsole(
"Error parsing 'integrity' attribute ('" + attribute +
"'). The digest must be a valid, base64-encoded value.",
- *document);
+ *executionContext);
UseCounter::count(
- *document, UseCounter::SRIElementWithUnparsableIntegrityAttribute);
+ executionContext,
+ UseCounter::SRIElementWithUnparsableIntegrityAttribute);
}
continue;
}
@@ -400,11 +406,12 @@ SubresourceIntegrity::parseIntegrityAttribute(const WTF::String& attribute,
if (skipExactly<UChar>(position, end, '?')) {
const UChar* begin = position;
skipWhile<UChar, isValueCharacter>(position, end);
- if (begin != position && document)
+ if (begin != position && executionContext) {
logErrorToConsole(
"Ignoring unrecogized 'integrity' attribute option '" +
String(begin, position - begin) + "'.",
- *document);
+ *executionContext);
+ }
}
IntegrityMetadata integrityMetadata(digest, algorithm);
« no previous file with comments | « third_party/WebKit/Source/core/frame/SubresourceIntegrity.h ('k') | third_party/WebKit/Source/modules/fetch/FetchManager.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698