Skip to content

Commit 3392345

Browse files
committed
utils: Don't assume cmsg data is aligned suitably for struct ucred
As documented in cmsg(3), the alignment of control messages is not guaranteed, so for portability to architectures with strong alignment requirements we should memcpy to and from a suitably aligned instance of the desired data structure on the stack. Helps: #637 Signed-off-by: Simon McVittie <smcv@collabora.com>
1 parent 759517f commit 3392345

1 file changed

Lines changed: 9 additions & 7 deletions

File tree

utils.c

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -761,7 +761,7 @@ send_pid_on_socket (int sockfd)
761761
const ssize_t control_len_snd = CMSG_SPACE(sizeof(struct ucred));
762762
char control_buf_snd[control_len_snd];
763763
struct cmsghdr *cmsg;
764-
struct ucred *cred;
764+
struct ucred cred;
765765

766766
msg.msg_iov = &iov;
767767
msg.msg_iovlen = 1;
@@ -772,11 +772,11 @@ send_pid_on_socket (int sockfd)
772772
cmsg->cmsg_level = SOL_SOCKET;
773773
cmsg->cmsg_type = SCM_CREDENTIALS;
774774
cmsg->cmsg_len = CMSG_LEN(sizeof(struct ucred));
775-
cred = (struct ucred *)CMSG_DATA(cmsg);
776775

777-
cred->pid = getpid ();
778-
cred->uid = geteuid ();
779-
cred->gid = getegid ();
776+
cred.pid = getpid ();
777+
cred.uid = geteuid ();
778+
cred.gid = getegid ();
779+
memcpy (CMSG_DATA (cmsg), &cred, sizeof (cred));
780780

781781
if (TEMP_FAILURE_RETRY (sendmsg (sockfd, &msg, 0)) < 0)
782782
die_with_error ("Can't send pid");
@@ -822,8 +822,10 @@ read_pid_from_socket (int sockfd)
822822
cmsg->cmsg_type == SCM_CREDENTIALS &&
823823
payload_len == sizeof(struct ucred))
824824
{
825-
struct ucred *cred = (struct ucred *)CMSG_DATA(cmsg);
826-
return cred->pid;
825+
struct ucred cred;
826+
827+
memcpy (&cred, CMSG_DATA (cmsg), sizeof (cred));
828+
return cred.pid;
827829
}
828830
}
829831
die ("No pid returned on socket");

0 commit comments

Comments
 (0)