summaryrefslogtreecommitdiffstats
path: root/content/child
diff options
context:
space:
mode:
authorjsbell@chromium.org <jsbell@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-06-20 22:51:11 +0000
committerjsbell@chromium.org <jsbell@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-06-20 22:51:11 +0000
commit37fde6a752162681ce6b62f1a96683483f2df596 (patch)
tree49a34250c972496045fa5bfb3971ebfcaab84db5 /content/child
parentca6b5d0f13f12c9accc65a683f5868fc5d3c15b0 (diff)
downloadchromium_src-37fde6a752162681ce6b62f1a96683483f2df596.zip
chromium_src-37fde6a752162681ce6b62f1a96683483f2df596.tar.gz
chromium_src-37fde6a752162681ce6b62f1a96683483f2df596.tar.bz2
ServiceWorker: Reject overly long scope/script URLs
IPC enforces a limit on receipt, but we should check on the sending side and reject the (un)registration promise too. BUG=386724 R=falken@chromium.org, michaeln@chromium.org Review URL: https://codereview.chromium.org/342163005 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@278850 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'content/child')
-rw-r--r--content/child/service_worker/service_worker_dispatcher.cc24
1 files changed, 23 insertions, 1 deletions
diff --git a/content/child/service_worker/service_worker_dispatcher.cc b/content/child/service_worker/service_worker_dispatcher.cc
index 131b714..936f5c8 100644
--- a/content/child/service_worker/service_worker_dispatcher.cc
+++ b/content/child/service_worker/service_worker_dispatcher.cc
@@ -14,6 +14,7 @@
#include "content/child/thread_safe_sender.h"
#include "content/child/webmessageportchannel_impl.h"
#include "content/common/service_worker/service_worker_messages.h"
+#include "content/public/common/url_utils.h"
#include "third_party/WebKit/public/platform/WebServiceWorkerProviderClient.h"
#include "third_party/WebKit/public/web/WebSecurityOrigin.h"
@@ -78,6 +79,17 @@ void ServiceWorkerDispatcher::RegisterServiceWorker(
const GURL& script_url,
WebServiceWorkerProvider::WebServiceWorkerCallbacks* callbacks) {
DCHECK(callbacks);
+
+ if (pattern.possibly_invalid_spec().size() > GetMaxURLChars() ||
+ script_url.possibly_invalid_spec().size() > GetMaxURLChars()) {
+ scoped_ptr<WebServiceWorkerProvider::WebServiceWorkerCallbacks>
+ owned_callbacks(callbacks);
+ scoped_ptr<WebServiceWorkerError> error(new WebServiceWorkerError(
+ WebServiceWorkerError::ErrorTypeSecurity, "URL too long"));
+ callbacks->onError(error.release());
+ return;
+ }
+
int request_id = pending_callbacks_.Add(callbacks);
thread_safe_sender_->Send(new ServiceWorkerHostMsg_RegisterServiceWorker(
CurrentWorkerId(), request_id, provider_id, pattern, script_url));
@@ -88,6 +100,16 @@ void ServiceWorkerDispatcher::UnregisterServiceWorker(
const GURL& pattern,
WebServiceWorkerProvider::WebServiceWorkerCallbacks* callbacks) {
DCHECK(callbacks);
+
+ if (pattern.possibly_invalid_spec().size() > GetMaxURLChars()) {
+ scoped_ptr<WebServiceWorkerProvider::WebServiceWorkerCallbacks>
+ owned_callbacks(callbacks);
+ scoped_ptr<WebServiceWorkerError> error(new WebServiceWorkerError(
+ WebServiceWorkerError::ErrorTypeSecurity, "URL too long"));
+ callbacks->onError(error.release());
+ return;
+ }
+
int request_id = pending_callbacks_.Add(callbacks);
thread_safe_sender_->Send(new ServiceWorkerHostMsg_UnregisterServiceWorker(
CurrentWorkerId(), request_id, provider_id, pattern));
@@ -215,7 +237,7 @@ void ServiceWorkerDispatcher::OnRegistrationError(
if (!callbacks)
return;
- scoped_ptr<WebServiceWorkerError> error(
+ scoped_ptr<WebServiceWorkerError> error(
new WebServiceWorkerError(error_type, message));
callbacks->onError(error.release());
pending_callbacks_.Remove(request_id);