Date: Thu, 23 Apr 2020 09:48:03 +0000 (UTC) From: Konstantin Belousov <kib@FreeBSD.org> To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-12@freebsd.org Subject: svn commit: r360220 - stable/12/lib/libc/sys Message-ID: <202004230948.03N9m3d0038782@repo.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: kib Date: Thu Apr 23 09:48:02 2020 New Revision: 360220 URL: https://svnweb.freebsd.org/changeset/base/360220 Log: MFC r359758: libc: Fix possible overflow in binuptime(). Modified: stable/12/lib/libc/sys/__vdso_gettimeofday.c Directory Properties: stable/12/ (props changed) Modified: stable/12/lib/libc/sys/__vdso_gettimeofday.c ============================================================================== --- stable/12/lib/libc/sys/__vdso_gettimeofday.c Thu Apr 23 09:37:22 2020 (r360219) +++ stable/12/lib/libc/sys/__vdso_gettimeofday.c Thu Apr 23 09:48:02 2020 (r360220) @@ -32,6 +32,7 @@ __FBSDID("$FreeBSD$"); #include <sys/time.h> #include <sys/vdso.h> #include <errno.h> +#include <strings.h> #include <time.h> #include <machine/atomic.h> #include "libc_private.h" @@ -62,7 +63,8 @@ binuptime(struct bintime *bt, struct vdso_timekeep *tk { struct vdso_timehands *th; uint32_t curr, gen; - u_int delta; + uint64_t scale, x; + u_int delta, scale_bits; int error; do { @@ -78,7 +80,19 @@ binuptime(struct bintime *bt, struct vdso_timekeep *tk continue; if (error != 0) return (error); - bintime_addx(bt, th->th_scale * delta); + scale = th->th_scale; +#ifdef _LP64 + scale_bits = ffsl(scale); +#else + scale_bits = ffsll(scale); +#endif + if (__predict_false(scale_bits + fls(delta) > 63)) { + x = (scale >> 32) * delta; + scale &= 0xffffffff; + bt->sec += x >> 32; + bintime_addx(bt, x << 32); + } + bintime_addx(bt, scale * delta); if (abs) bintime_add(bt, &th->th_boottime);
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?202004230948.03N9m3d0038782>