ntpsec | ntp_packetstamp: Fix possible time_t size mismatch. (!1414)

Fred Wright fw at fwright.net
Wed Dec 25 01:22:42 UTC 2024


On Tue, 24 Dec 2024, Gary E. Miller via devel wrote:

> On Tue, 24 Dec 2024 15:21:14 -0800 (PST)
> Fred Wright via devel <devel at ntpsec.org> wrote:
>
>> On Tue, 24 Dec 2024, Gary E. Miller (@garyedmundsmiller) wrote:
>>> Gary E_ Miller
>>> commented: https://gitlab.com/NTPsec/ntpsec/-/merge_requests/1414#note_2273464732
>>>
>>>
>>> I don't know about OSX, but this is not the proper GNU libc fix.
>>>
>>> With GNU libc, the size of time_t on 32-bit ABI depends on two
>>> #defines.
>>>
>>> '-D_FILE_OFFSET_BITS=64', '-D_TIME_BITS=64',
>>>
>>> This is the nut of issue #832.  No heuristics needed, just check
>>> the two #define.  And they change a more than just time_t.
>>
>> You're missing the point.  If the format of the timestamp returned
>> with the packet differs from the userspace format that the userspace
>> code expects (regardless of what that userspace format is), the
>> timestamp needs to be converted.
>
> Sorry, I should have read closer, if you are just looking at the
> on the wire NTP packet then my comments are not on point.  I though
> the NTP packets were fixed by RFC?

No, this has nothing to do with the packet on the wire.  It also has 
nothing to do with issue 832.  It has to do with packets' *locally 
captured* timestamps that are provided as auxiliary data when requested by 
socket options SO_TIMESTAMP, SO_CLOCK, or SO_TIMESTAMPNS.

The issue is that the kernel provides a struct timeval or struct timespec 
based on *its* notion of time_t.  Although it can presumably know the 
bitness of the relevant process (though whether that's plumbed through to 
the relevant code is questionable), it doesn't necessarily know what 
options the userspace code is built with, so the version of 
timeval/timespec it's returning may not match the userspace definition.

Dealing with this in userspace is straightforward, because the size of the 
timestamp-containing cmsg provided along with the packet is contained in 
the cmsghdr, and the payload size should be either 8 or 12, depending on 
the kernel's time_t size.  The userspace code can then either use it 
verbatim if it's the expected size, or convert it by copying if it's not.

It's unlikely that the problem is nonexistent on Linux, but it may be that 
glibc for Linux handles it internally and makes it invisible to the 
caller.  In that case, the wrapper function is just a harmless (and 
probably desirable) sanity check on the cmsg length, plus a handful of 
unreachable CPU instructions.

Fred Wright


More information about the devel mailing list