diff options
| author | Erick Tryzelaar <erick.tryzelaar@gmail.com> | 2013-07-07 00:54:41 -0700 |
|---|---|---|
| committer | Erick Tryzelaar <erick.tryzelaar@gmail.com> | 2013-08-04 13:32:41 -0700 |
| commit | 0512475fdab549182e73a42c2cd02df0cb710ebf (patch) | |
| tree | 5a8267135c01ffe6a3b9b6b10067c3a6e00b60cc | |
| parent | bb5bf7c3e0f82328e5be5235a92d20bf01bc9915 (diff) | |
| download | rust-0512475fdab549182e73a42c2cd02df0cb710ebf.tar.gz rust-0512475fdab549182e73a42c2cd02df0cb710ebf.zip | |
extra: make sure time::match_digits does not read past the end of the str
| -rw-r--r-- | src/libextra/time.rs | 18 |
1 files changed, 11 insertions, 7 deletions
diff --git a/src/libextra/time.rs b/src/libextra/time.rs index d95ac6d6c25..9cc5d3ba6cc 100644 --- a/src/libextra/time.rs +++ b/src/libextra/time.rs @@ -287,10 +287,14 @@ priv fn do_strptime(s: &str, format: &str) -> Result<Tm, ~str> { fn match_digits(ss: &str, pos: uint, digits: uint, ws: bool) -> Option<(i32, uint)> { let mut pos = pos; + let len = ss.len(); let mut value = 0_i32; let mut i = 0u; while i < digits { + if pos >= len { + return None; + } let range = ss.char_range_at(pos); pos = range.next; @@ -856,7 +860,7 @@ priv fn do_strftime(format: &str, tm: &Tm) -> ~str { #[cfg(test)] mod tests { - use time::*; + use super::*; use std::float; use std::os; @@ -904,7 +908,7 @@ mod tests { os::setenv("TZ", "America/Los_Angeles"); tzset(); - let time = ::time::Timespec::new(1234567890, 54321); + let time = Timespec::new(1234567890, 54321); let utc = at_utc(time); assert!(utc.tm_sec == 30_i32); @@ -925,7 +929,7 @@ mod tests { os::setenv("TZ", "America/Los_Angeles"); tzset(); - let time = ::time::Timespec::new(1234567890, 54321); + let time = Timespec::new(1234567890, 54321); let local = at(time); error!("time_at: %?", local); @@ -953,7 +957,7 @@ mod tests { os::setenv("TZ", "America/Los_Angeles"); tzset(); - let time = ::time::Timespec::new(1234567890, 54321); + let time = Timespec::new(1234567890, 54321); let utc = at_utc(time); assert_eq!(utc.to_timespec(), time); @@ -964,7 +968,7 @@ mod tests { os::setenv("TZ", "America/Los_Angeles"); tzset(); - let time = ::time::Timespec::new(1234567890, 54321); + let time = Timespec::new(1234567890, 54321); let utc = at_utc(time); let local = at(time); @@ -1145,7 +1149,7 @@ mod tests { os::setenv("TZ", "America/Los_Angeles"); tzset(); - let time = ::time::Timespec::new(1234567890, 54321); + let time = Timespec::new(1234567890, 54321); let utc = at_utc(time); let local = at(time); @@ -1159,7 +1163,7 @@ mod tests { os::setenv("TZ", "America/Los_Angeles"); tzset(); - let time = ::time::Timespec::new(1234567890, 54321); + let time = Timespec::new(1234567890, 54321); let utc = at_utc(time); let local = at(time); |
