ping: Verify whether a datagram timestamp was actually received.

ping(8) uses SO_TIMESTAMP, which attaches a timestamp to each IP datagram at
the time it's received by the kernel.  Except that occasionally it doesn't.
Add a check to see whether such a timestamp was actually set before trying
to read it.  This fixes segfaults that can happen when the kernel doesn't
attach a timestamp.

The bug has always existed, but prior to r351461 it manifested as an
implausible round-trip-time, not a segfault.

Reported by:	pho
MFC after:	3 days
MFC-With:	351461
This commit is contained in:
asomers 2019-09-11 18:54:45 +00:00
parent b799855a78
commit 6a82e3a0a3

View File

@ -931,7 +931,8 @@ main(int argc, char *const *argv)
continue;
}
#ifdef SO_TIMESTAMP
if (cmsg->cmsg_level == SOL_SOCKET &&
if (cmsg != NULL &&
cmsg->cmsg_level == SOL_SOCKET &&
cmsg->cmsg_type == SCM_TIMESTAMP &&
cmsg->cmsg_len == CMSG_LEN(sizeof *tv)) {
/* Copy to avoid alignment problems: */