linux: fix ntp_gettime abi break (BZ# 30156)

Between versions v2.11 and v2.12 struct ntptimeval got new fields.
That wasn't a problem because new function ntp_gettimex was created
(and made default) to support new struct.  Old ntp_gettime was not
using new fields so it was safe to call with old struct
definition.  Then commits 5613afe9e3 and b6ad64b907 (added for
64 bit time_t support), ntp_gettime start setting new fields.

Sets fields manually to maintain compatibility with v2.11 struct
definition.

Resolves #30156

Reviewed-by: Adhemerval Zanella  <adhemerval.zanella@linaro.org>
This commit is contained in:
Kacper Piwiński 2023-03-09 11:38:59 +01:00 committed by Adhemerval Zanella
parent f7e751affb
commit e78c4c4983

View file

@ -26,6 +26,11 @@
# define modes mode
#endif
/* glibc 2.12 added the 'tai' field to follow along the kernel, but it did
not add a compatibility symbol, instead it added __ntp_gettimex. However
ntptimeval was still used in both cases, so to keep compatibility it
can not set all the new field. */
/* clock_adjtime64 with CLOCK_REALTIME does not trigger EINVAL,
ENODEV, or EOPNOTSUPP. It might still trigger EPERM. */
@ -40,7 +45,7 @@ __ntp_gettime64 (struct __ntptimeval64 *ntv)
ntv->time = tntx.time;
ntv->maxerror = tntx.maxerror;
ntv->esterror = tntx.esterror;
ntv->tai = tntx.tai;
return result;
}
@ -54,7 +59,9 @@ __ntp_gettime (struct ntptimeval *ntv)
int result;
result = __ntp_gettime64 (&ntv64);
*ntv = valid_ntptimeval64_to_ntptimeval (ntv64);
ntv->time = valid_timeval64_to_timeval (ntv64.time);
ntv->maxerror = ntv64.maxerror;
ntv->esterror = ntv64.esterror;
return result;
}