Re: [PATCH 3/3] vdso/gettimeofday: Assert that the clock id fits the dispatch mask
From: Thomas Weißschuh
Date: Mon Aug 31 2026 - 09:35:36 EST
On Mon, Aug 31, 2026 at 08:55:57PM +0800, Zhan Xusheng wrote:
> The clock id dispatch turns the id into a bit in a u32:
>
> if (!vdso_clockid_valid(clock))
> return false;
> msk = 1U << clock;
>
> vdso_clockid_valid() admits everything up to CLOCK_AUX_LAST, which is 23,
> so the shift is in range. Nothing states the dependency though, and
> raising MAX_AUX_CLOCKS past 16 would take CLOCK_AUX_LAST to 32 or beyond
> and make the shift undefined.
>
> Assert it at both dispatch sites. The condition is on a parameter rather
> than a constant, so it relies on the compiler deriving the range from the
> vdso_clockid_valid() bail-out above it. gcc 13 and clang 18 both do: x86
> vdso64 and vdso32 build clean, and raising MAX_AUX_CLOCKS to 17 fails the
> assert as intended.
>
> Suggested-by: Thomas Weißschuh <thomas.weissschuh@xxxxxxxxxxxxx>
Reviewed-by: Thomas Weißschuh <thomas.weissschuh@xxxxxxxxxxxxx>
Thanks!
> Signed-off-by: Zhan Xusheng <zhanxusheng@xxxxxxxxxx>
> ---
> lib/vdso/gettimeofday.c | 2 ++
> 1 file changed, 2 insertions(+)
>
> diff --git a/lib/vdso/gettimeofday.c b/lib/vdso/gettimeofday.c
> index f7a591aba59f..ef4dcc614489 100644
> --- a/lib/vdso/gettimeofday.c
> +++ b/lib/vdso/gettimeofday.c
> @@ -285,6 +285,7 @@ __cvdso_clock_gettime_common(const struct vdso_time_data *vd, clockid_t clock,
> * Convert the clockid to a bitmask and use it to check which
> * clocks are handled in the VDSO directly.
> */
> + BUILD_BUG_ON(clock >= BITS_PER_TYPE(msk));
> msk = 1U << clock;
> if (likely(msk & VDSO_HRES))
> vc = &vc[CS_HRES_COARSE];
> @@ -438,6 +439,7 @@ bool __cvdso_clock_getres_common(const struct vdso_time_data *vd, clockid_t cloc
> * Convert the clockid to a bitmask and use it to check which
> * clocks are handled in the VDSO directly.
> */
> + BUILD_BUG_ON(clock >= BITS_PER_TYPE(msk));
> msk = 1U << clock;
> if (msk & (VDSO_HRES | VDSO_RAW)) {
> /*
> --
> 2.43.0
>