qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [PATCH V2] linux-user: fix QEMU_STRACE=1 segfault


From: Alexander Graf
Subject: Re: [Qemu-devel] [PATCH V2] linux-user: fix QEMU_STRACE=1 segfault
Date: Mon, 21 Nov 2011 11:52:13 +0100

On 21.11.2011, at 11:47, Peter Maydell wrote:

> On 21 November 2011 10:40, Alexander Graf <address@hidden> wrote:
>> diff --git a/linux-user/strace.c b/linux-user/strace.c
>> index 90027a1..e30b005 100644
>> --- a/linux-user/strace.c
>> +++ b/linux-user/strace.c
>> @@ -1515,14 +1515,19 @@ void
>>  print_syscall_ret(int num, abi_long ret)
>>  {
>>     int i;
>> +    char *errstr = NULL;
>> 
>>     for(i=0;i<nsyscalls;i++)
>>         if( scnames[i].nr == num ) {
>>             if( scnames[i].result != NULL ) {
>>                 scnames[i].result(&scnames[i],ret);
>>             } else {
>> -                if( ret < 0 ) {
>> -                    gemu_log(" = -1 errno=" TARGET_ABI_FMT_ld " (%s)\n", 
>> -ret, target_strerror(-ret));
>> +                if (ret < 0) {
>> +                    errstr = target_strerror(-ret);
>> +                }
>> +                if (errstr) {
>> +                    gemu_log(" = -1 errno=" TARGET_ABI_FMT_ld " (%s)\n",
>> +                             -ret, errstr);
> 
> Should this really be printing -1 all the time when ret isn't -1 ?

In linux-user, the syscall emulation functions return -errno which later gets 
translated to -1 with errno=-errno. That's why the code looks so weird. So yes, 
it's correct.

> 
>>                 } else {
>>                     gemu_log(" = " TARGET_ABI_FMT_ld "\n", ret);
>>                 }
> 
> print_syscall_ret_addr() also needs to handle NULL
> returns from target_strerror().

I don't think they can ever happen, since we're sure to use valid errnos there. 
But I can add a check.

> 
>> diff --git a/linux-user/syscall.c b/linux-user/syscall.c
>> index f227097..c59d00e 100644
>> --- a/linux-user/syscall.c
>> +++ b/linux-user/syscall.c
>> @@ -731,6 +731,9 @@ static inline int is_error(abi_long ret)
>> 
>>  char *target_strerror(int err)
>>  {
>> +    if ((err >= ERRNO_TABLE_SIZE) && (err >= 0)) {
>> +        return NULL;
>> +    }
>>     return strerror(target_to_host_errno(err));
> 
> shouldn't that be ((err >= ERRNO_TABLE_SIZE) || (err < 0)) ?

Yes.


Alex




reply via email to

[Prev in Thread] Current Thread [Next in Thread]