Bug 1324244 - Stop parsing empty host/path URIs for special schemes as valid; r?valentin
MozReview-Commit-ID: 98gwjZG0xJT
--- 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()));