@@ -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