summaryrefslogtreecommitdiffstats
path: root/sys/kern/kern_time.c
diff options
context:
space:
mode:
authorbde <bde@FreeBSD.org>1995-11-19 00:59:22 +0000
committerbde <bde@FreeBSD.org>1995-11-19 00:59:22 +0000
commit89f4ad04aef4f071a50ecf3ac148ff27a9479ae2 (patch)
tree30388c4aa8ee59259ad27fd11c4b020d49ff6339 /sys/kern/kern_time.c
parent0d7eeca0d9f7b757b4aa0e85f3baad0f3a6a737f (diff)
downloadFreeBSD-src-89f4ad04aef4f071a50ecf3ac148ff27a9479ae2.zip
FreeBSD-src-89f4ad04aef4f071a50ecf3ac148ff27a9479ae2.tar.gz
Fixed settimeofday():
- don't allow invalid timevals. - normalize timevals as they are built - don't call timevaladd() with a possibly invalid timeval and normalize the result. Fixed a warning.
Diffstat (limited to 'sys/kern/kern_time.c')
-rw-r--r--sys/kern/kern_time.c12
1 files changed, 7 insertions, 5 deletions
diff --git a/sys/kern/kern_time.c b/sys/kern/kern_time.c
index 24c112e..7959b71 100644
--- a/sys/kern/kern_time.c
+++ b/sys/kern/kern_time.c
@@ -31,7 +31,7 @@
* SUCH DAMAGE.
*
* @(#)kern_time.c 8.1 (Berkeley) 6/10/93
- * $Id: kern_time.c,v 1.10 1995/06/29 07:07:00 davidg Exp $
+ * $Id: kern_time.c,v 1.11 1995/11/12 06:43:02 bde Exp $
*/
#include <sys/param.h>
@@ -108,6 +108,8 @@ settimeofday(p, uap, retval)
if (uap->tv &&
(error = copyin((caddr_t)uap->tv, (caddr_t)&atv, sizeof(atv))))
return (error);
+ if (atv.tv_usec < 0 || atv.tv_usec >= 1000000)
+ return (EINVAL);
if (uap->tzp &&
(error = copyin((caddr_t)uap->tzp, (caddr_t)&atz, sizeof(atz))))
return (error);
@@ -117,12 +119,11 @@ settimeofday(p, uap, retval)
/* nb. delta.tv_usec may be < 0, but this is OK here */
delta.tv_sec = atv.tv_sec - time.tv_sec;
delta.tv_usec = atv.tv_usec - time.tv_usec;
- time = atv;
+ time = atv; /* XXX should avoid skew in tv_usec */
(void) splsoftclock();
+ timevalfix(&delta);
timevaladd(&boottime, &delta);
- timevalfix(&boottime);
timevaladd(&runtime, &delta);
- timevalfix(&runtime);
LEASE_UPDATETIME(delta.tv_sec);
splx(s);
resettodr();
@@ -281,7 +282,8 @@ setitimer(p, uap, retval)
if (itvp && (error = copyin((caddr_t)itvp, (caddr_t)&aitv,
sizeof(struct itimerval))))
return (error);
- if ((uap->itv = uap->oitv) && (error = getitimer(p, uap, retval)))
+ if ((uap->itv = uap->oitv) &&
+ (error = getitimer(p, (struct getitimer_args *)uap, retval)))
return (error);
if (itvp == 0)
return (0);
OpenPOWER on IntegriCloud