server: Call the close_handle callback and release_object_from_handle() in the same loop.
Several server objects check if the last handle is being closed in their close_handle callback. If a process holds the last two handles to an object, this code path currently won't be triggered. Signed-off-by: Zebediah Figura <zfigura@codeweavers.com> Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
parent
3f04fdd876
commit
a17469b165
|
@ -174,21 +174,16 @@ static void handle_table_destroy( struct object *obj )
|
||||||
|
|
||||||
assert( obj->ops == &handle_table_ops );
|
assert( obj->ops == &handle_table_ops );
|
||||||
|
|
||||||
/* first notify all objects that handles are being closed */
|
|
||||||
if (table->process)
|
|
||||||
{
|
|
||||||
for (i = 0, entry = table->entries; i <= table->last; i++, entry++)
|
|
||||||
{
|
|
||||||
struct object *obj = entry->ptr;
|
|
||||||
if (obj) obj->ops->close_handle( obj, table->process, index_to_handle(i) );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
for (i = 0, entry = table->entries; i <= table->last; i++, entry++)
|
for (i = 0, entry = table->entries; i <= table->last; i++, entry++)
|
||||||
{
|
{
|
||||||
struct object *obj = entry->ptr;
|
struct object *obj = entry->ptr;
|
||||||
entry->ptr = NULL;
|
entry->ptr = NULL;
|
||||||
if (obj) release_object_from_handle( obj );
|
if (obj)
|
||||||
|
{
|
||||||
|
if (table->process)
|
||||||
|
obj->ops->close_handle( obj, table->process, index_to_handle(i) );
|
||||||
|
release_object_from_handle( obj );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
free( table->entries );
|
free( table->entries );
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue