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

Reply via email to