Piotr Caban : server: Avoid infinite loop when we' re out of timers in set_win_timer server call.
Alexandre Julliard
julliard at wine.codeweavers.com
Tue Jan 26 10:32:52 CST 2016
Module: wine
Branch: master
Commit: cefdbd59b7ff189f058782021b746c33a975b5e3
URL: http://source.winehq.org/git/wine.git/?a=commit;h=cefdbd59b7ff189f058782021b746c33a975b5e3
Author: Piotr Caban <piotr at codeweavers.com>
Date: Mon Jan 25 09:59:46 2016 +0100
server: Avoid infinite loop when we're out of timers in set_win_timer server call.
Signed-off-by: Piotr Caban <piotr at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
server/queue.c | 12 ++++++++++--
server/trace.c | 1 +
2 files changed, 11 insertions(+), 2 deletions(-)
diff --git a/server/queue.c b/server/queue.c
index 7fe0d03..771a2e3 100644
--- a/server/queue.c
+++ b/server/queue.c
@@ -2581,13 +2581,21 @@ DECL_HANDLER(set_win_timer)
}
else
{
+ lparam_t end_id = queue->next_timer_id;
+
/* find a free id for it */
- do
+ while (1)
{
id = queue->next_timer_id;
if (--queue->next_timer_id <= 0x100) queue->next_timer_id = 0x7fff;
+
+ if (!find_timer( queue, 0, req->msg, id )) break;
+ if (queue->next_timer_id == end_id)
+ {
+ set_win32_error( ERROR_NO_MORE_USER_HANDLES );
+ return;
+ }
}
- while (find_timer( queue, 0, req->msg, id ));
}
}
diff --git a/server/trace.c b/server/trace.c
index 1b63894..2a3aba9 100644
--- a/server/trace.c
+++ b/server/trace.c
@@ -5136,6 +5136,7 @@ static const struct
{ "DIRECTORY_NOT_EMPTY", STATUS_DIRECTORY_NOT_EMPTY },
{ "DISK_FULL", STATUS_DISK_FULL },
{ "DLL_NOT_FOUND", STATUS_DLL_NOT_FOUND },
+ { "ERROR_NO_MORE_USER_HANDLES", 0xc0010000 | ERROR_NO_MORE_USER_HANDLES },
{ "ERROR_CLASS_ALREADY_EXISTS", 0xc0010000 | ERROR_CLASS_ALREADY_EXISTS },
{ "ERROR_CLASS_DOES_NOT_EXIST", 0xc0010000 | ERROR_CLASS_DOES_NOT_EXIST },
{ "ERROR_CLASS_HAS_WINDOWS", 0xc0010000 | ERROR_CLASS_HAS_WINDOWS },
More information about the wine-cvs
mailing list