From a17469b165d30f14c3340608602085f7603496b9 Mon Sep 17 00:00:00 2001 From: Zebediah Figura Date: Mon, 5 Jul 2021 11:20:00 -0500 Subject: [PATCH] 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 Signed-off-by: Alexandre Julliard --- server/handle.c | 17 ++++++----------- 1 file changed, 6 insertions(+), 11 deletions(-) diff --git a/server/handle.c b/server/handle.c index 6efd82f2ff9..15da701ee99 100644 --- a/server/handle.c +++ b/server/handle.c @@ -174,21 +174,16 @@ static void handle_table_destroy( struct object *obj ) 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++) { struct object *obj = entry->ptr; 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 ); }