about summary refs log tree commit diff
diff options
context:
space:
mode:
authorErick Tryzelaar <erick.tryzelaar@gmail.com>2013-07-07 00:54:41 -0700
committerErick Tryzelaar <erick.tryzelaar@gmail.com>2013-08-04 13:32:41 -0700
commit0512475fdab549182e73a42c2cd02df0cb710ebf (patch)
tree5a8267135c01ffe6a3b9b6b10067c3a6e00b60cc
parentbb5bf7c3e0f82328e5be5235a92d20bf01bc9915 (diff)
downloadrust-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.rs18
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);