diff options
author | Emilio Cobos Álvarez <ecoal95@gmail.com> | 2016-01-04 14:58:57 +0100 |
---|---|---|
committer | Emilio Cobos Álvarez <ecoal95@gmail.com> | 2016-01-04 15:19:29 +0100 |
commit | 9ad49c8aa1524f597707aaa4ea937a48534b2415 (patch) | |
tree | 5f970e782ac96dbb99244fdf9cdcb90a223d738d /components/script/dom/crypto.rs | |
parent | 4d32444bf731f75c29e6bad7777ae8eacb96bcdc (diff) | |
download | servo-9ad49c8aa1524f597707aaa4ea937a48534b2415.tar.gz servo-9ad49c8aa1524f597707aaa4ea937a48534b2415.zip |
conversion: Extrapolate array_buffer_view_data
And use it instead of the raw jsapi calls.
Diffstat (limited to 'components/script/dom/crypto.rs')
-rw-r--r-- | components/script/dom/crypto.rs | 25 |
1 files changed, 12 insertions, 13 deletions
diff --git a/components/script/dom/crypto.rs b/components/script/dom/crypto.rs index c0181a9a900..bd75b58db1b 100644 --- a/components/script/dom/crypto.rs +++ b/components/script/dom/crypto.rs @@ -3,6 +3,7 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ use dom::bindings::cell::DOMRefCell; +use dom::bindings::conversions::array_buffer_view_data; use dom::bindings::codegen::Bindings::CryptoBinding; use dom::bindings::codegen::Bindings::CryptoBinding::CryptoMethods; use dom::bindings::error::{Error, Fallible}; @@ -10,9 +11,8 @@ use dom::bindings::global::GlobalRef; use dom::bindings::js::Root; use dom::bindings::reflector::{Reflector, reflect_dom_object}; use js::jsapi::{JSContext, JSObject}; -use js::jsapi::{JS_GetArrayBufferViewType, JS_GetObjectAsArrayBufferView, Type}; +use js::jsapi::{JS_GetArrayBufferViewType, Type}; use rand::{OsRng, Rng}; -use std::{ptr, slice}; no_jsmanaged_fields!(OsRng); @@ -43,24 +43,23 @@ impl CryptoMethods for Crypto { _cx: *mut JSContext, input: *mut JSObject) -> Fallible<*mut JSObject> { - let mut length = 0; - let mut data = ptr::null_mut(); - if unsafe { JS_GetObjectAsArrayBufferView(input, &mut length, &mut data).is_null() } { - return Err(Error::Type("Argument to Crypto.getRandomValues is not an ArrayBufferView" + let mut data = match unsafe { array_buffer_view_data::<u8>(input) } { + Some(data) => data, + None => { + return Err(Error::Type("Argument to Crypto.getRandomValues is not an ArrayBufferView" .to_owned())); - } + } + }; + if !is_integer_buffer(input) { return Err(Error::TypeMismatch); } - if length > 65536 { + + if data.len() > 65536 { return Err(Error::QuotaExceeded); } - let mut buffer = unsafe { - slice::from_raw_parts_mut(data, length as usize) - }; - - self.rng.borrow_mut().fill_bytes(&mut buffer); + self.rng.borrow_mut().fill_bytes(&mut data); Ok(input) } |