mirror of
https://github.com/servo/servo.git
synced 2025-07-25 08:10:21 +01:00
Restrict font loads to known MIME types.
This commit is contained in:
parent
1e81b8c133
commit
e17e553f04
6 changed files with 39 additions and 2 deletions
|
@ -17,6 +17,7 @@ harfbuzz-sys = "0.1"
|
||||||
lazy_static = "0.1"
|
lazy_static = "0.1"
|
||||||
libc = "0.2"
|
libc = "0.2"
|
||||||
log = "0.3"
|
log = "0.3"
|
||||||
|
mime = "0.1"
|
||||||
rand = "0.3"
|
rand = "0.3"
|
||||||
rustc-serialize = "0.3"
|
rustc-serialize = "0.3"
|
||||||
serde = "0.6"
|
serde = "0.6"
|
||||||
|
|
|
@ -5,6 +5,7 @@
|
||||||
use font_template::{FontTemplate, FontTemplateDescriptor};
|
use font_template::{FontTemplate, FontTemplateDescriptor};
|
||||||
use ipc_channel::ipc::{self, IpcReceiver, IpcSender};
|
use ipc_channel::ipc::{self, IpcReceiver, IpcSender};
|
||||||
use ipc_channel::router::ROUTER;
|
use ipc_channel::router::ROUTER;
|
||||||
|
use mime::{TopLevel, SubLevel};
|
||||||
use net_traits::{AsyncResponseTarget, LoadContext, PendingAsyncLoad, ResourceTask, ResponseAction};
|
use net_traits::{AsyncResponseTarget, LoadContext, PendingAsyncLoad, ResourceTask, ResponseAction};
|
||||||
use platform::font_context::FontContextHandle;
|
use platform::font_context::FontContextHandle;
|
||||||
use platform::font_list::for_each_available_family;
|
use platform::font_list::for_each_available_family;
|
||||||
|
@ -168,15 +169,31 @@ impl FontCache {
|
||||||
let channel_to_self = self.channel_to_self.clone();
|
let channel_to_self = self.channel_to_self.clone();
|
||||||
let url = (*url).clone();
|
let url = (*url).clone();
|
||||||
let bytes = Mutex::new(Vec::new());
|
let bytes = Mutex::new(Vec::new());
|
||||||
|
let response_valid = Mutex::new(false);
|
||||||
ROUTER.add_route(data_receiver.to_opaque(), box move |message| {
|
ROUTER.add_route(data_receiver.to_opaque(), box move |message| {
|
||||||
let response: ResponseAction = message.to().unwrap();
|
let response: ResponseAction = message.to().unwrap();
|
||||||
match response {
|
match response {
|
||||||
ResponseAction::HeadersAvailable(_) |
|
ResponseAction::HeadersAvailable(metadata) => {
|
||||||
|
let is_response_valid =
|
||||||
|
metadata.content_type.as_ref().map_or(false, |content_type| {
|
||||||
|
let mime = &content_type.0;
|
||||||
|
is_supported_font_type(&mime.0, &mime.1)
|
||||||
|
});
|
||||||
|
info!("{} font with MIME type {:?}",
|
||||||
|
if is_response_valid { "Loading" } else { "Ignoring" },
|
||||||
|
metadata.content_type);
|
||||||
|
*response_valid.lock().unwrap() = is_response_valid;
|
||||||
|
}
|
||||||
ResponseAction::ResponseComplete(Err(_)) => {}
|
ResponseAction::ResponseComplete(Err(_)) => {}
|
||||||
ResponseAction::DataAvailable(new_bytes) => {
|
ResponseAction::DataAvailable(new_bytes) => {
|
||||||
bytes.lock().unwrap().extend(new_bytes.into_iter())
|
if *response_valid.lock().unwrap() {
|
||||||
|
bytes.lock().unwrap().extend(new_bytes.into_iter())
|
||||||
|
}
|
||||||
}
|
}
|
||||||
ResponseAction::ResponseComplete(Ok(_)) => {
|
ResponseAction::ResponseComplete(Ok(_)) => {
|
||||||
|
if !*response_valid.lock().unwrap() {
|
||||||
|
return;
|
||||||
|
}
|
||||||
let mut bytes = bytes.lock().unwrap();
|
let mut bytes = bytes.lock().unwrap();
|
||||||
let bytes = mem::replace(&mut *bytes, Vec::new());
|
let bytes = mem::replace(&mut *bytes, Vec::new());
|
||||||
let command =
|
let command =
|
||||||
|
@ -369,3 +386,18 @@ impl FontCacheTask {
|
||||||
response_port.recv().unwrap();
|
response_port.recv().unwrap();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// derived from http://stackoverflow.com/a/10864297/3830
|
||||||
|
fn is_supported_font_type(toplevel: &TopLevel, sublevel: &SubLevel) -> bool {
|
||||||
|
match (toplevel, sublevel) {
|
||||||
|
(&TopLevel::Application, &SubLevel::Ext(ref ext)) => {
|
||||||
|
match &ext[..] {
|
||||||
|
//FIXME: once sniffing is enabled by default, we shouldn't need nonstandard
|
||||||
|
// MIME types here.
|
||||||
|
"font-sfnt" | "x-font-ttf" | "x-font-truetype" | "x-font-opentype" => true,
|
||||||
|
_ => false,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
_ => false,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -53,6 +53,7 @@ extern crate lazy_static;
|
||||||
extern crate libc;
|
extern crate libc;
|
||||||
#[macro_use]
|
#[macro_use]
|
||||||
extern crate log;
|
extern crate log;
|
||||||
|
extern crate mime;
|
||||||
extern crate msg;
|
extern crate msg;
|
||||||
extern crate net_traits;
|
extern crate net_traits;
|
||||||
#[macro_use]
|
#[macro_use]
|
||||||
|
|
1
components/servo/Cargo.lock
generated
1
components/servo/Cargo.lock
generated
|
@ -623,6 +623,7 @@ dependencies = [
|
||||||
"lazy_static 0.1.15 (registry+https://github.com/rust-lang/crates.io-index)",
|
"lazy_static 0.1.15 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"libc 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
"libc 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"log 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)",
|
"log 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"mime 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"msg 0.0.1",
|
"msg 0.0.1",
|
||||||
"net_traits 0.0.1",
|
"net_traits 0.0.1",
|
||||||
"plugins 0.0.1",
|
"plugins 0.0.1",
|
||||||
|
|
1
ports/cef/Cargo.lock
generated
1
ports/cef/Cargo.lock
generated
|
@ -590,6 +590,7 @@ dependencies = [
|
||||||
"lazy_static 0.1.15 (registry+https://github.com/rust-lang/crates.io-index)",
|
"lazy_static 0.1.15 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"libc 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
"libc 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"log 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)",
|
"log 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"mime 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"msg 0.0.1",
|
"msg 0.0.1",
|
||||||
"net_traits 0.0.1",
|
"net_traits 0.0.1",
|
||||||
"plugins 0.0.1",
|
"plugins 0.0.1",
|
||||||
|
|
1
ports/gonk/Cargo.lock
generated
1
ports/gonk/Cargo.lock
generated
|
@ -580,6 +580,7 @@ dependencies = [
|
||||||
"lazy_static 0.1.15 (registry+https://github.com/rust-lang/crates.io-index)",
|
"lazy_static 0.1.15 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"libc 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
"libc 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"log 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)",
|
"log 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"mime 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"msg 0.0.1",
|
"msg 0.0.1",
|
||||||
"net_traits 0.0.1",
|
"net_traits 0.0.1",
|
||||||
"plugins 0.0.1",
|
"plugins 0.0.1",
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue