recvmsg() length report

Fred Wright fw at fwright.net
Thu Feb 6 23:17:07 UTC 2025


On Tue, 4 Feb 2025, Hal Murray wrote:
>
>> As Alice would say, "curiouser and curiouser".  Just when I think I've
>> figured out the reason for one bit of bizarreness, you find another. :-)
>
> I think the current code works on all my systems.
>
>
>> What's the breakdown in the 32-bit NetBSD case?  One would hope that the
>> payload is 64+32 and not vice versa.
>
> #define NTP_SIZEOF_LONG 4 /* Size of long from <None> */
> #define NTP_SIZEOF_STRUCT_TIMESPEC 12 /* Size of struct timespec from
> <time.h> *
> /
> #define NTP_SIZEOF_STRUCT_TIMEVAL 12 /* Size of struct timeval from
> <sys/time.h>
> */
> #define NTP_SIZEOF_TIME_T 8 /* Size of time_t from <time.h> */
>
> [This is an example of why I want that sizeof stuff.]

By "breakdown" I meant the sizes actually seen by the compiler, not some 
separately derived macros.

I decided that it's best just to have an easily run standalone test for 
this issue, rather than relying on hacking ntpd itself.  I have a little 
more work to do on it, and will submit it as a separate MR (for the 
'attic') when I'm done.

One thing I've found already is that those apparent 20-byte payloads are 
bogus.  What's actually happening in those cases is that the *header* is 
getting padded to a 64-bit boundary.  This is reflected in the behavior of 
CMSG_DATA, but not in sizeof(struct cmsghdr).

After I finish the test program, I'll revisit the actual fix, in light of 
new understanding.

Fred Wright


More information about the devel mailing list