Skip to content

Commit 0545e72

Browse files
authored
Merge pull request #662 from smcv/cmsg
Ensure correct alignment when dealing with control messages
2 parents 759517f + 1fd7c38 commit 0545e72

1 file changed

Lines changed: 11 additions & 9 deletions

File tree

utils.c

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -759,9 +759,9 @@ send_pid_on_socket (int sockfd)
759759
struct msghdr msg = {};
760760
struct iovec iov = { buf, sizeof (buf) };
761761
const ssize_t control_len_snd = CMSG_SPACE(sizeof(struct ucred));
762-
char control_buf_snd[control_len_snd];
762+
_Alignas(struct cmsghdr) 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");
@@ -801,7 +801,7 @@ read_pid_from_socket (int sockfd)
801801
struct msghdr msg = {};
802802
struct iovec iov = { recv_buf, sizeof (recv_buf) };
803803
const ssize_t control_len_rcv = CMSG_SPACE(sizeof(struct ucred));
804-
char control_buf_rcv[control_len_rcv];
804+
_Alignas(struct cmsghdr) char control_buf_rcv[control_len_rcv];
805805
struct cmsghdr* cmsg;
806806

807807
msg.msg_iov = &iov;
@@ -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)