Skip to content

Commit 50618b5

Browse files
committed
Error on negative times
1 parent 508df22 commit 50618b5

File tree

1 file changed

+9
-22
lines changed

1 file changed

+9
-22
lines changed

src/shims/time.rs

Lines changed: 9 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -7,15 +7,10 @@ use crate::*;
77

88
// Returns the time elapsed between now and the unix epoch as a `Duration` and the sign of the time
99
// interval
10-
fn get_time() -> (Duration, i128) {
11-
let mut sign = 1;
12-
let duration = SystemTime::now()
10+
fn get_time<'tcx>() -> InterpResult<'tcx, Duration> {
11+
SystemTime::now()
1312
.duration_since(SystemTime::UNIX_EPOCH)
14-
.unwrap_or_else(|e| {
15-
sign = -1;
16-
e.duration()
17-
});
18-
(duration, sign)
13+
.map_err(|_| err_unsup_format!("Time went backwards").into())
1914
}
2015

2116
fn int_to_immty_checked<'tcx>(
@@ -59,13 +54,9 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriEvalContextExt<'mir, 'tcx
5954

6055
let tp = this.force_ptr(this.read_scalar(tp_op)?.not_undef()?)?;
6156

62-
let (duration, sign) = get_time();
63-
let tv_sec = sign * (duration.as_secs() as i128);
64-
let mut tv_nsec = duration.subsec_nanos() as i128;
65-
// If the number of seconds is zero, we need to put the sign into the second's fraction.
66-
if tv_sec == 0 && sign < 0 {
67-
tv_nsec *= sign;
68-
}
57+
let duration = get_time()?;
58+
let tv_sec = duration.as_secs() as i128;
59+
let tv_nsec = duration.subsec_nanos() as i128;
6960

7061
let imms = [
7162
int_to_immty_checked(tv_sec, this.libc_ty_layout("time_t")?)?,
@@ -97,13 +88,9 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriEvalContextExt<'mir, 'tcx
9788

9889
let tv = this.force_ptr(this.read_scalar(tv_op)?.not_undef()?)?;
9990

100-
let (duration, sign) = get_time();
101-
let tv_sec = sign * (duration.as_secs() as i128);
102-
let mut tv_usec = duration.subsec_micros() as i128;
103-
// If the number of seconds is zero, we need to put the sign into the second's fraction.
104-
if tv_sec == 0 && sign < 0 {
105-
tv_usec *= sign;
106-
}
91+
let duration = get_time()?;
92+
let tv_sec = duration.as_secs() as i128;
93+
let tv_usec = duration.subsec_micros() as i128;
10794

10895
let imms = [
10996
int_to_immty_checked(tv_sec, this.libc_ty_layout("time_t")?)?,

0 commit comments

Comments
 (0)