summary refs log tree commit diff
path: root/gnu/packages/patches/icecat-CVE-2015-7193.patch
diff options
context:
space:
mode:
Diffstat (limited to 'gnu/packages/patches/icecat-CVE-2015-7193.patch')
-rw-r--r--gnu/packages/patches/icecat-CVE-2015-7193.patch397
1 files changed, 397 insertions, 0 deletions
diff --git a/gnu/packages/patches/icecat-CVE-2015-7193.patch b/gnu/packages/patches/icecat-CVE-2015-7193.patch
new file mode 100644
index 0000000000..798799de9f
--- /dev/null
+++ b/gnu/packages/patches/icecat-CVE-2015-7193.patch
@@ -0,0 +1,397 @@
+From d135e3b3c48811c577e1632a41c5c50bc55c035c Mon Sep 17 00:00:00 2001
+From: Ehsan Akhgari <ehsan@mozilla.com>
+Date: Tue, 20 Oct 2015 11:40:12 +0200
+Subject: [PATCH] Bug 1210302 - Add a NS_ParseRequestContentType API; ba=al, 
+ r=mcmanus, r=sicking, a=al
+
+--HG--
+extra : amend_source : d93021b626709b03f6499029dc3d1813cccba386
+---
+ docshell/base/nsDocShell.cpp       |  2 +-
+ dom/base/Navigator.cpp             |  4 +--
+ dom/base/nsContentUtils.cpp        |  2 +-
+ dom/html/nsHTMLDocument.cpp        |  2 +-
+ dom/manifest/ManifestProcessor.jsm |  6 ++--
+ netwerk/base/moz.build             |  1 +
+ netwerk/base/nsINetUtil_ESR_38.idl | 14 +++++++++
+ netwerk/base/nsIOService.cpp       | 12 ++++++++
+ netwerk/base/nsIOService.h         |  3 ++
+ netwerk/base/nsNetUtil.h           | 21 +++++++++++++
+ netwerk/base/nsURLHelper.cpp       | 60 +++++++++++++++++++++++++++++++++++---
+ netwerk/base/nsURLHelper.h         | 32 +++++++++++++++-----
+ 12 files changed, 139 insertions(+), 20 deletions(-)
+ create mode 100644 netwerk/base/nsINetUtil_ESR_38.idl
+
+diff --git a/docshell/base/nsDocShell.cpp b/docshell/base/nsDocShell.cpp
+index bcc205c..4fc7c34 100644
+--- a/docshell/base/nsDocShell.cpp
++++ b/docshell/base/nsDocShell.cpp
+@@ -13519,7 +13519,7 @@ nsDocShell::OnLinkClickSync(nsIContent* aContent,
+     anchor->GetType(typeHint);
+     NS_ConvertUTF16toUTF8 utf8Hint(typeHint);
+     nsAutoCString type, dummy;
+-    NS_ParseContentType(utf8Hint, type, dummy);
++    NS_ParseRequestContentType(utf8Hint, type, dummy);
+     CopyUTF8toUTF16(type, typeHint);
+   }
+ 
+diff --git a/dom/base/Navigator.cpp b/dom/base/Navigator.cpp
+index f4ea502..7288420 100644
+--- a/dom/base/Navigator.cpp
++++ b/dom/base/Navigator.cpp
+@@ -1221,9 +1221,9 @@ Navigator::SendBeacon(const nsAString& aUrl,
+   rv = secMan->CheckSameOriginURI(documentURI, uri, false);
+   bool crossOrigin = NS_FAILED(rv);
+   nsAutoCString contentType, parsedCharset;
+-  rv = NS_ParseContentType(mimeType, contentType, parsedCharset);
++  rv = NS_ParseRequestContentType(mimeType, contentType, parsedCharset);
+   if (crossOrigin &&
+-      contentType.Length() > 0 &&
++      mimeType.Length() > 0 &&
+       !contentType.Equals(APPLICATION_WWW_FORM_URLENCODED) &&
+       !contentType.Equals(MULTIPART_FORM_DATA) &&
+       !contentType.Equals(TEXT_PLAIN)) {
+diff --git a/dom/base/nsContentUtils.cpp b/dom/base/nsContentUtils.cpp
+index 5e8dbd6..686f7bf 100644
+--- a/dom/base/nsContentUtils.cpp
++++ b/dom/base/nsContentUtils.cpp
+@@ -7001,7 +7001,7 @@ nsContentUtils::IsAllowedNonCorsContentType(const nsACString& aHeaderValue)
+   nsAutoCString contentType;
+   nsAutoCString unused;
+ 
+-  nsresult rv = NS_ParseContentType(aHeaderValue, contentType, unused);
++  nsresult rv = NS_ParseRequestContentType(aHeaderValue, contentType, unused);
+   if (NS_FAILED(rv)) {
+     return false;
+   }
+diff --git a/dom/html/nsHTMLDocument.cpp b/dom/html/nsHTMLDocument.cpp
+index 7481109..d195792 100644
+--- a/dom/html/nsHTMLDocument.cpp
++++ b/dom/html/nsHTMLDocument.cpp
+@@ -1422,7 +1422,7 @@ nsHTMLDocument::Open(JSContext* cx,
+   nsAutoString type;
+   nsContentUtils::ASCIIToLower(aType, type);
+   nsAutoCString actualType, dummy;
+-  NS_ParseContentType(NS_ConvertUTF16toUTF8(type), actualType, dummy);
++  NS_ParseRequestContentType(NS_ConvertUTF16toUTF8(type), actualType, dummy);
+   if (!actualType.EqualsLiteral("text/html") &&
+       !type.EqualsLiteral("replace")) {
+     contentType.AssignLiteral("text/plain");
+diff --git a/dom/manifest/ManifestProcessor.jsm b/dom/manifest/ManifestProcessor.jsm
+index b6df920..f16881a 100644
+--- a/dom/manifest/ManifestProcessor.jsm
++++ b/dom/manifest/ManifestProcessor.jsm
+@@ -31,7 +31,7 @@ const imports = {};
+ Cu.import('resource://gre/modules/Services.jsm', imports);
+ Cu.importGlobalProperties(['URL']);
+ const securityManager = imports.Services.scriptSecurityManager;
+-const netutil = Cc['@mozilla.org/network/util;1'].getService(Ci.nsINetUtil);
++const netutil = Cc['@mozilla.org/network/util;1'].getService(Ci.nsINetUtil_ESR_38);
+ const defaultDisplayMode = 'browser';
+ const displayModes = new Set([
+   'fullscreen',
+@@ -258,7 +258,7 @@ this.ManifestProcessor.prototype.process = function({
+         };
+       let value = extractValue(obj),
+         isParsable = (typeof value === 'string' && value.length > 0);
+-      value = (isParsable) ? netutil.parseContentType(value.trim(), charset, hadCharset) : undefined;
++      value = (isParsable) ? netutil.parseRequestContentType(value.trim(), charset, hadCharset) : undefined;
+       return (value === '') ? undefined : value;
+     }
+ 
+@@ -354,4 +354,4 @@ this.ManifestProcessor.prototype.process = function({
+   };
+   processedManifest.scope = processScopeMember(manifest, manifestURL, docURL, processedManifest.start_url);
+   return processedManifest;
+-};
+\ No newline at end of file
++};
+diff --git a/netwerk/base/moz.build b/netwerk/base/moz.build
+index 877365b..deedf76 100644
+--- a/netwerk/base/moz.build
++++ b/netwerk/base/moz.build
+@@ -59,6 +59,7 @@ XPIDL_SOURCES += [
+     'nsINestedURI.idl',
+     'nsINetAddr.idl',
+     'nsINetUtil.idl',
++    'nsINetUtil_ESR_38.idl',
+     'nsINetworkInterceptController.idl',
+     'nsINetworkLinkService.idl',
+     'nsINetworkPredictor.idl',
+diff --git a/netwerk/base/nsINetUtil_ESR_38.idl b/netwerk/base/nsINetUtil_ESR_38.idl
+new file mode 100644
+index 0000000..7ef40e9
+--- /dev/null
++++ b/netwerk/base/nsINetUtil_ESR_38.idl
+@@ -0,0 +1,14 @@
++/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
++/* This Source Code Form is subject to the terms of the Mozilla Public
++ * License, v. 2.0. If a copy of the MPL was not distributed with this
++ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
++
++#include "nsISupports.idl"
++
++[scriptable, uuid(e82f2b9d-8bac-48bb-ade7-26a7cd4fb894)]
++interface nsINetUtil_ESR_38 : nsISupports
++{
++  AUTF8String parseRequestContentType(in AUTF8String aTypeHeader,
++                                      out AUTF8String aCharset,
++                                      out boolean aHadCharset);
++};
+diff --git a/netwerk/base/nsIOService.cpp b/netwerk/base/nsIOService.cpp
+index 83db86f..9a17e8b 100644
+--- a/netwerk/base/nsIOService.cpp
++++ b/netwerk/base/nsIOService.cpp
+@@ -321,6 +321,7 @@ NS_IMPL_ISUPPORTS(nsIOService,
+                   nsIIOService,
+                   nsIIOService2,
+                   nsINetUtil,
++                  nsINetUtil_ESR_38,
+                   nsISpeculativeConnect,
+                   nsIObserver,
+                   nsISupportsWeakReference)
+@@ -1280,6 +1281,17 @@ nsIOService::Observe(nsISupports *subject,
+ 
+ // nsINetUtil interface
+ NS_IMETHODIMP
++nsIOService::ParseRequestContentType(const nsACString &aTypeHeader,
++                                     nsACString &aCharset,
++                                     bool *aHadCharset,
++                                     nsACString &aContentType)
++{
++    net_ParseRequestContentType(aTypeHeader, aContentType, aCharset, aHadCharset);
++    return NS_OK;
++}
++
++// nsINetUtil interface
++NS_IMETHODIMP
+ nsIOService::ParseContentType(const nsACString &aTypeHeader,
+                               nsACString &aCharset,
+                               bool *aHadCharset,
+diff --git a/netwerk/base/nsIOService.h b/netwerk/base/nsIOService.h
+index acd501c..b125709 100644
+--- a/netwerk/base/nsIOService.h
++++ b/netwerk/base/nsIOService.h
+@@ -14,6 +14,7 @@
+ #include "nsIObserver.h"
+ #include "nsWeakReference.h"
+ #include "nsINetUtil.h"
++#include "nsINetUtil_ESR_38.h"
+ #include "nsIChannelEventSink.h"
+ #include "nsCategoryCache.h"
+ #include "nsISpeculativeConnect.h"
+@@ -47,6 +48,7 @@ namespace net {
+ class nsIOService final : public nsIIOService2
+                             , public nsIObserver
+                             , public nsINetUtil
++                            , public nsINetUtil_ESR_38
+                             , public nsISpeculativeConnect
+                             , public nsSupportsWeakReference
+ {
+@@ -56,6 +58,7 @@ public:
+     NS_DECL_NSIIOSERVICE2
+     NS_DECL_NSIOBSERVER
+     NS_DECL_NSINETUTIL
++    NS_DECL_NSINETUTIL_ESR_38
+     NS_DECL_NSISPECULATIVECONNECT
+ 
+     // Gets the singleton instance of the IO Service, creating it as needed
+diff --git a/netwerk/base/nsNetUtil.h b/netwerk/base/nsNetUtil.h
+index ec69716..df8874c 100644
+--- a/netwerk/base/nsNetUtil.h
++++ b/netwerk/base/nsNetUtil.h
+@@ -56,6 +56,7 @@
+ #include "nsISyncStreamListener.h"
+ #include "nsInterfaceRequestorAgg.h"
+ #include "nsINetUtil.h"
++#include "nsINetUtil_ESR_38.h"
+ #include "nsIURIWithPrincipal.h"
+ #include "nsIAuthPrompt.h"
+ #include "nsIAuthPrompt2.h"
+@@ -1228,6 +1229,26 @@ NS_GetReferrerFromChannel(nsIChannel *channel,
+ }
+ 
+ inline nsresult
++NS_ParseRequestContentType(const nsACString &rawContentType,
++                           nsCString        &contentType,
++                           nsCString        &contentCharset)
++{
++    // contentCharset is left untouched if not present in rawContentType
++    nsresult rv;
++    nsCOMPtr<nsINetUtil> util = do_GetNetUtil(&rv);
++    NS_ENSURE_SUCCESS(rv, rv);
++    nsCOMPtr<nsINetUtil_ESR_38> utilESR38 = do_QueryInterface(util, &rv);
++    NS_ENSURE_SUCCESS(rv, rv);
++    nsCString charset;
++    bool hadCharset;
++    rv = utilESR38->ParseRequestContentType(rawContentType, charset, &hadCharset,
++                                            contentType);
++    if (NS_SUCCEEDED(rv) && hadCharset)
++        contentCharset = charset;
++    return rv;
++}
++
++inline nsresult
+ NS_ParseContentType(const nsACString &rawContentType,
+                     nsCString        &contentType,
+                     nsCString        &contentCharset)
+diff --git a/netwerk/base/nsURLHelper.cpp b/netwerk/base/nsURLHelper.cpp
+index 10ea849..cdb2120 100644
+--- a/netwerk/base/nsURLHelper.cpp
++++ b/netwerk/base/nsURLHelper.cpp
+@@ -803,7 +803,8 @@ net_ParseMediaType(const nsACString &aMediaTypeStr,
+                    int32_t          aOffset,
+                    bool             *aHadCharset,
+                    int32_t          *aCharsetStart,
+-                   int32_t          *aCharsetEnd)
++                   int32_t          *aCharsetEnd,
++                   bool             aStrict)
+ {
+     const nsCString& flatStr = PromiseFlatCString(aMediaTypeStr);
+     const char* start = flatStr.get();
+@@ -820,6 +821,8 @@ net_ParseMediaType(const nsACString &aMediaTypeStr,
+     int32_t charsetParamStart = 0;
+     int32_t charsetParamEnd = 0;
+ 
++    uint32_t consumed = typeEnd - type;
++
+     // Iterate over parameters
+     bool typeHasCharset = false;
+     uint32_t paramStart = flatStr.FindChar(';', typeEnd - start);
+@@ -843,6 +846,7 @@ net_ParseMediaType(const nsACString &aMediaTypeStr,
+                 charsetParamEnd = curParamEnd;
+             }
+ 
++            consumed = curParamEnd;
+             curParamStart = curParamEnd + 1;
+         } while (curParamStart < flatStr.Length());
+     }
+@@ -872,8 +876,10 @@ net_ParseMediaType(const nsACString &aMediaTypeStr,
+     // some servers give junk after the charset parameter, which may
+     // include a comma, so this check makes us a bit more tolerant.
+ 
+-    if (type != typeEnd && strncmp(type, "*/*", typeEnd - type) != 0 &&
+-        memchr(type, '/', typeEnd - type) != nullptr) {
++    if (type != typeEnd &&
++        memchr(type, '/', typeEnd - type) != nullptr &&
++        (aStrict ? (net_FindCharNotInSet(start + consumed, end, HTTP_LWS) == end) :
++                   (strncmp(type, "*/*", typeEnd - type) != 0))) {
+         // Common case here is that aContentType is empty
+         bool eq = !aContentType.IsEmpty() &&
+             aContentType.Equals(Substring(type, typeEnd),
+@@ -980,13 +986,59 @@ net_ParseContentType(const nsACString &aHeaderStr,
+         net_ParseMediaType(Substring(flatStr, curTypeStart,
+                                      curTypeEnd - curTypeStart),
+                            aContentType, aContentCharset, curTypeStart,
+-                           aHadCharset, aCharsetStart, aCharsetEnd);
++                           aHadCharset, aCharsetStart, aCharsetEnd, false);
+ 
+         // And let's move on to the next media-type
+         curTypeStart = curTypeEnd + 1;
+     } while (curTypeStart < flatStr.Length());
+ }
+ 
++void
++net_ParseRequestContentType(const nsACString &aHeaderStr,
++                            nsACString       &aContentType,
++                            nsACString       &aContentCharset,
++                            bool             *aHadCharset)
++{
++    //
++    // Augmented BNF (from RFC 7231 section 3.1.1.1):
++    //
++    //   media-type   = type "/" subtype *( OWS ";" OWS parameter )
++    //   type         = token
++    //   subtype      = token
++    //   parameter    = token "=" ( token / quoted-string )
++    //
++    // Examples:
++    //
++    //   text/html
++    //   text/html; charset=ISO-8859-1
++    //   text/html; charset="ISO-8859-1"
++    //   application/octet-stream
++    //
++
++    aContentType.Truncate();
++    aContentCharset.Truncate();
++    *aHadCharset = false;
++    const nsCString& flatStr = PromiseFlatCString(aHeaderStr);
++
++    // At this point curTypeEnd points to the spot where the media-type
++    // starting at curTypeEnd ends.  Time to parse that!
++    nsAutoCString contentType, contentCharset;
++    bool hadCharset = false;
++    int32_t dummy1, dummy2;
++    uint32_t typeEnd = net_FindMediaDelimiter(flatStr, 0, ',');
++    if (typeEnd != flatStr.Length()) {
++        // We have some stuff left at the end, so this is not a valid
++        // request Content-Type header.
++        return;
++    }
++    net_ParseMediaType(flatStr, contentType, contentCharset, 0,
++                       &hadCharset, &dummy1, &dummy2, true);
++
++    aContentType = contentType;
++    aContentCharset = contentCharset;
++    *aHadCharset = hadCharset;
++}
++
+ bool
+ net_IsValidHostName(const nsCSubstring &host)
+ {
+diff --git a/netwerk/base/nsURLHelper.h b/netwerk/base/nsURLHelper.h
+index 816a3c5..21e17be 100644
+--- a/netwerk/base/nsURLHelper.h
++++ b/netwerk/base/nsURLHelper.h
+@@ -172,11 +172,27 @@ char * net_RFindCharNotInSet(const char *str, const char *end, const char *set);
+  * specified), aHadCharset is set to false.  Otherwise, it's set to
+  * true.  Note that aContentCharset can be empty even if aHadCharset
+  * is true.
++ *
++ * This parsing is suitable for HTTP request.  Use net_ParseContentType
++ * for parsing this header in HTTP responses.
++ */
++void net_ParseRequestContentType(const nsACString &aHeaderStr,
++                                 nsACString       &aContentType,
++                                 nsACString       &aContentCharset,
++                                 bool*          aHadCharset);
++
++/**
++ * Parses a content-type header and returns the content type and
++ * charset (if any).  aCharset is not modified if no charset is
++ * specified in anywhere in aHeaderStr.  In that case (no charset
++ * specified), aHadCharset is set to false.  Otherwise, it's set to
++ * true.  Note that aContentCharset can be empty even if aHadCharset
++ * is true.
+  */
+ void net_ParseContentType(const nsACString &aHeaderStr,
+-                                      nsACString       &aContentType,
+-                                      nsACString       &aContentCharset,
+-                                      bool*          aHadCharset);
++                          nsACString       &aContentType,
++                          nsACString       &aContentCharset,
++                          bool*          aHadCharset);
+ /**
+  * As above, but also returns the start and end indexes for the charset
+  * parameter in aHeaderStr.  These are indices for the entire parameter, NOT
+@@ -187,11 +203,11 @@ void net_ParseContentType(const nsACString &aHeaderStr,
+  * *aCharsetStart is nonnegative; this corresponds to charset="".
+  */
+ void net_ParseContentType(const nsACString &aHeaderStr,
+-                                      nsACString       &aContentType,
+-                                      nsACString       &aContentCharset,
+-                                      bool             *aHadCharset,
+-                                      int32_t          *aCharsetStart,
+-                                      int32_t          *aCharsetEnd);
++                          nsACString       &aContentType,
++                          nsACString       &aContentCharset,
++                          bool             *aHadCharset,
++                          int32_t          *aCharsetStart,
++                          int32_t          *aCharsetEnd);
+ 
+ /* inline versions */
+ 
+-- 
+2.5.0
+