mirror of
https://gitlab.winehq.org/wine/wine-gecko.git
synced 2024-09-13 09:24:08 -07:00
Bug 813245 - Sanity-check for mimetype count from pluginreg.dat. r=bsmedberg
This commit is contained in:
parent
00bdbc4e74
commit
cce012fd58
@ -2582,10 +2582,12 @@ nsPluginHost::WritePluginInfo()
|
||||
return rv;
|
||||
}
|
||||
|
||||
#define PLUGIN_REG_MIMETYPES_ARRAY_SIZE 12
|
||||
nsresult
|
||||
nsPluginHost::ReadPluginInfo()
|
||||
{
|
||||
const long PLUGIN_REG_MIMETYPES_ARRAY_SIZE = 12;
|
||||
const long PLUGIN_REG_MAX_MIMETYPES = 1000;
|
||||
|
||||
nsresult rv;
|
||||
|
||||
nsCOMPtr<nsIProperties> directoryService(do_GetService(NS_DIRECTORY_SERVICE_CONTRACTID,&rv));
|
||||
@ -2793,7 +2795,11 @@ nsPluginHost::ReadPluginInfo()
|
||||
if (!reader.NextLine())
|
||||
return rv;
|
||||
|
||||
int mimetypecount = atoi(reader.LinePtr());
|
||||
long mimetypecount = std::strtol(reader.LinePtr(), nullptr, 10);
|
||||
if (mimetypecount == LONG_MAX || mimetypecount == LONG_MIN ||
|
||||
mimetypecount >= PLUGIN_REG_MAX_MIMETYPES || mimetypecount < 0) {
|
||||
return NS_ERROR_FAILURE;
|
||||
}
|
||||
|
||||
char *stackalloced[PLUGIN_REG_MIMETYPES_ARRAY_SIZE * 3];
|
||||
char **mimetypes;
|
||||
|
@ -32,3 +32,51 @@ function get_test_plugin() {
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
// Finds the test nsIPluginTag
|
||||
function get_test_plugintag() {
|
||||
const Cc = Components.classes;
|
||||
const Ci = Components.interfaces;
|
||||
|
||||
var host = Cc["@mozilla.org/plugin/host;1"].
|
||||
getService(Ci.nsIPluginHost);
|
||||
var tags = host.getPluginTags();
|
||||
for (var i = 0; i < tags.length; i++) {
|
||||
if (tags[i].name == "Test Plug-in")
|
||||
return tags[i];
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
// Creates a fake ProfDS directory key, copied from do_get_profile
|
||||
function do_get_profile_startup() {
|
||||
let env = Components.classes["@mozilla.org/process/environment;1"]
|
||||
.getService(Components.interfaces.nsIEnvironment);
|
||||
// the python harness sets this in the environment for us
|
||||
let profd = env.get("XPCSHELL_TEST_PROFILE_DIR");
|
||||
let file = Components.classes["@mozilla.org/file/local;1"]
|
||||
.createInstance(Components.interfaces.nsILocalFile);
|
||||
file.initWithPath(profd);
|
||||
|
||||
let dirSvc = Components.classes["@mozilla.org/file/directory_service;1"]
|
||||
.getService(Components.interfaces.nsIProperties);
|
||||
let provider = {
|
||||
getFile: function(prop, persistent) {
|
||||
persistent.value = true;
|
||||
if (prop == "ProfDS") {
|
||||
return file.clone();
|
||||
}
|
||||
throw Components.results.NS_ERROR_FAILURE;
|
||||
},
|
||||
QueryInterface: function(iid) {
|
||||
if (iid.equals(Components.interfaces.nsIDirectoryServiceProvider) ||
|
||||
iid.equals(Components.interfaces.nsISupports)) {
|
||||
return this;
|
||||
}
|
||||
throw Components.results.NS_ERROR_NO_INTERFACE;
|
||||
}
|
||||
};
|
||||
dirSvc.QueryInterface(Components.interfaces.nsIDirectoryService)
|
||||
.registerProvider(provider);
|
||||
return file.clone();
|
||||
}
|
||||
|
@ -48,18 +48,6 @@ function write_registry(version, info) {
|
||||
os.close();
|
||||
}
|
||||
|
||||
// Finds the test nsIPluginTag
|
||||
function get_test_plugintag() {
|
||||
var host = Cc["@mozilla.org/plugin/host;1"].
|
||||
getService(Ci.nsIPluginHost);
|
||||
var tags = host.getPluginTags();
|
||||
for (var i = 0; i < tags.length; i++) {
|
||||
if (tags[i].name == "Test Plug-in")
|
||||
return tags[i];
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
function run_test() {
|
||||
var file = get_test_plugin();
|
||||
if (!file)
|
||||
|
@ -6,51 +6,6 @@
|
||||
const Cc = Components.classes;
|
||||
const Ci = Components.interfaces;
|
||||
|
||||
// Creates a fake ProfDS directory key, copied from do_get_profile
|
||||
function do_get_profile_startup() {
|
||||
let env = Components.classes["@mozilla.org/process/environment;1"]
|
||||
.getService(Components.interfaces.nsIEnvironment);
|
||||
// the python harness sets this in the environment for us
|
||||
let profd = env.get("XPCSHELL_TEST_PROFILE_DIR");
|
||||
let file = Components.classes["@mozilla.org/file/local;1"]
|
||||
.createInstance(Components.interfaces.nsILocalFile);
|
||||
file.initWithPath(profd);
|
||||
|
||||
let dirSvc = Components.classes["@mozilla.org/file/directory_service;1"]
|
||||
.getService(Components.interfaces.nsIProperties);
|
||||
let provider = {
|
||||
getFile: function(prop, persistent) {
|
||||
persistent.value = true;
|
||||
if (prop == "ProfDS") {
|
||||
return file.clone();
|
||||
}
|
||||
throw Components.results.NS_ERROR_FAILURE;
|
||||
},
|
||||
QueryInterface: function(iid) {
|
||||
if (iid.equals(Components.interfaces.nsIDirectoryServiceProvider) ||
|
||||
iid.equals(Components.interfaces.nsISupports)) {
|
||||
return this;
|
||||
}
|
||||
throw Components.results.NS_ERROR_NO_INTERFACE;
|
||||
}
|
||||
};
|
||||
dirSvc.QueryInterface(Components.interfaces.nsIDirectoryService)
|
||||
.registerProvider(provider);
|
||||
return file.clone();
|
||||
}
|
||||
|
||||
// Finds the test nsIPluginTag
|
||||
function get_test_plugintag() {
|
||||
var host = Cc["@mozilla.org/plugin/host;1"].
|
||||
getService(Ci.nsIPluginHost);
|
||||
var tags = host.getPluginTags();
|
||||
for (var i = 0; i < tags.length; i++) {
|
||||
if (tags[i].name == "Test Plug-in")
|
||||
return tags[i];
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
function run_test() {
|
||||
do_get_profile_startup();
|
||||
|
||||
|
97
dom/plugins/test/unit/test_bug813245.js
Normal file
97
dom/plugins/test/unit/test_bug813245.js
Normal file
@ -0,0 +1,97 @@
|
||||
/* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||
*/
|
||||
|
||||
const Cc = Components.classes;
|
||||
const Ci = Components.interfaces;
|
||||
|
||||
// v0.9+ registry field meanings are different on Mac OS X
|
||||
const CWD = do_get_cwd();
|
||||
function checkOS(os) {
|
||||
const nsILocalFile_ = "nsILocalFile" + os;
|
||||
return nsILocalFile_ in Components.interfaces &&
|
||||
CWD instanceof Components.interfaces[nsILocalFile_];
|
||||
}
|
||||
const isMac = checkOS("Mac");
|
||||
|
||||
// Plugin registry uses different field delimeters on different platforms
|
||||
var DELIM = ":";
|
||||
if ("@mozilla.org/windows-registry-key;1" in Components.classes)
|
||||
DELIM = "|";
|
||||
|
||||
var gProfD = do_get_profile_startup();
|
||||
var gDirSvc = Cc["@mozilla.org/file/directory_service;1"].
|
||||
getService(Ci.nsIProperties);
|
||||
|
||||
// Writes out some plugin registry to the profile
|
||||
function write_registry(version, info) {
|
||||
let runtime = Cc["@mozilla.org/xre/runtime;1"].getService(Ci.nsIXULRuntime);
|
||||
|
||||
var header = "Generated File. Do not edit.\n\n";
|
||||
header += "[HEADER]\n";
|
||||
header += "Version" + DELIM + version + DELIM + "$\n";
|
||||
header += "Arch" + DELIM + runtime.XPCOMABI + DELIM + "$\n";
|
||||
header += "\n";
|
||||
header += "[PLUGINS]\n";
|
||||
|
||||
var registry = gProfD.clone();
|
||||
registry.append("pluginreg.dat");
|
||||
var foStream = Components.classes["@mozilla.org/network/file-output-stream;1"]
|
||||
.createInstance(Components.interfaces.nsIFileOutputStream);
|
||||
// write, create, truncate
|
||||
foStream.init(registry, 0x02 | 0x08 | 0x20, 0666, 0);
|
||||
|
||||
var charset = "UTF-8"; // Can be any character encoding name that Mozilla supports
|
||||
var os = Cc["@mozilla.org/intl/converter-output-stream;1"].
|
||||
createInstance(Ci.nsIConverterOutputStream);
|
||||
os.init(foStream, charset, 0, 0x0000);
|
||||
|
||||
os.writeString(header);
|
||||
os.writeString(info);
|
||||
os.close();
|
||||
}
|
||||
|
||||
function run_test() {
|
||||
var plugin = get_test_plugintag();
|
||||
do_check_true(plugin == null);
|
||||
|
||||
var file = get_test_plugin();
|
||||
if (!file) {
|
||||
do_throw("Plugin library not found");
|
||||
}
|
||||
|
||||
// write plugin registry data
|
||||
let registry = "";
|
||||
|
||||
if (isMac) {
|
||||
registry += file.leafName + DELIM + "$\n";
|
||||
registry += file.path + DELIM + "$\n";
|
||||
} else {
|
||||
registry += file.path + DELIM + "$\n";
|
||||
registry += DELIM + "$\n";
|
||||
}
|
||||
registry += "0.0.0.0" + DELIM + "$\n";
|
||||
registry += "16725225600" + DELIM + "0" + DELIM + "5" + DELIM + "$\n";
|
||||
registry += "Plug-in for testing purposes." + DELIM + "$\n";
|
||||
registry += "Test Plug-in" + DELIM + "$\n";
|
||||
registry += "999999999999999999999999999999999999999999999999|0|5|$\n";
|
||||
registry += "0" + DELIM + "application/x-test" + DELIM + "Test mimetype" +
|
||||
DELIM + "tst" + DELIM + "$\n";
|
||||
|
||||
registry += "\n";
|
||||
registry += "[INVALID]\n";
|
||||
registry += "\n";
|
||||
write_registry("0.15", registry);
|
||||
|
||||
// Initialise profile folder
|
||||
do_get_profile();
|
||||
|
||||
var plugin = get_test_plugintag();
|
||||
if (!plugin)
|
||||
do_throw("Plugin tag not found");
|
||||
|
||||
// The plugin registry should have been rejected.
|
||||
// If not, the test plugin version would be 0.0.0.0
|
||||
do_check_eq(plugin.version, "1.0.0.0");
|
||||
}
|
@ -8,3 +8,6 @@ fail-if = os == "android"
|
||||
[test_bug471245.js]
|
||||
# Bug 676953: test fails consistently on Android
|
||||
fail-if = os == "android"
|
||||
[test_bug813245.js]
|
||||
# Bug 676953: test fails consistently on Android
|
||||
fail-if = os == "android"
|
||||
|
Loading…
Reference in New Issue
Block a user