mirror of
https://sourceware.org/git/glibc.git
synced 2025-12-24 17:51:17 +03:00
The __convert_scm_timestamps() only updates the control message last pointer for SOL_SOCKET type, so if the message control buffer contains multiple ancillary message types the converted timestamp one might overwrite a valid message. The test check if the extra ancillary space is correctly handled by recvmsg/recvmmsg, where if there is no extra space for the 64-bit time_t converted message the control buffer should be marked with MSG_TRUNC. It also check if recvmsg/recvmmsg handle correctly multiple ancillary data. Checked on x86_64-linux and on i686-linux-gnu on both 5.11 and 4.15 kernel. Co-authored-by: Fabian Vogt <fvogt@suse.de>
This commit is contained in:
@@ -54,6 +54,8 @@ __convert_scm_timestamps (struct msghdr *msg, socklen_t msgsize)
|
||||
cmsg != NULL;
|
||||
cmsg = CMSG_NXTHDR (msg, cmsg))
|
||||
{
|
||||
last = cmsg;
|
||||
|
||||
if (cmsg->cmsg_level != SOL_SOCKET)
|
||||
continue;
|
||||
|
||||
@@ -75,8 +77,6 @@ __convert_scm_timestamps (struct msghdr *msg, socklen_t msgsize)
|
||||
tvts[1] = tmp[1];
|
||||
break;
|
||||
}
|
||||
|
||||
last = cmsg;
|
||||
}
|
||||
|
||||
if (last == NULL || type == 0)
|
||||
@@ -88,10 +88,11 @@ __convert_scm_timestamps (struct msghdr *msg, socklen_t msgsize)
|
||||
return;
|
||||
}
|
||||
|
||||
/* Zero memory for the new cmsghdr, required by CMSG_NXTHDR. */
|
||||
memset (msg->msg_control + msg->msg_controllen, 0,
|
||||
CMSG_SPACE (sizeof tvts));
|
||||
msg->msg_controllen += CMSG_SPACE (sizeof tvts);
|
||||
cmsg = CMSG_NXTHDR(msg, last);
|
||||
if (cmsg == NULL)
|
||||
return;
|
||||
cmsg = CMSG_NXTHDR (msg, last);
|
||||
cmsg->cmsg_level = SOL_SOCKET;
|
||||
cmsg->cmsg_type = type;
|
||||
cmsg->cmsg_len = CMSG_LEN (sizeof tvts);
|
||||
|
||||
Reference in New Issue
Block a user