diff mbox

linux-user/syscall.c: Let lv always match val in do_getsockopt()

Message ID 1452752664-11818-1-git-send-email-chengang@emindsoft.com.cn
State New
Headers show

Commit Message

Chen Gang Jan. 14, 2016, 6:24 a.m. UTC
From: Chen Gang <chengang@emindsoft.com.cn>

After host_to_target_sock_type(), the length of val may be changed, so
calculate the related lv, too.

Signed-off-by: Chen Gang <gang.chen.5i5j@gmail.com>
---
 linux-user/syscall.c | 1 +
 1 file changed, 1 insertion(+)

Comments

Laurent Vivier Jan. 14, 2016, 8:15 a.m. UTC | #1
Le 14/01/2016 07:24, chengang@emindsoft.com.cn a écrit :
> From: Chen Gang <chengang@emindsoft.com.cn>
> 
> After host_to_target_sock_type(), the length of val may be changed, so
> calculate the related lv, too.
>
> Signed-off-by: Chen Gang <gang.chen.5i5j@gmail.com>
> ---
>  linux-user/syscall.c | 1 +
>  1 file changed, 1 insertion(+)
> 
> diff --git a/linux-user/syscall.c b/linux-user/syscall.c
> index fcdca2a..0e95f35 100644
> --- a/linux-user/syscall.c
> +++ b/linux-user/syscall.c
> @@ -1841,6 +1841,7 @@ static abi_long do_getsockopt(int sockfd, int level, int optname,
>              return ret;
>          if (optname == SO_TYPE) {
>              val = host_to_target_sock_type(val);
> +            lv = (val >> 8) ? 4 : 1;

It seems the kernel always returns sizeof(int) (for all archs), what is
the aim of reducing the size ?

>          }
>          if (len > lv)
>              len = lv;
>
Chen Gang Jan. 14, 2016, 9:01 a.m. UTC | #2
On 2016年01月14日 16:15, Laurent Vivier wrote:
> Le 14/01/2016 07:24, chengang@emindsoft.com.cn a écrit :
>> From: Chen Gang <chengang@emindsoft.com.cn>
>>
>> After host_to_target_sock_type(), the length of val may be changed, so
>> calculate the related lv, too.
>>
>> Signed-off-by: Chen Gang <gang.chen.5i5j@gmail.com>
>> ---
>>  linux-user/syscall.c | 1 +
>>  1 file changed, 1 insertion(+)
>>
>> diff --git a/linux-user/syscall.c b/linux-user/syscall.c
>> index fcdca2a..0e95f35 100644
>> --- a/linux-user/syscall.c
>> +++ b/linux-user/syscall.c
>> @@ -1841,6 +1841,7 @@ static abi_long do_getsockopt(int sockfd, int level, int optname,
>>              return ret;
>>          if (optname == SO_TYPE) {
>>              val = host_to_target_sock_type(val);
>> +            lv = (val >> 8) ? 4 : 1;
> 
> It seems the kernel always returns sizeof(int) (for all archs), what is
> the aim of reducing the size ?
> 

I am not quite sure whether kernel always returns sizeof(int) (I guess,
it should be).

For me, if you are sure, we can skip this patch.

Thanks.
Laurent Vivier Jan. 14, 2016, 9:10 a.m. UTC | #3
Le 14/01/2016 10:01, Chen Gang a écrit :
> On 2016年01月14日 16:15, Laurent Vivier wrote:
>> Le 14/01/2016 07:24, chengang@emindsoft.com.cn a écrit :
>>> From: Chen Gang <chengang@emindsoft.com.cn>
>>>
>>> After host_to_target_sock_type(), the length of val may be changed, so
>>> calculate the related lv, too.
>>>
>>> Signed-off-by: Chen Gang <gang.chen.5i5j@gmail.com>
>>> ---
>>>  linux-user/syscall.c | 1 +
>>>  1 file changed, 1 insertion(+)
>>>
>>> diff --git a/linux-user/syscall.c b/linux-user/syscall.c
>>> index fcdca2a..0e95f35 100644
>>> --- a/linux-user/syscall.c
>>> +++ b/linux-user/syscall.c
>>> @@ -1841,6 +1841,7 @@ static abi_long do_getsockopt(int sockfd, int level, int optname,
>>>              return ret;
>>>          if (optname == SO_TYPE) {
>>>              val = host_to_target_sock_type(val);
>>> +            lv = (val >> 8) ? 4 : 1;
>>
>> It seems the kernel always returns sizeof(int) (for all archs), what is
>> the aim of reducing the size ?
>>
> 
> I am not quite sure whether kernel always returns sizeof(int) (I guess,
> it should be).

it can be 1 only if len is 1, but this is managed below.

> For me, if you are sure, we can skip this patch.

Does it fix something ?

Laurent
Chen Gang Jan. 14, 2016, 9:37 a.m. UTC | #4
On 2016年01月14日 17:10, Laurent Vivier wrote:
> 
> Le 14/01/2016 10:01, Chen Gang a écrit :
>>
>> I am not quite sure whether kernel always returns sizeof(int) (I guess,
>> it should be).
> 
> it can be 1 only if len is 1, but this is managed below.
> 

Excuse me, I do not quite understand your meaning.

For me, if we are sure lv is always 4 for SO_TYPE, we don't need this
patch.

If lv may be 1 for SO_TYPE (it means val >> 8 may be zero), after call
host_to_target_sock_type, val >> 8 may be non-zero, theoretically. In
this case, we need modify lv to 4.

>> For me, if you are sure, we can skip this patch.
> 
> Does it fix something ?
> 

It is only theoretical, not real world, at present.

Thanks.
Laurent Vivier Jan. 14, 2016, 9:41 a.m. UTC | #5
Le 14/01/2016 10:37, Chen Gang a écrit :
> 
> On 2016年01月14日 17:10, Laurent Vivier wrote:
>>
>> Le 14/01/2016 10:01, Chen Gang a écrit :
>>>
>>> I am not quite sure whether kernel always returns sizeof(int) (I guess,
>>> it should be).
>>
>> it can be 1 only if len is 1, but this is managed below.
>>
> 
> Excuse me, I do not quite understand your meaning.
> 
> For me, if we are sure lv is always 4 for SO_TYPE, we don't need this
> patch.
> 
> If lv may be 1 for SO_TYPE (it means val >> 8 may be zero), after call
> host_to_target_sock_type, val >> 8 may be non-zero, theoretically. In
> this case, we need modify lv to 4.
> 
>>> For me, if you are sure, we can skip this patch.
>>
>> Does it fix something ?
>>
> 
> It is only theoretical, not real world, at present.

So I think we can skip it.

Laurent
Chen Gang Jan. 14, 2016, 9:44 a.m. UTC | #6
On 2016年01月14日 17:41, Laurent Vivier wrote:
> 
> Le 14/01/2016 10:37, Chen Gang a écrit :
>>
>> On 2016年01月14日 17:10, Laurent Vivier wrote:
>>>
>>> Le 14/01/2016 10:01, Chen Gang a écrit :
>>>>
>>>> I am not quite sure whether kernel always returns sizeof(int) (I guess,
>>>> it should be).
>>>
>>> it can be 1 only if len is 1, but this is managed below.
>>>
>>
>> Excuse me, I do not quite understand your meaning.
>>
>> For me, if we are sure lv is always 4 for SO_TYPE, we don't need this
>> patch.
>>
>> If lv may be 1 for SO_TYPE (it means val >> 8 may be zero), after call
>> host_to_target_sock_type, val >> 8 may be non-zero, theoretically. In
>> this case, we need modify lv to 4.
>>
>>>> For me, if you are sure, we can skip this patch.
>>>
>>> Does it fix something ?
>>>
>>
>> It is only theoretical, not real world, at present.
> 
> So I think we can skip it.
> 

It is OK to me.


Thanks.
diff mbox

Patch

diff --git a/linux-user/syscall.c b/linux-user/syscall.c
index fcdca2a..0e95f35 100644
--- a/linux-user/syscall.c
+++ b/linux-user/syscall.c
@@ -1841,6 +1841,7 @@  static abi_long do_getsockopt(int sockfd, int level, int optname,
             return ret;
         if (optname == SO_TYPE) {
             val = host_to_target_sock_type(val);
+            lv = (val >> 8) ? 4 : 1;
         }
         if (len > lv)
             len = lv;