Bug 1324244 - Stop parsing empty host/path URIs for special schemes as valid; r?valentin draft
authorManish Goregaokar <manishearth@gmail.com>
Sun, 18 Dec 2016 14:51:46 -0800
changeset 450812 6d522809628d45791d24a4013e4bf3da00369b20
parent 449264 489f981e8c2beb050d7faee956dd940431bdafe6
child 539831 4753cc3edada099896ce3e5a1ce8f98735e1d2e3
push id38950
push userbmo:manishearth@gmail.com
push dateSun, 18 Dec 2016 22:58:13 +0000
reviewersvalentin
bugs1324244
milestone53.0a1
Bug 1324244 - Stop parsing empty host/path URIs for special schemes as valid; r?valentin MozReview-Commit-ID: 98gwjZG0xJT
netwerk/base/nsStandardURL.cpp
--- a/netwerk/base/nsStandardURL.cpp
+++ b/netwerk/base/nsStandardURL.cpp
@@ -1066,16 +1066,40 @@ nsStandardURL::ReplaceSegment(uint32_t p
 {
     if (len == 0)
         mSpec.Insert(val, pos);
     else
         mSpec.Replace(pos, len, val);
     return val.Length() - len;
 }
 
+
+static bool
+IsSpecialProtocol(const nsACString &input)
+{
+    nsACString::const_iterator start, end;
+    input.BeginReading(start);
+    nsACString::const_iterator iterator(start);
+    input.EndReading(end);
+
+    while (iterator != end && *iterator != ':') {
+        iterator++;
+    }
+
+    nsAutoCString protocol(nsDependentCSubstring(start.get(), iterator.get()));
+
+    return protocol.LowerCaseEqualsLiteral("http") ||
+           protocol.LowerCaseEqualsLiteral("https") ||
+           protocol.LowerCaseEqualsLiteral("ftp") ||
+           protocol.LowerCaseEqualsLiteral("ws") ||
+           protocol.LowerCaseEqualsLiteral("wss") ||
+           protocol.LowerCaseEqualsLiteral("file") ||
+           protocol.LowerCaseEqualsLiteral("gopher");
+}
+
 nsresult
 nsStandardURL::ParseURL(const char *spec, int32_t specLen)
 {
     nsresult rv;
 
     if (specLen > net_GetURLMaxLength()) {
         return NS_ERROR_MALFORMED_URI;
     }
@@ -1110,17 +1134,22 @@ nsStandardURL::ParseURL(const char *spec
 
         mUsername.mPos += mAuthority.mPos;
         mPassword.mPos += mAuthority.mPos;
         mHost.mPos += mAuthority.mPos;
     }
 
     if (mPath.mLen > 0)
         rv = ParsePath(spec, mPath.mPos, mPath.mLen);
-
+    if (NS_FAILED(rv)) return rv;
+
+    nsCString specString(spec, specLen);
+    if (mHost.mLen <= 0 && mPath.mLen <= 0 && IsSpecialProtocol(specString)) {
+        return NS_ERROR_MALFORMED_URI;
+    }
     return rv;
 }
 
 nsresult
 nsStandardURL::ParsePath(const char *spec, uint32_t pathPos, int32_t pathLen)
 {
     LOG(("ParsePath: %s pathpos %d len %d\n",spec,pathPos,pathLen));
 
@@ -1526,39 +1555,16 @@ nsStandardURL::GetOriginCharset(nsACStri
     if (mOriginCharset.IsEmpty())
         result.AssignLiteral("UTF-8");
     else
         result = mOriginCharset;
     CALL_RUST_GETTER_STR(result, GetOriginCharset, result);
     return NS_OK;
 }
 
-static bool
-IsSpecialProtocol(const nsACString &input)
-{
-    nsACString::const_iterator start, end;
-    input.BeginReading(start);
-    nsACString::const_iterator iterator(start);
-    input.EndReading(end);
-
-    while (iterator != end && *iterator != ':') {
-        iterator++;
-    }
-
-    nsAutoCString protocol(nsDependentCSubstring(start.get(), iterator.get()));
-
-    return protocol.LowerCaseEqualsLiteral("http") ||
-           protocol.LowerCaseEqualsLiteral("https") ||
-           protocol.LowerCaseEqualsLiteral("ftp") ||
-           protocol.LowerCaseEqualsLiteral("ws") ||
-           protocol.LowerCaseEqualsLiteral("wss") ||
-           protocol.LowerCaseEqualsLiteral("file") ||
-           protocol.LowerCaseEqualsLiteral("gopher");
-}
-
 NS_IMETHODIMP
 nsStandardURL::SetSpec(const nsACString &input)
 {
     ENSURE_MUTABLE();
 
     const nsPromiseFlatCString &flat = PromiseFlatCString(input);
     LOG(("nsStandardURL::SetSpec [spec=%s]\n", flat.get()));