linux-user: support target-to-host SCM_CREDENTIALS
PATCH v2 1/1 linux-user: support target-to-host SCM_CREDENTIALS
When passing ancillary data through a unix socket, handle credentials properly instead of doing a simple copy and issuing a warning.
Signed-off-by Alex Suykov <[email protected]>
---
v2 fixes 80-column formatting warnings from checkpatch.
linux-user/syscall.c | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-)
linux-user/syscall.c +14 -4
@@ -1214,16 +1214,26 @@ static inline abi_long target_to_host_cmsg(struct msghdr *msgh, cmsg->cmsg_type =tswap32 (target_cmsg->cmsg_type); cmsg->cmsg_len =CMSG_LEN (len); -if (cmsg->cmsg_level !=SOL_SOCKET || cmsg->cmsg_type !=SCM_RIGHTS ) { -gemu_log ("Unsupported ancillary data: %d/%d\n" , cmsg->cmsg_level, cmsg->cmsg_type); -memcpy (data, target_data, len); - }else { +if (cmsg->cmsg_level ==SOL_SOCKET && cmsg->cmsg_type ==SCM_RIGHTS ) {int *fd = (int *)data;int *target_fd = (int *)target_data;int i, numfds = len /sizeof (int );for (i =0 ; i < numfds; i++) fd[i] =tswap32 (target_fd[i]); + }else if (cmsg->cmsg_level ==SOL_SOCKET + && cmsg->cmsg_type ==SCM_CREDENTIALS ) { +struct ucred *cred = (struct ucred *)data; +struct target_ucred *target_cred = + (struct target_ucred *)target_data; + +__put_user (target_cred->pid, &cred->pid); +__put_user (target_cred->uid, &cred->uid); +__put_user (target_cred->gid, &cred->gid); + }else { +gemu_log ("Unsupported ancillary data: %d/%d\n" , + cmsg->cmsg_level, cmsg->cmsg_type); +memcpy (data, target_data, len); } cmsg =CMSG_NXTHDR (msgh, cmsg);
Signature · 1 line
2.0.3