Bug 949667 - crash in mozilla::net::HttpChannelParent::OnStartRequest, fail redirect to unsupported protocol on child process, r=jduell

This commit is contained in:
Honza Bambas 2014-01-14 15:59:00 +01:00
Родитель 27dbc599b4
Коммит 8ee832cff4
6 изменённых файлов: 77 добавлений и 4 удалений

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

@ -744,13 +744,15 @@ HttpChannelChild::Redirect1Begin(const uint32_t& newChannelId,
mRedirectChannelChild = do_QueryInterface(newChannel);
if (mRedirectChannelChild) {
mRedirectChannelChild->ConnectParent(newChannelId);
} else {
NS_ERROR("Redirecting to a protocol that doesn't support universal protocol redirect");
}
rv = gHttpHandler->AsyncOnChannelRedirect(this,
newChannel,
redirectFlags);
} else {
LOG((" redirecting to a protocol that doesn't implement"
" nsIChildChannel"));
rv = NS_ERROR_FAILURE;
}
if (NS_FAILED(rv))
OnRedirectVerifyCallback(rv);
}

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

@ -185,6 +185,10 @@ HttpChannelParentListener::OnRedirectResult(bool succeeded)
mRedirectChannelId = 0;
}
if (!redirectChannel) {
succeeded = false;
}
nsCOMPtr<nsIParentRedirectingChannel> activeRedirectingChannel =
do_QueryInterface(mActiveChannel);
MOZ_ASSERT(activeRedirectingChannel,

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

@ -0,0 +1,58 @@
Cu.import("resource://testing-common/httpd.js");
XPCOMUtils.defineLazyGetter(this, "URL", function() {
return "http://localhost:" + httpServer.identity.primaryPort;
});
var httpServer = null;
// Need to randomize, because apparently no one clears our cache
var randomPath = "/redirect/" + Math.random();
XPCOMUtils.defineLazyGetter(this, "randomURI", function() {
return URL + randomPath;
});
function inChildProcess() {
return Cc["@mozilla.org/xre/app-info;1"]
.getService(Ci.nsIXULRuntime)
.processType != Ci.nsIXULRuntime.PROCESS_TYPE_DEFAULT;
}
function make_channel(url, callback, ctx) {
var ios = Cc["@mozilla.org/network/io-service;1"].
getService(Ci.nsIIOService);
return ios.newChannel(url, "", null);
}
const redirectTargetBody = "response body";
const response301Body = "redirect body";
function redirectHandler(metadata, response)
{
response.setStatusLine(metadata.httpVersion, 301, "Moved");
response.bodyOutputStream.write(response301Body, response301Body.length);
response.setHeader("Location", "data:text/plain," + redirectTargetBody, false);
}
function finish_test(request, buffer)
{
if (inChildProcess()) {
// redirects to protocols other than http/ftp will fail until bug 590682 is fixed.
do_check_eq(buffer, response301Body);
} else {
do_check_eq(buffer, redirectTargetBody);
}
httpServer.stop(do_test_finished);
}
function run_test()
{
httpServer = new HttpServer();
httpServer.registerPathHandler(randomPath, redirectHandler);
httpServer.start(-1);
var chan = make_channel(randomURI);
chan.asyncOpen(new ChannelListener(finish_test, null, 0), null);
do_test_pending();
}

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

@ -259,6 +259,7 @@ fail-if = os == "android"
[test_redirect_passing.js]
[test_redirect_loop.js]
[test_redirect_baduri.js]
[test_redirect_different-protocol.js]
[test_reentrancy.js]
[test_reopen.js]
[test_resumable_channel.js]

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

@ -0,0 +1,7 @@
//
// Run test script in content process instead of chrome (xpcshell's default)
//
function run_test() {
run_test_in_child("../unit/test_redirect_different-protocol.js");
}

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

@ -26,6 +26,7 @@ support-files = disabled_test_bug528292_wrap.js
[test_redirect_from_script_wrap.js]
skip-if = true
[test_redirect_passing_wrap.js]
[test_redirect_different-protocol_wrap.js]
[test_reentrancy_wrap.js]
[test_resumable_channel_wrap.js]
[test_simple_wrap.js]