Skip to content

Commit 0512475

Browse files
committed
extra: make sure time::match_digits does not read past the end of the str
1 parent bb5bf7c commit 0512475

File tree

1 file changed

+11
-7
lines changed

1 file changed

+11
-7
lines changed

src/libextra/time.rs

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -287,10 +287,14 @@ priv fn do_strptime(s: &str, format: &str) -> Result<Tm, ~str> {
287287
fn match_digits(ss: &str, pos: uint, digits: uint, ws: bool)
288288
-> Option<(i32, uint)> {
289289
let mut pos = pos;
290+
let len = ss.len();
290291
let mut value = 0_i32;
291292

292293
let mut i = 0u;
293294
while i < digits {
295+
if pos >= len {
296+
return None;
297+
}
294298
let range = ss.char_range_at(pos);
295299
pos = range.next;
296300

@@ -856,7 +860,7 @@ priv fn do_strftime(format: &str, tm: &Tm) -> ~str {
856860

857861
#[cfg(test)]
858862
mod tests {
859-
use time::*;
863+
use super::*;
860864

861865
use std::float;
862866
use std::os;
@@ -904,7 +908,7 @@ mod tests {
904908
os::setenv("TZ", "America/Los_Angeles");
905909
tzset();
906910

907-
let time = ::time::Timespec::new(1234567890, 54321);
911+
let time = Timespec::new(1234567890, 54321);
908912
let utc = at_utc(time);
909913

910914
assert!(utc.tm_sec == 30_i32);
@@ -925,7 +929,7 @@ mod tests {
925929
os::setenv("TZ", "America/Los_Angeles");
926930
tzset();
927931
928-
let time = ::time::Timespec::new(1234567890, 54321);
932+
let time = Timespec::new(1234567890, 54321);
929933
let local = at(time);
930934
931935
error!("time_at: %?", local);
@@ -953,7 +957,7 @@ mod tests {
953957
os::setenv("TZ", "America/Los_Angeles");
954958
tzset();
955959
956-
let time = ::time::Timespec::new(1234567890, 54321);
960+
let time = Timespec::new(1234567890, 54321);
957961
let utc = at_utc(time);
958962
959963
assert_eq!(utc.to_timespec(), time);
@@ -964,7 +968,7 @@ mod tests {
964968
os::setenv("TZ", "America/Los_Angeles");
965969
tzset();
966970
967-
let time = ::time::Timespec::new(1234567890, 54321);
971+
let time = Timespec::new(1234567890, 54321);
968972
let utc = at_utc(time);
969973
let local = at(time);
970974
@@ -1145,7 +1149,7 @@ mod tests {
11451149
os::setenv("TZ", "America/Los_Angeles");
11461150
tzset();
11471151
1148-
let time = ::time::Timespec::new(1234567890, 54321);
1152+
let time = Timespec::new(1234567890, 54321);
11491153
let utc = at_utc(time);
11501154
let local = at(time);
11511155
@@ -1159,7 +1163,7 @@ mod tests {
11591163
os::setenv("TZ", "America/Los_Angeles");
11601164
tzset();
11611165
1162-
let time = ::time::Timespec::new(1234567890, 54321);
1166+
let time = Timespec::new(1234567890, 54321);
11631167
let utc = at_utc(time);
11641168
let local = at(time);
11651169

0 commit comments

Comments
 (0)