From: Rémi Bernon rbernon@codeweavers.com
--- server/async.c | 4 ++-- server/atom.c | 2 +- server/change.c | 2 +- server/clipboard.c | 2 +- server/completion.c | 4 ++-- server/console.c | 18 +++++++++--------- server/debugger.c | 4 ++-- server/device.c | 8 ++++---- server/directory.c | 4 ++-- server/event.c | 17 ++++++----------- server/fd.c | 8 ++++---- server/file.c | 2 +- server/handle.c | 2 +- server/hook.c | 2 +- server/inproc_sync.c | 2 +- server/mailslot.c | 8 ++++---- server/mapping.c | 6 +++--- server/mutex.c | 13 ++++--------- server/named_pipe.c | 12 ++++++------ server/object.c | 10 ++-------- server/object.h | 4 ++-- server/process.c | 6 +++--- server/queue.c | 4 ++-- server/registry.c | 2 +- server/request.c | 2 +- server/semaphore.c | 13 ++++--------- server/serial.c | 2 +- server/signal.c | 2 +- server/sock.c | 6 +++--- server/symlink.c | 2 +- server/thread.c | 18 ++++++++++++++---- server/timer.c | 2 +- server/token.c | 2 +- server/window.c | 2 +- server/winstation.c | 4 ++-- 35 files changed, 95 insertions(+), 106 deletions(-)
diff --git a/server/async.c b/server/async.c index 4068f744567..4ccdbecd0ec 100644 --- a/server/async.c +++ b/server/async.c @@ -79,7 +79,7 @@ static const struct object_ops async_ops = remove_queue, /* remove_queue */ async_signaled, /* signaled */ async_satisfied, /* satisfied */ - no_signal, /* signal */ + NULL, /* signal */ no_get_fd, /* get_fd */ default_get_sync, /* get_sync */ default_map_access, /* map_access */ @@ -701,7 +701,7 @@ static const struct object_ops iosb_ops = NULL, /* remove_queue */ NULL, /* signaled */ NULL, /* satisfied */ - no_signal, /* signal */ + NULL, /* signal */ no_get_fd, /* get_fd */ default_get_sync, /* get_sync */ default_map_access, /* map_access */ diff --git a/server/atom.c b/server/atom.c index 0bba828e300..d8a4fd209c2 100644 --- a/server/atom.c +++ b/server/atom.c @@ -79,7 +79,7 @@ static const struct object_ops atom_table_ops = NULL, /* remove_queue */ NULL, /* signaled */ NULL, /* satisfied */ - no_signal, /* signal */ + NULL, /* signal */ no_get_fd, /* get_fd */ default_get_sync, /* get_sync */ default_map_access, /* map_access */ diff --git a/server/change.c b/server/change.c index 5bcd0676e0d..4e152a39a22 100644 --- a/server/change.c +++ b/server/change.c @@ -113,7 +113,7 @@ static const struct object_ops dir_ops = NULL, /* remove_queue */ NULL, /* signaled */ NULL, /* satisfied */ - no_signal, /* signal */ + NULL, /* signal */ dir_get_fd, /* get_fd */ default_fd_get_sync, /* get_sync */ default_map_access, /* map_access */ diff --git a/server/clipboard.c b/server/clipboard.c index 59a50354b48..a0e7ffa38bd 100644 --- a/server/clipboard.c +++ b/server/clipboard.c @@ -77,7 +77,7 @@ static const struct object_ops clipboard_ops = NULL, /* remove_queue */ NULL, /* signaled */ NULL, /* satisfied */ - no_signal, /* signal */ + NULL, /* signal */ no_get_fd, /* get_fd */ default_get_sync, /* get_sync */ default_map_access, /* map_access */ diff --git a/server/completion.c b/server/completion.c index a2028a89823..60f8ad409b2 100644 --- a/server/completion.c +++ b/server/completion.c @@ -93,7 +93,7 @@ static const struct object_ops completion_wait_ops = remove_queue, /* remove_queue */ completion_wait_signaled, /* signaled */ completion_wait_satisfied, /* satisfied */ - no_signal, /* signal */ + NULL, /* signal */ no_get_fd, /* get_fd */ default_get_sync, /* get_sync */ default_map_access, /* map_access */ @@ -168,7 +168,7 @@ static const struct object_ops completion_ops = NULL, /* remove_queue */ NULL, /* signaled */ NULL, /* satisfied */ - no_signal, /* signal */ + NULL, /* signal */ no_get_fd, /* get_fd */ completion_get_sync, /* get_sync */ default_map_access, /* map_access */ diff --git a/server/console.c b/server/console.c index f0cb6689d4b..0bb5a6b24c0 100644 --- a/server/console.c +++ b/server/console.c @@ -84,7 +84,7 @@ static const struct object_ops console_ops = NULL, /* remove_queue */ NULL, /* signaled */ NULL, /* satisfied */ - no_signal, /* signal */ + NULL, /* signal */ console_get_fd, /* get_fd */ console_get_sync, /* get_sync */ default_map_access, /* map_access */ @@ -163,7 +163,7 @@ static const struct object_ops console_server_ops = NULL, /* remove_queue */ NULL, /* signaled */ NULL, /* satisfied */ - no_signal, /* signal */ + NULL, /* signal */ console_server_get_fd, /* get_fd */ console_server_get_sync, /* get_sync */ default_map_access, /* map_access */ @@ -234,7 +234,7 @@ static const struct object_ops screen_buffer_ops = NULL, /* remove_queue */ NULL, /* signaled */ NULL, /* satisfied */ - no_signal, /* signal */ + NULL, /* signal */ screen_buffer_get_fd, /* get_fd */ screen_buffer_get_sync, /* get_sync */ default_map_access, /* map_access */ @@ -280,11 +280,11 @@ static const struct object_ops console_device_ops = sizeof(struct object), /* size */ &device_type, /* type */ console_device_dump, /* dump */ - no_add_queue, /* add_queue */ + NULL, /* add_queue */ NULL, /* remove_queue */ NULL, /* signaled */ - no_satisfied, /* satisfied */ - no_signal, /* signal */ + NULL, /* satisfied */ + NULL, /* signal */ no_get_fd, /* get_fd */ default_get_sync, /* get_sync */ default_map_access, /* map_access */ @@ -325,7 +325,7 @@ static const struct object_ops console_input_ops = NULL, /* remove_queue */ NULL, /* signaled */ NULL, /* satisfied */ - no_signal, /* signal */ + NULL, /* signal */ console_input_get_fd, /* get_fd */ console_input_get_sync, /* get_sync */ default_map_access, /* map_access */ @@ -386,7 +386,7 @@ static const struct object_ops console_output_ops = NULL, /* remove_queue */ NULL, /* signaled */ NULL, /* satisfied */ - no_signal, /* signal */ + NULL, /* signal */ console_output_get_fd, /* get_fd */ console_output_get_sync, /* get_sync */ default_map_access, /* map_access */ @@ -445,7 +445,7 @@ static const struct object_ops console_connection_ops = NULL, /* remove_queue */ NULL, /* signaled */ no_satisfied, /* satisfied */ - no_signal, /* signal */ + NULL, /* signal */ console_connection_get_fd, /* get_fd */ default_get_sync, /* get_sync */ default_map_access, /* map_access */ diff --git a/server/debugger.c b/server/debugger.c index 2956ee17b8e..cc096c46223 100644 --- a/server/debugger.c +++ b/server/debugger.c @@ -89,7 +89,7 @@ static const struct object_ops debug_event_ops = NULL, /* remove_queue */ NULL, /* signaled */ NULL, /* satisfied */ - no_signal, /* signal */ + NULL, /* signal */ no_get_fd, /* get_fd */ debug_event_get_sync, /* get_sync */ default_map_access, /* map_access */ @@ -118,7 +118,7 @@ static const struct object_ops debug_obj_ops = NULL, /* remove_queue */ NULL, /* signaled */ NULL, /* satisfied */ - no_signal, /* signal */ + NULL, /* signal */ no_get_fd, /* get_fd */ debug_obj_get_sync, /* get_sync */ default_map_access, /* map_access */ diff --git a/server/device.c b/server/device.c index f4b3f19028b..35c6cca1541 100644 --- a/server/device.c +++ b/server/device.c @@ -67,7 +67,7 @@ static const struct object_ops irp_call_ops = NULL, /* remove_queue */ NULL, /* signaled */ NULL, /* satisfied */ - no_signal, /* signal */ + NULL, /* signal */ no_get_fd, /* get_fd */ default_get_sync, /* get_sync */ default_map_access, /* map_access */ @@ -109,7 +109,7 @@ static const struct object_ops device_manager_ops = NULL, /* remove_queue */ NULL, /* signaled */ NULL, /* satisfied */ - no_signal, /* signal */ + NULL, /* signal */ no_get_fd, /* get_fd */ device_manager_get_sync, /* get_sync */ default_map_access, /* map_access */ @@ -167,7 +167,7 @@ static const struct object_ops device_ops = NULL, /* remove_queue */ NULL, /* signaled */ no_satisfied, /* satisfied */ - no_signal, /* signal */ + NULL, /* signal */ no_get_fd, /* get_fd */ default_get_sync, /* get_sync */ default_map_access, /* map_access */ @@ -220,7 +220,7 @@ static const struct object_ops device_file_ops = NULL, /* remove_queue */ NULL, /* signaled */ NULL, /* satisfied */ - no_signal, /* signal */ + NULL, /* signal */ device_file_get_fd, /* get_fd */ default_fd_get_sync, /* get_sync */ default_map_access, /* map_access */ diff --git a/server/directory.c b/server/directory.c index c56c216d6d5..c80e8e17702 100644 --- a/server/directory.c +++ b/server/directory.c @@ -70,7 +70,7 @@ static const struct object_ops object_type_ops = NULL, /* remove_queue */ NULL, /* signaled */ NULL, /* satisfied */ - no_signal, /* signal */ + NULL, /* signal */ no_get_fd, /* get_fd */ default_get_sync, /* get_sync */ default_map_access, /* map_access */ @@ -121,7 +121,7 @@ static const struct object_ops directory_ops = NULL, /* remove_queue */ NULL, /* signaled */ NULL, /* satisfied */ - no_signal, /* signal */ + NULL, /* signal */ no_get_fd, /* get_fd */ default_get_sync, /* get_sync */ default_map_access, /* map_access */ diff --git a/server/event.c b/server/event.c index c69554fc657..8a7155cc332 100644 --- a/server/event.c +++ b/server/event.c @@ -48,6 +48,7 @@ struct type_descr event_type = STANDARD_RIGHTS_EXECUTE | SYNCHRONIZE, EVENT_ALL_ACCESS }, + EVENT_MODIFY_STATE, /* signal access */ };
struct event_sync @@ -60,7 +61,7 @@ struct event_sync static void event_sync_dump( struct object *obj, int verbose ); static int event_sync_signaled( struct object *obj, struct wait_queue_entry *entry ); static void event_sync_satisfied( struct object *obj, struct wait_queue_entry *entry ); -static int event_sync_signal( struct object *obj, unsigned int access ); +static int event_sync_signal( struct object *obj );
static const struct object_ops event_sync_ops = { @@ -133,7 +134,7 @@ static void event_sync_satisfied( struct object *obj, struct wait_queue_entry *e if (!event->manual) reset_sync( event ); }
-static int event_sync_signal( struct object *obj, unsigned int access ) +static int event_sync_signal( struct object *obj ) { struct event_sync *event = (struct event_sync *)obj; assert( obj->ops == &event_sync_ops ); @@ -150,7 +151,7 @@ struct event
static void event_dump( struct object *obj, int verbose ); static struct object *event_get_sync( struct object *obj ); -static int event_signal( struct object *obj, unsigned int access); +static int event_signal( struct object *obj ); static struct list *event_get_kernel_obj_list( struct object *obj ); static void event_destroy( struct object *obj );
@@ -211,7 +212,7 @@ static const struct object_ops keyed_event_ops = remove_queue, /* remove_queue */ keyed_event_signaled, /* signaled */ no_satisfied, /* satisfied */ - no_signal, /* signal */ + NULL, /* signal */ no_get_fd, /* get_fd */ default_get_sync, /* get_sync */ default_map_access, /* map_access */ @@ -281,16 +282,10 @@ static struct object *event_get_sync( struct object *obj ) return grab_object( event->sync ); }
-static int event_signal( struct object *obj, unsigned int access ) +static int event_signal( struct object *obj ) { struct event *event = (struct event *)obj; assert( obj->ops == &event_ops ); - - if (!(access & EVENT_MODIFY_STATE)) - { - set_error( STATUS_ACCESS_DENIED ); - return 0; - } set_event( event ); return 1; } diff --git a/server/fd.c b/server/fd.c index 1b932cc3ae3..307de7afc07 100644 --- a/server/fd.c +++ b/server/fd.c @@ -169,7 +169,7 @@ static const struct object_ops fd_ops = NULL, /* remove_queue */ NULL, /* signaled */ NULL, /* satisfied */ - no_signal, /* signal */ + NULL, /* signal */ no_get_fd, /* get_fd */ fd_get_sync, /* get_sync */ default_map_access, /* map_access */ @@ -211,7 +211,7 @@ static const struct object_ops device_ops = NULL, /* remove_queue */ NULL, /* signaled */ NULL, /* satisfied */ - no_signal, /* signal */ + NULL, /* signal */ no_get_fd, /* get_fd */ default_get_sync, /* get_sync */ default_map_access, /* map_access */ @@ -252,7 +252,7 @@ static const struct object_ops inode_ops = NULL, /* remove_queue */ NULL, /* signaled */ NULL, /* satisfied */ - no_signal, /* signal */ + NULL, /* signal */ no_get_fd, /* get_fd */ default_get_sync, /* get_sync */ default_map_access, /* map_access */ @@ -297,7 +297,7 @@ static const struct object_ops file_lock_ops = NULL, /* remove_queue */ NULL, /* signaled */ NULL, /* satisfied */ - no_signal, /* signal */ + NULL, /* signal */ no_get_fd, /* get_fd */ file_lock_get_sync, /* get_sync */ default_map_access, /* map_access */ diff --git a/server/file.c b/server/file.c index cc5acc2aadc..840d635441d 100644 --- a/server/file.c +++ b/server/file.c @@ -95,7 +95,7 @@ static const struct object_ops file_ops = NULL, /* remove_queue */ NULL, /* signaled */ NULL, /* satisfied */ - no_signal, /* signal */ + NULL, /* signal */ file_get_fd, /* get_fd */ default_fd_get_sync, /* get_sync */ default_map_access, /* map_access */ diff --git a/server/handle.c b/server/handle.c index ddcf03accb2..27cccc9b249 100644 --- a/server/handle.c +++ b/server/handle.c @@ -127,7 +127,7 @@ static const struct object_ops handle_table_ops = NULL, /* remove_queue */ NULL, /* signaled */ NULL, /* satisfied */ - no_signal, /* signal */ + NULL, /* signal */ no_get_fd, /* get_fd */ default_get_sync, /* get_sync */ default_map_access, /* map_access */ diff --git a/server/hook.c b/server/hook.c index e53ba4514bf..3ca96a44f7d 100644 --- a/server/hook.c +++ b/server/hook.c @@ -81,7 +81,7 @@ static const struct object_ops hook_table_ops = NULL, /* remove_queue */ NULL, /* signaled */ NULL, /* satisfied */ - no_signal, /* signal */ + NULL, /* signal */ no_get_fd, /* get_fd */ default_get_sync, /* get_sync */ default_map_access, /* map_access */ diff --git a/server/inproc_sync.c b/server/inproc_sync.c index f20410c85ed..4615a5b3335 100644 --- a/server/inproc_sync.c +++ b/server/inproc_sync.c @@ -71,7 +71,7 @@ static const struct object_ops inproc_sync_ops = NULL, /* remove_queue */ NULL, /* signaled */ NULL, /* satisfied */ - no_signal, /* signal */ + NULL, /* signal */ no_get_fd, /* get_fd */ default_get_sync, /* get_sync */ default_map_access, /* map_access */ diff --git a/server/mailslot.c b/server/mailslot.c index 430566d044d..f116b79f54a 100644 --- a/server/mailslot.c +++ b/server/mailslot.c @@ -83,7 +83,7 @@ static const struct object_ops mailslot_ops = NULL, /* remove_queue */ NULL, /* signaled */ NULL, /* satisfied */ - no_signal, /* signal */ + NULL, /* signal */ mailslot_get_fd, /* get_fd */ default_fd_get_sync, /* get_sync */ mailslot_map_access, /* map_access */ @@ -145,7 +145,7 @@ static const struct object_ops mail_writer_ops = NULL, /* remove_queue */ NULL, /* signaled */ NULL, /* satisfied */ - no_signal, /* signal */ + NULL, /* signal */ mail_writer_get_fd, /* get_fd */ default_get_sync, /* get_sync */ mail_writer_map_access, /* map_access */ @@ -211,7 +211,7 @@ static const struct object_ops mailslot_device_ops = NULL, /* remove_queue */ NULL, /* signaled */ no_satisfied, /* satisfied */ - no_signal, /* signal */ + NULL, /* signal */ no_get_fd, /* get_fd */ default_get_sync, /* get_sync */ default_map_access, /* map_access */ @@ -242,7 +242,7 @@ static const struct object_ops mailslot_device_file_ops = NULL, /* remove_queue */ NULL, /* signaled */ NULL, /* satisfied */ - no_signal, /* signal */ + NULL, /* signal */ mailslot_device_file_get_fd, /* get_fd */ default_fd_get_sync, /* get_sync */ default_map_access, /* map_access */ diff --git a/server/mapping.c b/server/mapping.c index c3f57b6394c..63914d5a65e 100644 --- a/server/mapping.c +++ b/server/mapping.c @@ -68,7 +68,7 @@ static const struct object_ops ranges_ops = NULL, /* remove_queue */ NULL, /* signaled */ NULL, /* satisfied */ - no_signal, /* signal */ + NULL, /* signal */ no_get_fd, /* get_fd */ default_get_sync, /* get_sync */ default_map_access, /* map_access */ @@ -105,7 +105,7 @@ static const struct object_ops shared_map_ops = NULL, /* remove_queue */ NULL, /* signaled */ NULL, /* satisfied */ - no_signal, /* signal */ + NULL, /* signal */ no_get_fd, /* get_fd */ default_get_sync, /* get_sync */ default_map_access, /* map_access */ @@ -179,7 +179,7 @@ static const struct object_ops mapping_ops = NULL, /* remove_queue */ NULL, /* signaled */ NULL, /* satisfied */ - no_signal, /* signal */ + NULL, /* signal */ mapping_get_fd, /* get_fd */ default_get_sync, /* get_sync */ default_map_access, /* map_access */ diff --git a/server/mutex.c b/server/mutex.c index e370d301472..b92328ecd20 100644 --- a/server/mutex.c +++ b/server/mutex.c @@ -48,6 +48,7 @@ struct type_descr mutex_type = STANDARD_RIGHTS_EXECUTE | SYNCHRONIZE, MUTANT_ALL_ACCESS }, + SYNCHRONIZE, /* signal access */ };
struct mutex_sync @@ -73,7 +74,7 @@ static const struct object_ops mutex_sync_ops = remove_queue, /* remove_queue */ mutex_sync_signaled, /* signaled */ mutex_sync_satisfied, /* satisfied */ - no_signal, /* signal */ + NULL, /* signal */ no_get_fd, /* get_fd */ default_get_sync, /* get_sync */ default_map_access, /* map_access */ @@ -174,7 +175,7 @@ struct mutex
static void mutex_dump( struct object *obj, int verbose ); static struct object *mutex_get_sync( struct object *obj ); -static int mutex_signal( struct object *obj, unsigned int access ); +static int mutex_signal( struct object *obj ); static void mutex_destroy( struct object *obj );
static const struct object_ops mutex_ops = @@ -251,16 +252,10 @@ static struct object *mutex_get_sync( struct object *obj ) return grab_object( mutex->sync ); }
-static int mutex_signal( struct object *obj, unsigned int access ) +static int mutex_signal( struct object *obj ) { struct mutex *mutex = (struct mutex *)obj; assert( obj->ops == &mutex_ops ); - - if (!(access & SYNCHRONIZE)) - { - set_error( STATUS_ACCESS_DENIED ); - return 0; - } return do_release( mutex->sync, current, 1 ); }
diff --git a/server/named_pipe.c b/server/named_pipe.c index e67b25bac5d..6871585d660 100644 --- a/server/named_pipe.c +++ b/server/named_pipe.c @@ -120,7 +120,7 @@ static const struct object_ops named_pipe_ops = NULL, /* remove_queue */ NULL, /* signaled */ NULL, /* satisfied */ - no_signal, /* signal */ + NULL, /* signal */ no_get_fd, /* get_fd */ default_get_sync, /* get_sync */ named_pipe_map_access, /* map_access */ @@ -169,7 +169,7 @@ static const struct object_ops pipe_server_ops = NULL, /* remove_queue */ NULL, /* signaled */ NULL, /* satisfied */ - no_signal, /* signal */ + NULL, /* signal */ pipe_end_get_fd, /* get_fd */ default_fd_get_sync, /* get_sync */ default_map_access, /* map_access */ @@ -214,7 +214,7 @@ static const struct object_ops pipe_client_ops = NULL, /* remove_queue */ NULL, /* signaled */ NULL, /* satisfied */ - no_signal, /* signal */ + NULL, /* signal */ pipe_end_get_fd, /* get_fd */ default_fd_get_sync, /* get_sync */ default_map_access, /* map_access */ @@ -263,7 +263,7 @@ static const struct object_ops named_pipe_device_ops = NULL, /* remove_queue */ NULL, /* signaled */ no_satisfied, /* satisfied */ - no_signal, /* signal */ + NULL, /* signal */ no_get_fd, /* get_fd */ default_get_sync, /* get_sync */ default_map_access, /* map_access */ @@ -295,7 +295,7 @@ static const struct object_ops named_pipe_device_file_ops = NULL, /* remove_queue */ NULL, /* signaled */ NULL, /* satisfied */ - no_signal, /* signal */ + NULL, /* signal */ named_pipe_device_file_get_fd, /* get_fd */ default_fd_get_sync, /* get_sync */ default_map_access, /* map_access */ @@ -346,7 +346,7 @@ static const struct object_ops named_pipe_dir_ops = NULL, /* remove_queue */ NULL, /* signaled */ NULL, /* satisfied */ - no_signal, /* signal */ + NULL, /* signal */ named_pipe_dir_get_fd, /* get_fd */ default_fd_get_sync, /* get_sync */ default_map_access, /* map_access */ diff --git a/server/object.c b/server/object.c index 356956aad6a..b5f9be18412 100644 --- a/server/object.c +++ b/server/object.c @@ -110,7 +110,7 @@ static const struct object_ops apc_reserve_ops = NULL, /* remove_queue */ NULL, /* signaled */ no_satisfied, /* satisfied */ - no_signal, /* signal */ + NULL, /* signal */ no_get_fd, /* get_fd */ default_get_sync, /* get_sync */ default_map_access, /* map_access */ @@ -135,7 +135,7 @@ static const struct object_ops completion_reserve_ops = NULL, /* remove_queue */ NULL, /* signaled */ no_satisfied, /* satisfied */ - no_signal, /* signal */ + NULL, /* signal */ no_get_fd, /* get_fd */ default_get_sync, /* get_sync */ default_map_access, /* map_access */ @@ -630,12 +630,6 @@ void no_satisfied( struct object *obj, struct wait_queue_entry *entry ) { }
-int no_signal( struct object *obj, unsigned int access ) -{ - set_error( STATUS_OBJECT_TYPE_MISMATCH ); - return 0; -} - struct fd *no_get_fd( struct object *obj ) { set_error( STATUS_OBJECT_TYPE_MISMATCH ); diff --git a/server/object.h b/server/object.h index 51b74429e73..af84f1fa6a2 100644 --- a/server/object.h +++ b/server/object.h @@ -56,6 +56,7 @@ struct type_descr struct unicode_str name; /* type name */ unsigned int valid_access; /* mask for valid access bits */ struct generic_map mapping; /* generic access mapping */ + unsigned int signal_access; /* mask for valid signal access */ unsigned int index; /* index in global array of types */ unsigned int obj_count; /* count of objects of this type */ unsigned int handle_count; /* count of handles of this type */ @@ -81,7 +82,7 @@ struct object_ops /* wait satisfied */ void (*satisfied)(struct object *,struct wait_queue_entry *); /* signal an object */ - int (*signal)(struct object *, unsigned int); + int (*signal)(struct object *); /* return an fd object that can be used to read/write from the object */ struct fd *(*get_fd)(struct object *); /* return a sync that can be used to wait/signal the object */ @@ -170,7 +171,6 @@ extern struct object *find_object( const struct namespace *namespace, const stru extern struct object *find_object_index( const struct namespace *namespace, unsigned int index ); extern int no_add_queue( struct object *obj, struct wait_queue_entry *entry ); extern void no_satisfied( struct object *obj, struct wait_queue_entry *entry ); -extern int no_signal( struct object *obj, unsigned int access ); extern struct fd *no_get_fd( struct object *obj ); extern struct object *default_get_sync( struct object *obj ); static inline struct object *get_obj_sync( struct object *obj ) { return obj->ops->get_sync( obj ); } diff --git a/server/process.c b/server/process.c index 8e0f9189a61..d77a70bc655 100644 --- a/server/process.c +++ b/server/process.c @@ -107,7 +107,7 @@ static const struct object_ops process_ops = NULL, /* remove_queue */ NULL, /* signaled */ NULL, /* satisfied */ - no_signal, /* signal */ + NULL, /* signal */ no_get_fd, /* get_fd */ process_get_sync, /* get_sync */ process_map_access, /* map_access */ @@ -160,7 +160,7 @@ static const struct object_ops startup_info_ops = NULL, /* remove_queue */ NULL, /* signaled */ NULL, /* satisfied */ - no_signal, /* signal */ + NULL, /* signal */ no_get_fd, /* get_fd */ startup_info_get_sync, /* get_sync */ default_map_access, /* map_access */ @@ -222,7 +222,7 @@ static const struct object_ops job_ops = NULL, /* remove_queue */ NULL, /* signaled */ NULL, /* satisfied */ - no_signal, /* signal */ + NULL, /* signal */ no_get_fd, /* get_fd */ job_get_sync, /* get_sync */ default_map_access, /* map_access */ diff --git a/server/queue.c b/server/queue.c index 596742bc64c..7623485d676 100644 --- a/server/queue.c +++ b/server/queue.c @@ -169,7 +169,7 @@ static const struct object_ops msg_queue_ops = msg_queue_remove_queue, /* remove_queue */ msg_queue_signaled, /* signaled */ msg_queue_satisfied, /* satisfied */ - no_signal, /* signal */ + NULL, /* signal */ no_get_fd, /* get_fd */ default_get_sync, /* get_sync */ default_map_access, /* map_access */ @@ -207,7 +207,7 @@ static const struct object_ops thread_input_ops = NULL, /* remove_queue */ NULL, /* signaled */ NULL, /* satisfied */ - no_signal, /* signal */ + NULL, /* signal */ no_get_fd, /* get_fd */ default_get_sync, /* get_sync */ default_map_access, /* map_access */ diff --git a/server/registry.c b/server/registry.c index 7cfefc7a6c3..3ceb9b00558 100644 --- a/server/registry.c +++ b/server/registry.c @@ -181,7 +181,7 @@ static const struct object_ops key_ops = NULL, /* remove_queue */ NULL, /* signaled */ NULL, /* satisfied */ - no_signal, /* signal */ + NULL, /* signal */ no_get_fd, /* get_fd */ default_get_sync, /* get_sync */ key_map_access, /* map_access */ diff --git a/server/request.c b/server/request.c index 835ea30cec3..a6b7e71cf15 100644 --- a/server/request.c +++ b/server/request.c @@ -90,7 +90,7 @@ static const struct object_ops master_socket_ops = NULL, /* remove_queue */ NULL, /* signaled */ NULL, /* satisfied */ - no_signal, /* signal */ + NULL, /* signal */ no_get_fd, /* get_fd */ default_get_sync, /* get_sync */ default_map_access, /* map_access */ diff --git a/server/semaphore.c b/server/semaphore.c index 4b31bfe806c..f0ab1a10596 100644 --- a/server/semaphore.c +++ b/server/semaphore.c @@ -48,6 +48,7 @@ struct type_descr semaphore_type = STANDARD_RIGHTS_EXECUTE | SYNCHRONIZE, SEMAPHORE_ALL_ACCESS }, + SEMAPHORE_MODIFY_STATE, /* signal access */ };
struct semaphore_sync @@ -70,7 +71,7 @@ static const struct object_ops semaphore_sync_ops = remove_queue, /* remove_queue */ semaphore_sync_signaled, /* signaled */ semaphore_sync_satisfied, /* satisfied */ - no_signal, /* signal */ + NULL, /* signal */ no_get_fd, /* get_fd */ default_get_sync, /* get_sync */ default_map_access, /* map_access */ @@ -148,7 +149,7 @@ struct semaphore
static void semaphore_dump( struct object *obj, int verbose ); static struct object *semaphore_get_sync( struct object *obj ); -static int semaphore_signal( struct object *obj, unsigned int access ); +static int semaphore_signal( struct object *obj ); static void semaphore_destroy( struct object *obj );
static const struct object_ops semaphore_ops = @@ -218,16 +219,10 @@ static struct object *semaphore_get_sync( struct object *obj ) return grab_object( sem->sync ); }
-static int semaphore_signal( struct object *obj, unsigned int access ) +static int semaphore_signal( struct object *obj ) { struct semaphore *sem = (struct semaphore *)obj; assert( obj->ops == &semaphore_ops ); - - if (!(access & SEMAPHORE_MODIFY_STATE)) - { - set_error( STATUS_ACCESS_DENIED ); - return 0; - } return release_semaphore( sem->sync, 1, NULL ); }
diff --git a/server/serial.c b/server/serial.c index 66cb4aabfbc..40150080ce1 100644 --- a/server/serial.c +++ b/server/serial.c @@ -92,7 +92,7 @@ static const struct object_ops serial_ops = NULL, /* remove_queue */ NULL, /* signaled */ NULL, /* satisfied */ - no_signal, /* signal */ + NULL, /* signal */ serial_get_fd, /* get_fd */ default_fd_get_sync, /* get_sync */ default_map_access, /* map_access */ diff --git a/server/signal.c b/server/signal.c index 078951af6e4..f7a03b3aaf1 100644 --- a/server/signal.c +++ b/server/signal.c @@ -63,7 +63,7 @@ static const struct object_ops handler_ops = NULL, /* remove_queue */ NULL, /* signaled */ NULL, /* satisfied */ - no_signal, /* signal */ + NULL, /* signal */ no_get_fd, /* get_fd */ default_get_sync, /* get_sync */ default_map_access, /* map_access */ diff --git a/server/sock.c b/server/sock.c index 7785d3c7706..75971c3980a 100644 --- a/server/sock.c +++ b/server/sock.c @@ -487,7 +487,7 @@ static const struct object_ops sock_ops = NULL, /* remove_queue */ NULL, /* signaled */ NULL, /* satisfied */ - no_signal, /* signal */ + NULL, /* signal */ sock_get_fd, /* get_fd */ default_fd_get_sync, /* get_sync */ default_map_access, /* map_access */ @@ -3707,7 +3707,7 @@ static const struct object_ops ifchange_ops = NULL, /* remove_queue */ NULL, /* signaled */ no_satisfied, /* satisfied */ - no_signal, /* signal */ + NULL, /* signal */ ifchange_get_fd, /* get_fd */ default_get_sync, /* get_sync */ default_map_access, /* map_access */ @@ -3929,7 +3929,7 @@ static const struct object_ops socket_device_ops = NULL, /* remove_queue */ NULL, /* signaled */ no_satisfied, /* satisfied */ - no_signal, /* signal */ + NULL, /* signal */ no_get_fd, /* get_fd */ default_get_sync, /* get_sync */ default_map_access, /* map_access */ diff --git a/server/symlink.c b/server/symlink.c index 238dcfad1c7..f294e7f0912 100644 --- a/server/symlink.c +++ b/server/symlink.c @@ -72,7 +72,7 @@ static const struct object_ops symlink_ops = NULL, /* remove_queue */ NULL, /* signaled */ NULL, /* satisfied */ - no_signal, /* signal */ + NULL, /* signal */ no_get_fd, /* get_fd */ default_get_sync, /* get_sync */ default_map_access, /* map_access */ diff --git a/server/thread.c b/server/thread.c index 64cd1a74702..b6d6d2230d1 100644 --- a/server/thread.c +++ b/server/thread.c @@ -109,7 +109,7 @@ static const struct object_ops thread_apc_ops = NULL, /* remove_queue */ NULL, /* signaled */ NULL, /* satisfied */ - no_signal, /* signal */ + NULL, /* signal */ no_get_fd, /* get_fd */ thread_apc_get_sync, /* get_sync */ default_map_access, /* map_access */ @@ -154,7 +154,7 @@ static const struct object_ops context_ops = NULL, /* remove_queue */ NULL, /* signaled */ NULL, /* satisfied */ - no_signal, /* signal */ + NULL, /* signal */ no_get_fd, /* get_fd */ context_get_sync, /* get_sync */ default_map_access, /* map_access */ @@ -204,7 +204,7 @@ static const struct object_ops thread_ops = NULL, /* remove_queue */ NULL, /* signaled */ NULL, /* satisfied */ - no_signal, /* signal */ + NULL, /* signal */ no_get_fd, /* get_fd */ thread_get_sync, /* get_sync */ thread_map_access, /* map_access */ @@ -1257,6 +1257,14 @@ static void thread_timeout( void *ptr ) wake_thread( thread ); }
+/* check if an event flag, a semaphore or a mutex can be signaled */ +static unsigned int check_signal_access( struct object *obj, unsigned int access ) +{ + if (!obj->ops->type->signal_access) return STATUS_OBJECT_TYPE_MISMATCH; + if (!(access & obj->ops->type->signal_access)) return STATUS_ACCESS_DENIED; + return STATUS_SUCCESS; +} + /* try signaling an event flag, a semaphore or a mutex */ static int signal_object( obj_handle_t handle ) { @@ -1266,7 +1274,9 @@ static int signal_object( obj_handle_t handle ) obj = get_handle_obj( current->process, handle, 0, NULL ); if (obj) { - ret = obj->ops->signal( obj, get_handle_access( current->process, handle )); + unsigned int status, access = get_handle_access( current->process, handle ); + if ((status = check_signal_access( obj, access ))) set_error( status ); + else ret = obj->ops->signal( obj ); release_object( obj ); } return ret; diff --git a/server/timer.c b/server/timer.c index 522fc6a7113..4d2adf18672 100644 --- a/server/timer.c +++ b/server/timer.c @@ -77,7 +77,7 @@ static const struct object_ops timer_ops = NULL, /* remove_queue */ NULL, /* signaled */ NULL, /* satisfied */ - no_signal, /* signal */ + NULL, /* signal */ no_get_fd, /* get_fd */ timer_get_sync, /* get_sync */ default_map_access, /* map_access */ diff --git a/server/token.c b/server/token.c index 5ce7298211e..f1502b718a8 100644 --- a/server/token.c +++ b/server/token.c @@ -146,7 +146,7 @@ static const struct object_ops token_ops = NULL, /* remove_queue */ NULL, /* signaled */ NULL, /* satisfied */ - no_signal, /* signal */ + NULL, /* signal */ no_get_fd, /* get_fd */ default_get_sync, /* get_sync */ default_map_access, /* map_access */ diff --git a/server/window.c b/server/window.c index e237d40a153..86e89158cf6 100644 --- a/server/window.c +++ b/server/window.c @@ -109,7 +109,7 @@ static const struct object_ops window_ops = NULL, /* remove_queue */ NULL, /* signaled */ NULL, /* satisfied */ - no_signal, /* signal */ + NULL, /* signal */ no_get_fd, /* get_fd */ default_get_sync, /* get_sync */ default_map_access, /* map_access */ diff --git a/server/winstation.c b/server/winstation.c index bfcd4a53613..a747af51162 100644 --- a/server/winstation.c +++ b/server/winstation.c @@ -77,7 +77,7 @@ static const struct object_ops winstation_ops = NULL, /* remove_queue */ NULL, /* signaled */ NULL, /* satisfied */ - no_signal, /* signal */ + NULL, /* signal */ no_get_fd, /* get_fd */ default_get_sync, /* get_sync */ default_map_access, /* map_access */ @@ -118,7 +118,7 @@ static const struct object_ops desktop_ops = NULL, /* remove_queue */ NULL, /* signaled */ NULL, /* satisfied */ - no_signal, /* signal */ + NULL, /* signal */ no_get_fd, /* get_fd */ default_get_sync, /* get_sync */ default_map_access, /* map_access */