From: Michael Kelly Date: Wed, 15 Apr 2026 20:18:52 +0000 (+0200) Subject: hurd: __adjtime(): struct timeval and time_value_t are not identical. X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=e1ca9dea05d879c69cc9772253382f77efe627ef;p=thirdparty%2Fglibc.git hurd: __adjtime(): struct timeval and time_value_t are not identical. 'struct timeval' and 'struct time_value' have different types for the microseconds component: int and long int. Casting one to the other leads to negative numbers not being preserved properly within the called code. Message-ID: <20260415180318.109742-3-mike@weatherwax.co.uk> --- diff --git a/sysdeps/mach/hurd/adjtime.c b/sysdeps/mach/hurd/adjtime.c index 915b86da13..9d01533b23 100644 --- a/sysdeps/mach/hurd/adjtime.c +++ b/sysdeps/mach/hurd/adjtime.c @@ -28,31 +28,36 @@ __adjtime (const struct timeval *delta, struct timeval *olddelta) { error_t err; mach_port_t hostpriv; - struct timeval dummy; + time_value_t rpc_delta, rpc_olddelta; err = __get_privileged_ports (&hostpriv, NULL); if (err) return __hurd_fail (EPERM); - if (olddelta == NULL) - olddelta = &dummy; - if (delta != NULL) { if (delta->tv_usec >= TIME_MICROS_MAX || delta->tv_usec <= -TIME_MICROS_MAX) return EINVAL; + + rpc_delta.seconds = delta->tv_sec; + rpc_delta.microseconds = delta->tv_usec; } + else + return EINVAL; - err = __host_adjust_time (hostpriv, - /* `time_value_t' and `struct timeval' are in - fact identical with the names changed. */ - *(time_value_t *) delta, - (time_value_t *) olddelta); + err = __host_adjust_time (hostpriv, rpc_delta, &rpc_olddelta); __mach_port_deallocate (__mach_task_self (), hostpriv); if (err) return __hurd_fail (err); + + if (olddelta != NULL) + { + olddelta->tv_sec = rpc_olddelta.seconds; + olddelta->tv_usec = rpc_olddelta.microseconds; + } + return 0; }