Bug 1275746 - Don't allow empty host name for URLTYPE_AUTHORITY URLs r=mcmanus

* Return NS_ERROR_MALFORMED_URI if mURLType is URLTYPE_AUTHORITY and the hostname is empty.
* Make sure nsStandardURL::SetFile calls init with the correct arguments

MozReview-Commit-ID: 7t3mZtAbMF3
This commit is contained in:
Valentin Gosu 2016-07-07 15:06:08 +03:00
Родитель 1c9bfb2ba1
Коммит ff510f7133
3 изменённых файлов: 29 добавлений и 34 удалений

Просмотреть файл

@ -1554,6 +1554,11 @@ nsStandardURL::SetSpec(const nsACString &input)
rv = BuildNormalizedSpec(spec);
}
// Make sure that a URLTYPE_AUTHORITY has a non-empty hostname.
if (mURLType == URLTYPE_AUTHORITY && mHost.mLen == -1) {
rv = NS_ERROR_MALFORMED_URI;
}
if (NS_FAILED(rv)) {
Clear();
// If parsing the spec has failed, restore the old URL
@ -3182,20 +3187,26 @@ nsStandardURL::SetFile(nsIFile *file)
rv = net_GetURLSpecFromFile(file, url);
if (NS_FAILED(rv)) return rv;
SetSpec(url);
uint32_t oldURLType = mURLType;
uint32_t oldDefaultPort = mDefaultPort;
rv = Init(nsIStandardURL::URLTYPE_NO_AUTHORITY, -1, url, nullptr, nullptr);
rv = Init(mURLType, mDefaultPort, url, nullptr, nullptr);
if (NS_FAILED(rv)) {
// Restore the old url type and default port if the call to Init fails.
mURLType = oldURLType;
mDefaultPort = oldDefaultPort;
return rv;
}
// must clone |file| since its value is not guaranteed to remain constant
if (NS_SUCCEEDED(rv)) {
InvalidateCache();
if (NS_FAILED(file->Clone(getter_AddRefs(mFile)))) {
NS_WARNING("nsIFile::Clone failed");
// failure to clone is not fatal (GetFile will generate mFile)
mFile = nullptr;
}
InvalidateCache();
if (NS_FAILED(file->Clone(getter_AddRefs(mFile)))) {
NS_WARNING("nsIFile::Clone failed");
// failure to clone is not fatal (GetFile will generate mFile)
mFile = nullptr;
}
return rv;
return NS_OK;
}
//----------------------------------------------------------------------------

Просмотреть файл

@ -92,18 +92,6 @@ var gTests = [
ref: "",
relativeURI: "data/text/plain,2",
nsIURL: true, nsINestedURI: false },
{ spec: "ftp://",
scheme: "ftp",
prePath: "ftp://",
path: "/",
ref: "",
nsIURL: true, nsINestedURI: false },
{ spec: "ftp:///",
scheme: "ftp",
prePath: "ftp://",
path: "/",
ref: "",
nsIURL: true, nsINestedURI: false },
{ spec: "ftp://ftp.mozilla.org/pub/mozilla.org/README",
scheme: "ftp",
prePath: "ftp://ftp.mozilla.org",
@ -135,18 +123,6 @@ var gTests = [
path: "//mozilla.org/",
ref: "",
nsIURL: false, nsINestedURI: false },
{ spec: "http://",
scheme: "http",
prePath: "http://",
path: "/",
ref: "",
nsIURL: true, nsINestedURI: false },
{ spec: "http:///",
scheme: "http",
prePath: "http://",
path: "/",
ref: "",
nsIURL: true, nsINestedURI: false },
{ spec: "http://www.example.com/",
scheme: "http",
prePath: "http://www.example.com",

Просмотреть файл

@ -333,6 +333,14 @@ add_test(function test_backslashReplacement()
run_next_test();
});
add_test(function test_authority_host()
{
Assert.throws(() => { stringToURL("http:"); }, "TYPE_AUTHORITY should have host");
Assert.throws(() => { stringToURL("http:///"); }, "TYPE_AUTHORITY should have host");
run_next_test();
});
add_test(function test_trim_C0_and_space()
{
var url = stringToURL("\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f http://example.com/ \x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f ");