diff options
author | Anthony Ramine <n.oxyde@gmail.com> | 2015-05-15 01:59:59 +0200 |
---|---|---|
committer | Anthony Ramine <n.oxyde@gmail.com> | 2015-05-15 01:59:59 +0200 |
commit | d0f62c7b73121d8d18af6c76775df991f82b8260 (patch) | |
tree | 2f08bd56d0f42e889cbfe19345b4fbd3e514f624 /components/script/dom/characterdata.rs | |
parent | 8979d77e77f58b2061d9cec81a08b7e6bf6c6e6a (diff) | |
download | servo-d0f62c7b73121d8d18af6c76775df991f82b8260.tar.gz servo-d0f62c7b73121d8d18af6c76775df991f82b8260.zip |
Fix overflow in CharacterData
Diffstat (limited to 'components/script/dom/characterdata.rs')
-rw-r--r-- | components/script/dom/characterdata.rs | 34 |
1 files changed, 18 insertions, 16 deletions
diff --git a/components/script/dom/characterdata.rs b/components/script/dom/characterdata.rs index 3ea3609c7d7..017bc79f5a2 100644 --- a/components/script/dom/characterdata.rs +++ b/components/script/dom/characterdata.rs @@ -21,7 +21,6 @@ use util::str::DOMString; use std::borrow::ToOwned; use std::cell::Ref; -use std::cmp; // https://dom.spec.whatwg.org/#characterdata #[dom_struct] @@ -68,47 +67,50 @@ impl<'a> CharacterDataMethods for JSRef<'a, CharacterData> { data.chars().count() as u32 } - // https://dom.spec.whatwg.org/#dom-characterdata-substringdata + // https://dom.spec.whatwg.org/#dom-characterdata-substringdataoffset-count fn SubstringData(self, offset: u32, count: u32) -> Fallible<DOMString> { let data = self.data.borrow(); // Step 1. - let len = data.chars().count(); - if offset as usize > len { + let length = data.chars().count() as u32; + if offset > length { // Step 2. return Err(IndexSize); } - // Step 3. - let end = cmp::min((offset + count) as usize, len); - // Step 4. - Ok(data.slice_chars(offset as usize, end).to_owned()) + // Steps 3-4. + let end = if length - offset < count { length } else { offset + count }; + Ok(data.slice_chars(offset as usize, end as usize).to_owned()) } - // https://dom.spec.whatwg.org/#dom-characterdata-appenddata + // https://dom.spec.whatwg.org/#dom-characterdata-appenddatadata fn AppendData(self, data: DOMString) { self.data.borrow_mut().push_str(&data); } - // https://dom.spec.whatwg.org/#dom-characterdata-insertdata + // https://dom.spec.whatwg.org/#dom-characterdata-insertdataoffset-data fn InsertData(self, offset: u32, arg: DOMString) -> ErrorResult { self.ReplaceData(offset, 0, arg) } - // https://dom.spec.whatwg.org/#dom-characterdata-deletedata + // https://dom.spec.whatwg.org/#dom-characterdata-deletedataoffset-count fn DeleteData(self, offset: u32, count: u32) -> ErrorResult { self.ReplaceData(offset, count, "".to_owned()) } - // https://dom.spec.whatwg.org/#dom-characterdata-replacedata + // https://dom.spec.whatwg.org/#dom-characterdata-replacedataoffset-count-data fn ReplaceData(self, offset: u32, count: u32, arg: DOMString) -> ErrorResult { + // Step 1. let length = self.data.borrow().chars().count() as u32; if offset > length { + // Step 2. return Err(IndexSize); } - let count = if offset + count > length { - length - offset - } else { - count + // Step 3. + let count = match length - offset { + diff if diff < count => diff, + _ => count, }; + // Step 4: Mutation observers. + // Step 5. let mut data = self.data.borrow().slice_chars(0, offset as usize).to_owned(); data.push_str(&arg); data.push_str(&self.data.borrow().slice_chars((offset + count) as usize, length as usize)); |