diff options
author | 2014-01-22 00:48:36 +0000 | |
---|---|---|
committer | 2014-01-22 00:48:36 +0000 | |
commit | 3a26fe5974fe5025f6a65a79e316acbd3d8e43fd (patch) | |
tree | b5214f6fac256aae0842bdd84cb442195ba18f32 /sys/kern/kern_time.c | |
parent | Missing #include (diff) | |
download | wireguard-openbsd-3a26fe5974fe5025f6a65a79e316acbd3d8e43fd.tar.xz wireguard-openbsd-3a26fe5974fe5025f6a65a79e316acbd3d8e43fd.zip |
timeval, timespec, and itimerval have padding on many archs. If we're
going to copyout one, memset the structure and then set it member by member.
sys_adjtime() does that on copyin instead, as it already has to munge the
members as it goes.
ok deraadt@
Diffstat (limited to 'sys/kern/kern_time.c')
-rw-r--r-- | sys/kern/kern_time.c | 36 |
1 files changed, 24 insertions, 12 deletions
diff --git a/sys/kern/kern_time.c b/sys/kern/kern_time.c index 076d24c4132..858d860b50f 100644 --- a/sys/kern/kern_time.c +++ b/sys/kern/kern_time.c @@ -1,4 +1,4 @@ -/* $OpenBSD: kern_time.c,v 1.85 2013/10/25 04:42:48 guenther Exp $ */ +/* $OpenBSD: kern_time.c,v 1.86 2014/01/22 00:48:36 guenther Exp $ */ /* $NetBSD: kern_time.c,v 1.20 1996/02/18 11:57:06 fvdl Exp $ */ /* @@ -160,6 +160,7 @@ sys_clock_gettime(struct proc *p, void *v, register_t *retval) struct timespec ats; int error; + memset(&ats, 0, sizeof(ats)); if ((error = clock_gettime(p, SCARG(uap, clock_id), &ats)) != 0) return (error); @@ -217,6 +218,7 @@ sys_clock_getres(struct proc *p, void *v, register_t *retval) struct proc *q; int error = 0; + memset(&ts, 0, sizeof(ts)); clock_id = SCARG(uap, clock_id); switch (clock_id) { case CLOCK_REALTIME: @@ -297,6 +299,7 @@ sys_nanosleep(struct proc *p, void *v, register_t *retval) if (rmtp) { getnanouptime(&ets); + memset(&rmt, 0, sizeof(rmt)); timespecsub(&ets, &sts, &sts); timespecsub(&rqt, &sts, &rmt); @@ -335,6 +338,7 @@ sys_gettimeofday(struct proc *p, void *v, register_t *retval) tzp = SCARG(uap, tzp); if (tp) { + memset(&atv, 0, sizeof(atv)); microtime(&atv); if ((error = copyout(&atv, tp, sizeof (atv)))) return (error); @@ -424,6 +428,7 @@ sys_adjtime(struct proc *p, void *v, register_t *retval) syscallarg(const struct timeval *) delta; syscallarg(struct timeval *) olddelta; } */ *uap = v; + struct timeval newdelta; const struct timeval *delta = SCARG(uap, delta); struct timeval *olddelta = SCARG(uap, olddelta); int error; @@ -437,19 +442,22 @@ sys_adjtime(struct proc *p, void *v, register_t *retval) if ((error = suser(p, 0))) return (error); - if ((error = copyin(delta, &adjtimedelta, + if ((error = copyin(delta, &newdelta, sizeof(struct timeval)))) return (error); - } - /* Normalize the correction. */ - while (adjtimedelta.tv_usec >= 1000000) { - adjtimedelta.tv_usec -= 1000000; - adjtimedelta.tv_sec += 1; - } - while (adjtimedelta.tv_usec < 0) { - adjtimedelta.tv_usec += 1000000; - adjtimedelta.tv_sec -= 1; + /* Normalize the correction. */ + while (newdelta.tv_usec >= 1000000) { + newdelta.tv_usec -= 1000000; + newdelta.tv_sec += 1; + } + while (newdelta.tv_usec < 0) { + newdelta.tv_usec += 1000000; + newdelta.tv_sec -= 1; + } + + adjtimedelta.tv_sec = newdelta.tv_sec; + adjtimedelta.tv_usec = newdelta.tv_usec; } return (0); } @@ -490,8 +498,12 @@ sys_getitimer(struct proc *p, void *v, register_t *retval) if (which < ITIMER_REAL || which > ITIMER_PROF) return (EINVAL); + memset(&aitv, 0, sizeof(aitv)); s = splclock(); - aitv = p->p_p->ps_timer[which]; + aitv.it_interval.tv_sec = p->p_p->ps_timer[which].it_interval.tv_sec; + aitv.it_interval.tv_usec = p->p_p->ps_timer[which].it_interval.tv_usec; + aitv.it_value.tv_sec = p->p_p->ps_timer[which].it_value.tv_sec; + aitv.it_value.tv_usec = p->p_p->ps_timer[which].it_value.tv_usec; if (which == ITIMER_REAL) { struct timeval now; |