Module: wine Branch: master Commit: 60efdd55eaf73bf556dc9ab97745780f911da3f0 URL: http://source.winehq.org/git/wine.git/?a=commit;h=60efdd55eaf73bf556dc9ab977...
Author: Alexandre Julliard julliard@winehq.org Date: Tue Dec 1 13:59:41 2009 +0100
server: Don't set last error in close_handle(), return the error code instead.
---
server/handle.c | 33 ++++++++------------------------- server/handle.h | 2 +- server/winstation.c | 5 ++--- 3 files changed, 11 insertions(+), 29 deletions(-)
diff --git a/server/handle.c b/server/handle.c index d1b6a14..3baaa6d 100644 --- a/server/handle.c +++ b/server/handle.c @@ -347,35 +347,22 @@ struct handle_table *copy_handle_table( struct process *process, struct process }
/* close a handle and decrement the refcount of the associated object */ -/* return 1 if OK, 0 on error */ -int close_handle( struct process *process, obj_handle_t handle ) +unsigned int close_handle( struct process *process, obj_handle_t handle ) { struct handle_table *table; struct handle_entry *entry; struct object *obj;
- if (!(entry = get_handle( process, handle ))) - { - set_error( STATUS_INVALID_HANDLE ); - return 0; - } - if (entry->access & RESERVED_CLOSE_PROTECT) - { - set_error( STATUS_HANDLE_NOT_CLOSABLE ); - return 0; - } + if (!(entry = get_handle( process, handle ))) return STATUS_INVALID_HANDLE; + if (entry->access & RESERVED_CLOSE_PROTECT) return STATUS_HANDLE_NOT_CLOSABLE; obj = entry->ptr; - if (!obj->ops->close_handle( obj, process, handle )) - { - set_error( STATUS_HANDLE_NOT_CLOSABLE ); - return 0; - } + if (!obj->ops->close_handle( obj, process, handle )) return STATUS_HANDLE_NOT_CLOSABLE; entry->ptr = NULL; table = handle_is_global(handle) ? global_table : process->handles; if (entry < table->entries + table->free) table->free = entry - table->entries; if (entry == table->entries + table->last) shrink_handle_table( table ); release_object( obj ); - return 1; + return STATUS_SUCCESS; }
/* retrieve the object corresponding to one of the magic pseudo-handles */ @@ -567,7 +554,8 @@ unsigned int get_handle_table_count( struct process *process ) /* close a handle */ DECL_HANDLER(close_handle) { - close_handle( current->process, req->handle ); + unsigned int err = close_handle( current->process, req->handle ); + set_error( err ); }
/* set a handle information */ @@ -596,12 +584,7 @@ DECL_HANDLER(dup_handle) release_object( dst ); } /* close the handle no matter what happened */ - if (req->options & DUP_HANDLE_CLOSE_SOURCE) - { - unsigned int err = get_error(); /* don't overwrite error from the above calls */ - reply->closed = close_handle( src, req->src_handle ); - set_error( err ); - } + if (req->options & DUP_HANDLE_CLOSE_SOURCE) reply->closed = !close_handle( src, req->src_handle ); reply->self = (src == current->process); release_object( src ); } diff --git a/server/handle.h b/server/handle.h index 3809aa3..7860f52 100644 --- a/server/handle.h +++ b/server/handle.h @@ -38,7 +38,7 @@ extern obj_handle_t alloc_handle( struct process *process, void *obj, unsigned int access, unsigned int attr ); extern obj_handle_t alloc_handle_no_access_check( struct process *process, void *ptr, unsigned int access, unsigned int attr ); -extern int close_handle( struct process *process, obj_handle_t handle ); +extern unsigned int close_handle( struct process *process, obj_handle_t handle ); extern struct object *get_handle_obj( struct process *process, obj_handle_t handle, unsigned int access, const struct object_ops *ops ); extern unsigned int get_handle_access( struct process *process, obj_handle_t handle ); diff --git a/server/winstation.c b/server/winstation.c index cfff0a4..7ddc277 100644 --- a/server/winstation.c +++ b/server/winstation.c @@ -403,7 +403,6 @@ void close_thread_desktop( struct thread *thread )
thread->desktop = 0; if (handle) close_handle( thread->process, handle ); - clear_error(); /* ignore errors */ }
/* set the reply data from the object name */ @@ -458,7 +457,7 @@ DECL_HANDLER(close_winstation) if ((winstation = (struct winstation *)get_handle_obj( current->process, req->handle, 0, &winstation_ops ))) { - if (!close_handle( current->process, req->handle )) set_error( STATUS_ACCESS_DENIED ); + if (close_handle( current->process, req->handle )) set_error( STATUS_ACCESS_DENIED ); release_object( winstation ); } } @@ -544,7 +543,7 @@ DECL_HANDLER(close_desktop) if ((desktop = (struct desktop *)get_handle_obj( current->process, req->handle, 0, &desktop_ops ))) { - if (!close_handle( current->process, req->handle )) set_error( STATUS_DEVICE_BUSY ); + if (close_handle( current->process, req->handle )) set_error( STATUS_DEVICE_BUSY ); release_object( desktop ); } }