linux-user: add SO_PEERCRED support for getsockopt
Signed-off-by: Akos PASZTORY <akos.pasztory@gmail.com> Signed-off-by: Riku Voipio <riku.voipio@linaro.org>
This commit is contained in:
parent
50171d4207
commit
583359a689
@ -1530,9 +1530,41 @@ static abi_long do_getsockopt(int sockfd, int level, int optname,
|
||||
case TARGET_SO_LINGER:
|
||||
case TARGET_SO_RCVTIMEO:
|
||||
case TARGET_SO_SNDTIMEO:
|
||||
case TARGET_SO_PEERCRED:
|
||||
case TARGET_SO_PEERNAME:
|
||||
goto unimplemented;
|
||||
case TARGET_SO_PEERCRED: {
|
||||
struct ucred cr;
|
||||
socklen_t crlen;
|
||||
struct target_ucred *tcr;
|
||||
|
||||
if (get_user_u32(len, optlen)) {
|
||||
return -TARGET_EFAULT;
|
||||
}
|
||||
if (len < 0) {
|
||||
return -TARGET_EINVAL;
|
||||
}
|
||||
|
||||
crlen = sizeof(cr);
|
||||
ret = get_errno(getsockopt(sockfd, level, SO_PEERCRED,
|
||||
&cr, &crlen));
|
||||
if (ret < 0) {
|
||||
return ret;
|
||||
}
|
||||
if (len > crlen) {
|
||||
len = crlen;
|
||||
}
|
||||
if (!lock_user_struct(VERIFY_WRITE, tcr, optval_addr, 0)) {
|
||||
return -TARGET_EFAULT;
|
||||
}
|
||||
__put_user(cr.pid, &tcr->pid);
|
||||
__put_user(cr.uid, &tcr->uid);
|
||||
__put_user(cr.gid, &tcr->gid);
|
||||
unlock_user_struct(tcr, optval_addr, 1);
|
||||
if (put_user_u32(len, optlen)) {
|
||||
return -TARGET_EFAULT;
|
||||
}
|
||||
break;
|
||||
}
|
||||
/* Options with 'int' argument. */
|
||||
case TARGET_SO_DEBUG:
|
||||
optname = SO_DEBUG;
|
||||
|
@ -2336,3 +2336,9 @@ struct target_rlimit64 {
|
||||
uint64_t rlim_cur;
|
||||
uint64_t rlim_max;
|
||||
};
|
||||
|
||||
struct target_ucred {
|
||||
uint32_t pid;
|
||||
uint32_t uid;
|
||||
uint32_t gid;
|
||||
};
|
||||
|
Loading…
Reference in New Issue
Block a user