Ryan,
it's test saMsgDispatch/2-3.

Calls look like:
[DEBUG]: saMsgQueueOpenAsync
[DEBUG]: saMsgQueueUnlink
[DEBUG]: saMsgQueueClose
[DEBUG]: saMsgQueueFinalize

So first is close. That call will lead to call of finalize and AFTER
that close continues and tries to delete item from list again.

Sending proposed patch ver2, which may be better (no special variable,
just list_init after del).

Regards,
  Honza

Ryan O'Hara wrote:
> How did multiple list_del occur? Did you call saMsgQueueClose followed
> by saMsgFinalize?
> 
> I'm not sure this is the best way to deal with this.
> 
> On Tue, May 19, 2009 at 03:43:09PM +0200, Jan Friesse wrote:
>> Hi,
>> included patch solves multiple list_del in saMsgQueueClose, which leads
>> to segfault.
>>
>> Regards,
>>   Honza
> 
>> diff --git a/trunk/lib/msg.c b/trunk/lib/msg.c
>> index 1c20119..689ffbc 100644
>> --- a/trunk/lib/msg.c
>> +++ b/trunk/lib/msg.c
>> @@ -78,6 +78,7 @@ struct queueInstance {
>>      SaMsgQueueHandleT queue_handle;
>>      SaMsgQueueOpenFlagsT open_flags;
>>      SaMsgQueueCreationAttributesT create_attrs;
>> +    int finalize;
>>      struct list_head list;
>>  };
>>  
>> @@ -96,6 +97,8 @@ static struct saVersionDatabase msgVersionDatabase = {
>>  
>>  static void queueInstanceFinalize (struct queueInstance *queueInstance)
>>  {
>> +    queueInstance->finalize = 1;
>> +
>>      list_del (&queueInstance->list);
>>  
>>      hdb_handle_destroy (&queueHandleDatabase, queueInstance->queue_handle);
>> @@ -713,10 +719,11 @@ saMsgQueueClose (
>>              goto error_put; /* ! */
>>      }
>>  
>> -    list_del (&queueInstance->list);
>> +    if (!queueInstance->finalize) {
>> +            queueInstanceFinalize (queueInstance);
>> +    }
>>  
>>      hdb_handle_put (&queueHandleDatabase, queueHandle);
>> -    hdb_handle_destroy (&queueHandleDatabase, queueHandle);
>>  
>>      return (error);
>>  
> 
>> _______________________________________________
>> Openais mailing list
>> Openais@lists.linux-foundation.org
>> https://lists.linux-foundation.org/mailman/listinfo/openais

diff --git a/trunk/lib/msg.c b/trunk/lib/msg.c
index 1c20119..e014d23 100644
--- a/trunk/lib/msg.c
+++ b/trunk/lib/msg.c
@@ -97,6 +97,7 @@ static struct saVersionDatabase msgVersionDatabase = {
 static void queueInstanceFinalize (struct queueInstance *queueInstance)
 {
 	list_del (&queueInstance->list);
+	list_init (&queueInstance->list);
 
 	hdb_handle_destroy (&queueHandleDatabase, queueInstance->queue_handle);
 
@@ -714,6 +715,7 @@ saMsgQueueClose (
 	}
 
 	list_del (&queueInstance->list);
+	list_init (&queueInstance->list);
 
 	hdb_handle_put (&queueHandleDatabase, queueHandle);
 	hdb_handle_destroy (&queueHandleDatabase, queueHandle);
_______________________________________________
Openais mailing list
Openais@lists.linux-foundation.org
https://lists.linux-foundation.org/mailman/listinfo/openais

Reply via email to