Le 08/01/2016 10:45, Chen Gang a écrit : > > 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.
Yes, you're right... so there is a bug in TARGET_SO_BINDTODEVICE which is using "level" :) > > >>> 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. > >