Maybe i'm missing something but,

when executing  list = dict_get(conn_pool, key);

//--->
void *dict_get(Dict *dict, Octstr *key)
{
    long i;
    Item *p;
    void *value;
  
    lock(dict);
    i = key_to_index(dict, key);
    if (dict->tab[i] == NULL)
        p = NULL;
    else
        p = gwlist_search(dict->tab[i], key, item_has_key);
    if (p == NULL)
        value = NULL;
    else
        value = p->value;
    unlock(dict);
    return value;
}
//---> 

if p==NULL (the real question is here) then 'value' will be set to NULL too, 
then returned
so List *list will be NULLed.
In that case, gwlist_delete_equal(list, conn) will pannic.

Vincent

--
Telemaque - NICE - (FR)
Service Technique - Developpement
http://www.telemaque.fr/
[EMAIL PROTECTED]
Tel : +33 4 93 97 71 64 (fax 68)

----- Original Message ----- 
From: "Alexander Malysh" <[EMAIL PROTECTED]>
To: <[email protected]>
Sent: Thursday, July 13, 2006 5:22 PM
Subject: Re: [PATCH] 0000326: SMSbox CRASH: PANIC: 
gwlib/list.c:502:lock:Assertion


Hi,

just looked through code again and I really don't see how this patch  
should help and unfortunately I don't see how List in conn_pool dictionary  
may be NULL.

Thanks,
Alex


Am 13.07.2006, 01:20 Uhr, schrieb Vincent CHAVANIS <[EMAIL PROTECTED]>:

> Yep, it fixes the problem (or may fixes the problem as it does not panic  
> anymore for the moment)
>
> Someone can confirm this too ?
>
> Vincent.
>
> --
> Telemaque - NICE - (FR)
> Service Technique - Developpement
> http://www.telemaque.fr/
> [EMAIL PROTECTED]
> Tel : +33 4 93 97 71 64 (fax 68)
>
> ----- Original Message -----
> From: "Alexander Malysh" <[EMAIL PROTECTED]>
> To: <[email protected]>
> Sent: Wednesday, July 12, 2006 10:34 PM
> Subject: Re: [PATCH] 0000326: SMSbox CRASH: PANIC: gwlib/list.c:502:  
> lock:Assertion
>
>
>> Hi,
>>
>> this patch doesn't add anything and doesn't fix #326.
>> List in conn_pool dictionary in function check_pool_conn is never NULL!
>> Just look how we add Connection check to FDSet, function conn_pool_put:
>>
>>     key = conn_pool_key(host, port);
>>     mutex_lock(conn_pool_lock);
>>     list = dict_get(conn_pool, key);
>>     if (list == NULL) {
>>         list = gwlist_create();
>>         dict_put(conn_pool, key, list);
>>     }
>>     gwlist_append(list, conn);
>>     /* register connection to get server disconnect */
>>     conn_register_real(conn, client_fdset, check_pool_conn, key,
>> octstr_destroy_item);
>>
>> If this patch fix #326 then we have heavy race condition somewhere in
>> the conn.c,fdset.c,http.c.
>>
>> Could someone to 100% confirm that this patch fix #326?
>>
>> Thanks,
>> Alex
>>
>> Vincent CHAVANIS schrieb:
>>> We have here an issue :
>>>
>>>
>>> -list is not checked in gwlist_delete_equal()
>>> So if dict_get(conn_pool, key) returns NULL the process panic.
>>>
>>>
>>>
>>> diff -rau /gateway-cvs/gwlib/http.c /gateway/gwlib/http.c
>>> --- /gateway-cvs/gwlib/http.c   2006-04-01 19:45:13.000000000 +0200
>>> +++ /gateway/gwlib/http.c       2006-06-26 20:08:53.000000000 +0200
>>> @@ -848,7 +848,7 @@
>>>          List *list;
>>>          mutex_lock(conn_pool_lock);
>>>          list = dict_get(conn_pool, key);
>>> -        if (gwlist_delete_equal(list, conn) > 0) {
>>> +        if (list != NULL && gwlist_delete_equal(list, conn) > 0) {
>>>              /*
>>>               * ok, connection was still within pool. So it's
>>>               * safe to destroy this connection.
>>>
>>>
>>>
>>> --
>>> Telemaque - NICE - (FR)
>>> Service Technique - Developpement
>>> http://www.telemaque.fr/
>>> [EMAIL PROTECTED]
>>> Tel : +33 4 93 97 71 64 (fax 68)
>>>
>>>
>>> ------------------------------------------------------------------------
>>>
>>> diff -rau /gateway-cvs/gwlib/http.c /gateway/gwlib/http.c
>>> --- /gateway-cvs/gwlib/http.c   2006-04-01 19:45:13.000000000 +0200
>>> +++ /gateway/gwlib/http.c       2006-06-26 20:08:53.000000000 +0200
>>> @@ -848,7 +848,7 @@
>>>          List *list;
>>>          mutex_lock(conn_pool_lock);
>>>          list = dict_get(conn_pool, key);
>>> -        if (gwlist_delete_equal(list, conn) > 0) {
>>> +        if (list != NULL && gwlist_delete_equal(list, conn) > 0) {
>>>              /*
>>>               * ok, connection was still within pool. So it's
>>>               * safe to destroy this connection.
>>>
>>>
>>> ------------------------------------------------------------------------
>>>
>>> _______________________________________________
>>> devel mailing list
>>> [email protected]
>>> http://www.kannel.org/mailman/listinfo/devel
>>
>>
>>
>
>
>



-- 
Thanks,
Alex





Reply via email to