Module: wine Branch: master Commit: e4faa12900a8bc2be59cbb611b3cdf456942cbf0 URL: http://source.winehq.org/git/wine.git/?a=commit;h=e4faa12900a8bc2be59cbb611b...
Author: Alexandre Julliard julliard@winehq.org Date: Tue Dec 1 15:10:23 2009 +0100
server: Make sure that last error doesn't get set during thread cleanup.
---
server/clipboard.c | 6 ++++-- server/hook.c | 5 +++-- server/process.c | 2 ++ 3 files changed, 9 insertions(+), 4 deletions(-)
diff --git a/server/clipboard.c b/server/clipboard.c index 065dd2d..0c39319 100644 --- a/server/clipboard.c +++ b/server/clipboard.c @@ -30,6 +30,7 @@ #define WIN32_NO_STATUS #include "request.h" #include "object.h" +#include "process.h" #include "user.h" #include "winuser.h" #include "winternl.h" @@ -112,9 +113,10 @@ static struct clipboard *get_process_clipboard(void) void cleanup_clipboard_thread(struct thread *thread) { struct clipboard *clipboard; - struct winstation *winstation = get_process_winstation( thread->process, WINSTA_ACCESSCLIPBOARD ); + struct winstation *winstation;
- if (!winstation) return; + if (!thread->process->winstation) return; + if (!(winstation = get_process_winstation( thread->process, WINSTA_ACCESSCLIPBOARD ))) return;
if ((clipboard = winstation->clipboard)) { diff --git a/server/hook.c b/server/hook.c index f5ebc2b..7b889d8 100644 --- a/server/hook.c +++ b/server/hook.c @@ -114,9 +114,10 @@ static struct hook_table *alloc_hook_table(void) static struct hook_table *get_global_hooks( struct thread *thread ) { struct hook_table *table; - struct desktop *desktop = get_thread_desktop( thread, 0 ); + struct desktop *desktop;
- if (!desktop) return NULL; + if (!thread->desktop) return NULL; + if (!(desktop = get_thread_desktop( thread, 0 ))) return NULL; table = desktop->global_hooks; release_object( desktop ); return table; diff --git a/server/process.c b/server/process.c index 630abe6..51193b7 100644 --- a/server/process.c +++ b/server/process.c @@ -632,6 +632,8 @@ static void process_killed( struct process *process ) handles = process->handles; process->handles = NULL; if (handles) release_object( handles ); + process->winstation = 0; + process->desktop = 0;
/* close the console attached to this process, if any */ free_console( process );