On 25.02.2013, at 12:10, Christian Borntraeger wrote:

> On 25/02/13 11:44, Paolo Bonzini wrote:
>> Il 25/02/2013 09:09, Christian Borntraeger ha scritto:
>>> Hmm, the old sequence was 
>>> 
>>>     object_unparent(OBJECT(dev));
>>>     qdev_free(dev) ---+
>>>                       |
>>>                       V
>>> ...
>>>          object_unparent(OBJECT(dev));  now the last reference is gone, 
>>> object is freed
>>>          object_unref(OBJECT(dev));     now the reference of a deleted 
>>> object becomes -1
>>> ...
>>> 
>>> Isnt that a problem in itself that we modify a reference counter in an 
>>> deleted object?
>> 
>> The second object_unparent should do nothing.  So before you had:
>> 
>>      object_unparent(OBJECT(dev));       leaves refcount=1
>>      qdev_free(dev) ---+
>>                        |
>>                        V
>>           object_unparent(OBJECT(dev));  do nothing
>>           object_unref(OBJECT(dev));     refcount=0, object freed
>> 
>> After the object_unref was removed you had:
>> 
>>      object_unparent(OBJECT(dev));       refcount=0, object freed
>>      qdev_free(dev) ---+
>>                        |
>>                        V
>>           object_unparent(OBJECT(dev));  dangling pointer!
>> 
> 
> 
> Got it. Thanks
So is the patch valid?


Alex


Reply via email to