From 0f091acfe16e80c8b2e9accf2f85811a109cbe6e Mon Sep 17 00:00:00 2001 From: Maarten Lankhorst Date: Tue, 15 Apr 2008 16:38:58 -0700 Subject: [PATCH] server: Make enum_desktop enumerate all the desktops on the window station with the DESKTOP_ENUMERATE right --- server/winstation.c | 35 +++++++++++++++++++---------------- 1 files changed, 19 insertions(+), 16 deletions(-) diff --git a/server/winstation.c b/server/winstation.c index bb968e4..d39cfd1 100644 --- a/server/winstation.c +++ b/server/winstation.c @@ -669,31 +669,34 @@ DECL_HANDLER(enum_winstation) DECL_HANDLER(enum_desktop) { struct winstation *winstation; - struct desktop *desktop; + struct desktop *desk; unsigned int index = req->index; - obj_handle_t handle; + int n = -1; if (!(winstation = (struct winstation *)get_handle_obj( current->process, req->winstation, WINSTA_ENUMDESKTOPS, &winstation_ops ))) return; - while ((handle = enumerate_handles( current->process, &desktop_ops, &index ))) + LIST_FOR_EACH_ENTRY( desk, &winstation->desktops, struct desktop, entry ) { - if (!(desktop = get_desktop_obj( current->process, handle, DESKTOP_ENUMERATE ))) - continue; - - if (desktop->winstation == winstation) + if (index == ++n) { - set_reply_data_obj_name( &desktop->obj ); - release_object( desktop ); - release_object( winstation ); - clear_error(); - reply->next = index; - return; + unsigned int access = DESKTOP_ENUMERATE; + if (check_object_access( (struct object *)desk, &access )) + break; + + ++index; } - release_object( desktop ); } - release_object( winstation ); - set_error( STATUS_NO_MORE_ENTRIES ); + + if (index != n) + { + set_error( STATUS_NO_MORE_ENTRIES ); + return; + } + + set_reply_data_obj_name( (struct object *)desk ); + reply->next = index+1; + clear_error(); } -- 1.5.4.1