summary refs log tree commit diff
path: root/gnu/packages/patches/icecat-CVE-2015-7188.patch
diff options
context:
space:
mode:
Diffstat (limited to 'gnu/packages/patches/icecat-CVE-2015-7188.patch')
-rw-r--r--gnu/packages/patches/icecat-CVE-2015-7188.patch143
1 files changed, 143 insertions, 0 deletions
diff --git a/gnu/packages/patches/icecat-CVE-2015-7188.patch b/gnu/packages/patches/icecat-CVE-2015-7188.patch
new file mode 100644
index 0000000000..15e26e3a6e
--- /dev/null
+++ b/gnu/packages/patches/icecat-CVE-2015-7188.patch
@@ -0,0 +1,143 @@
+From 23e5bd6ffab4b6fa17a92d0bc58fbd185e9a7e6e Mon Sep 17 00:00:00 2001
+From: Valentin Gosu <valentin.gosu@gmail.com>
+Date: Tue, 13 Oct 2015 11:10:26 +0200
+Subject: [PATCH] Bug 1199430 - Reject hostnames containing @. r=mcmanus, a=al
+
+---
+ docshell/test/unit/test_nsDefaultURIFixup_info.js | 16 ++++++------
+ netwerk/base/nsStandardURL.cpp                    | 30 ++++++++++++++---------
+ netwerk/base/nsStandardURL.h                      |  2 +-
+ 3 files changed, 27 insertions(+), 21 deletions(-)
+
+diff --git a/docshell/test/unit/test_nsDefaultURIFixup_info.js b/docshell/test/unit/test_nsDefaultURIFixup_info.js
+index b178ea9..dbb55c6 100644
+--- a/docshell/test/unit/test_nsDefaultURIFixup_info.js
++++ b/docshell/test/unit/test_nsDefaultURIFixup_info.js
+@@ -199,12 +199,10 @@ let testcases = [ {
+     protocolChange: true
+   }, {
+     input: "[::1][100",
+-    fixedURI: "http://[::1][100/",
+-    alternateURI: "http://[::1][100/",
++    fixedURI: null,
++    alternateURI: null,
+     keywordLookup: true,
+-    protocolChange: true,
+-    affectedByWhitelist: true,
+-    affectedByDNSForSingleHosts: true,
++    protocolChange: true
+   }, {
+     input: "[::1]]",
+     keywordLookup: true,
+@@ -514,15 +512,15 @@ if (Services.appinfo.OS.toLowerCase().startsWith("win")) {
+     input: "//mozilla",
+     fixedURI: "file:////mozilla",
+     protocolChange: true,
+-  });
++  }); // \ is an invalid character in the hostname until bug 652186 is implemented
+   testcases.push({
+     input: "mozilla\\",
+-    fixedURI: "http://mozilla\\/",
+-    alternateURI: "http://www.mozilla/",
++    // fixedURI: "http://mozilla\\/",
++    // alternateURI: "http://www.mozilla/",
+     keywordLookup: true,
+     protocolChange: true,
+     affectedByWhitelist: true,
+-    affectedByDNSForSingleHosts: true,
++    // affectedByDNSForSingleHosts: true,
+   });
+ }
+ 
+diff --git a/netwerk/base/nsStandardURL.cpp b/netwerk/base/nsStandardURL.cpp
+index f5f516f..cff90fc 100644
+--- a/netwerk/base/nsStandardURL.cpp
++++ b/netwerk/base/nsStandardURL.cpp
+@@ -427,14 +427,16 @@ nsStandardURL::NormalizeIDN(const nsCSubstring &host, nsCString &result)
+ }
+ 
+ bool
+-nsStandardURL::ValidIPv6orHostname(const char *host)
++nsStandardURL::ValidIPv6orHostname(const char *host, uint32_t length)
+ {
+-    if (!host || !*host) {
+-        // Should not be NULL or empty string
++    if (!host) {
+         return false;
+     }
+ 
+-    int32_t length = strlen(host);
++    if (length != strlen(host)) {
++        // Embedded null
++        return false;
++    }
+ 
+     bool openBracket = host[0] == '[';
+     bool closeBracket = host[length - 1] == ']';
+@@ -448,8 +450,9 @@ nsStandardURL::ValidIPv6orHostname(const char *host)
+         return false;
+     }
+ 
+-    if (PL_strchr(host, ':')) {
+-        // Hostnames should not contain a colon
++    const char *end = host + length;
++    if (end != net_FindCharInSet(host, end, "\t\n\v\f\r #/:?@[\\]")) {
++        // % is allowed because we don't do hostname percent decoding yet.
+         return false;
+     }
+ 
+@@ -587,6 +590,11 @@ nsStandardURL::BuildNormalizedSpec(const char *spec)
+             approxLen += encHost.Length();
+         else
+             approxLen += mHost.mLen;
++
++        if ((useEncHost && !ValidIPv6orHostname(encHost.BeginReading(), encHost.Length())) ||
++            (!useEncHost && !ValidIPv6orHostname(tempHost.BeginReading(), tempHost.Length()))) {
++            return NS_ERROR_MALFORMED_URI;
++        }
+     }
+ 
+     //
+@@ -1580,14 +1588,10 @@ nsStandardURL::SetHost(const nsACString &input)
+     if (strchr(host, ' '))
+         return NS_ERROR_MALFORMED_URI;
+ 
+-    if (!ValidIPv6orHostname(host)) {
+-        return NS_ERROR_MALFORMED_URI;
+-    }
+-
+     InvalidateCache();
+     mHostEncoding = eEncoding_ASCII;
+ 
+-    int32_t len;
++    uint32_t len;
+     nsAutoCString hostBuf;
+     if (NormalizeIDN(flat, hostBuf)) {
+         host = hostBuf.get();
+@@ -1596,6 +1600,10 @@ nsStandardURL::SetHost(const nsACString &input)
+     else
+         len = flat.Length();
+ 
++    if (!ValidIPv6orHostname(host, len)) {
++        return NS_ERROR_MALFORMED_URI;
++    }
++
+     if (mHost.mLen < 0) {
+         int port_length = 0;
+         if (mPort != -1) {
+diff --git a/netwerk/base/nsStandardURL.h b/netwerk/base/nsStandardURL.h
+index 179a618..c56426e 100644
+--- a/netwerk/base/nsStandardURL.h
++++ b/netwerk/base/nsStandardURL.h
+@@ -173,7 +173,7 @@ private:
+     void     Clear();
+     void     InvalidateCache(bool invalidateCachedFile = true);
+ 
+-    bool     ValidIPv6orHostname(const char *host);
++    bool     ValidIPv6orHostname(const char *host, uint32_t aLen);
+     bool     NormalizeIDN(const nsCSubstring &host, nsCString &result);
+     void     CoalescePath(netCoalesceFlags coalesceFlag, char *path);
+ 
+-- 
+2.5.0
+