On 2016年01月08日 16:38, Laurent Vivier wrote: > >> + if (!lock_user_struct(VERIFY_READ, tlg, optval_addr, 1)) { >> + return -TARGET_EFAULT; >> + } >> + __get_user(lg.l_onoff, &tlg->l_onoff); >> + __get_user(lg.l_linger, &tlg->l_linger); >> + unlock_user_struct(tlg, optval_addr, 0); > > You can't unlock the structure you're going to use. >
OK, thanks. >> + return get_errno(setsockopt(sockfd, SOL_SOCKET, optname, >> + &lg, sizeof(lg))); > > Why do you use "SOL_SOCKET" instead of "level" ? > At present, level is TARGET_SOL_SOCKET, but we need SOL_SOCKET. >> diff --git a/linux-user/syscall_defs.h b/linux-user/syscall_defs.h >> index 9d3c537..5a4d565 100644 >> --- a/linux-user/syscall_defs.h >> +++ b/linux-user/syscall_defs.h >> @@ -165,6 +165,11 @@ struct target_ip_mreq_source { >> uint32_t imr_sourceaddr; >> }; >> >> +struct target_linger { >> + int l_onoff; /* Linger active */ >> + int l_linger; /* How long to linger for */ >> +}; >> + > > Must be "abi_int" to force good alignment for the target. > OK, thanks. -- Chen Gang (陈刚) Open, share, and attitude like air, water, and life which God blessed