From 9e581ba8c5b4a2f8e2807eeb2c5f800f1b650d01 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9mi=20Bernon?= Date: Wed, 5 Feb 2020 11:49:35 +0100 Subject: [PATCH] server: Improve APC error handling when alloc_handle fails. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Whenever alloc_handle fails, we ignored the error and dequeued the next APC. This patch makes the loop break whenever the error status changes. Note that the APC is still marked as executed although it failed. Signed-off-by: RĂ©mi Bernon Signed-off-by: Jacek Caban Signed-off-by: Alexandre Julliard --- server/thread.c | 29 +++++++++++++---------------- 1 file changed, 13 insertions(+), 16 deletions(-) diff --git a/server/thread.c b/server/thread.c index 80db41b48d2..5844d039682 100644 --- a/server/thread.c +++ b/server/thread.c @@ -1579,26 +1579,23 @@ DECL_HANDLER(select) reply->timeout = select_on( &select_op, op_size, req->cookie, req->flags, req->timeout ); - if (get_error() == STATUS_USER_APC) + while (get_error() == STATUS_USER_APC) { - for (;;) + if (!(apc = thread_dequeue_apc( current, !(req->flags & SELECT_ALERTABLE) ))) + break; + /* Optimization: ignore APC_NONE calls, they are only used to + * wake up a thread, but since we got here the thread woke up already. + */ + if (apc->call.type != APC_NONE && + (reply->apc_handle = alloc_handle( current->process, apc, SYNCHRONIZE, 0 ))) { - if (!(apc = thread_dequeue_apc( current, !(req->flags & SELECT_ALERTABLE) ))) - break; - /* Optimization: ignore APC_NONE calls, they are only used to - * wake up a thread, but since we got here the thread woke up already. - */ - if (apc->call.type != APC_NONE && - (reply->apc_handle = alloc_handle( current->process, apc, SYNCHRONIZE, 0 ))) - { - reply->call = apc->call; - release_object( apc ); - break; - } - apc->executed = 1; - wake_up( &apc->obj, 0 ); + reply->call = apc->call; release_object( apc ); + break; } + apc->executed = 1; + wake_up( &apc->obj, 0 ); + release_object( apc ); } }