Commit a510a7e1 authored by Alexandre Julliard's avatar Alexandre Julliard

server: Added access rights mapping to file objects.

parent 46d1b3e8
......@@ -109,9 +109,7 @@ static void test_signalandwait(void)
FILE_ATTRIBUTE_NORMAL | FILE_FLAG_DELETE_ON_CLOSE, NULL);
r = pSignalObjectAndWait(file, file, 0, FALSE);
ok( r == WAIT_FAILED, "should fail\n");
todo_wine {
ok( ERROR_INVALID_HANDLE == GetLastError(), "should return invalid handle error\n");
}
CloseHandle(file);
}
......
......@@ -484,6 +484,11 @@ int wine_server_handle_to_fd( obj_handle_t handle, unsigned int access, int *uni
obj_handle_t fd_handle;
int ret, removable = -1, fd = -1;
/* FIXME: callers should be fixed to pass the appropriate specific rights */
if (access & GENERIC_READ) access |= FILE_READ_DATA;
if (access & GENERIC_WRITE) access |= FILE_WRITE_DATA;
access &= ~(GENERIC_READ|GENERIC_WRITE);
RtlEnterCriticalSection( &fd_cache_section );
*unix_fd = -1;
......
......@@ -48,6 +48,7 @@ struct directory
};
static void directory_dump( struct object *obj, int verbose );
static unsigned int directory_map_access( struct object *obj, unsigned int access );
static struct object *directory_lookup_name( struct object *obj, struct unicode_str *name,
unsigned int attr );
static void directory_destroy( struct object *obj );
......@@ -62,7 +63,7 @@ static const struct object_ops directory_ops =
NULL, /* satisfied */
no_signal, /* signal */
no_get_fd, /* get_fd */
no_map_access, /* map_access */
directory_map_access, /* map_access */
directory_lookup_name, /* lookup_name */
no_close_handle, /* close_handle */
directory_destroy /* destroy */
......@@ -121,6 +122,15 @@ static struct object *directory_lookup_name( struct object *obj, struct unicode_
return NULL;
}
static unsigned int directory_map_access( struct object *obj, unsigned int access )
{
if (access & GENERIC_READ) access |= FILE_GENERIC_READ;
if (access & GENERIC_WRITE) access |= FILE_GENERIC_WRITE;
if (access & GENERIC_EXECUTE) access |= FILE_GENERIC_EXECUTE;
if (access & GENERIC_ALL) access |= FILE_ALL_ACCESS;
return access & ~(GENERIC_READ | GENERIC_WRITE | GENERIC_EXECUTE | GENERIC_ALL);
}
static void directory_destroy( struct object *obj )
{
struct directory *dir = (struct directory *)obj;
......
......@@ -142,7 +142,7 @@ struct fd
struct closed_fd *closed; /* structure to store the unix fd at destroy time */
struct object *user; /* object using this file descriptor */
struct list locks; /* list of locks on this fd */
unsigned int access; /* file access (GENERIC_READ/WRITE) */
unsigned int access; /* file access (FILE_READ_DATA etc.) */
unsigned int sharing; /* file sharing mode */
int unix_fd; /* unix file descriptor */
int fs_locks :1; /* can we use filesystem locks for this fd? */
......@@ -1302,10 +1302,10 @@ static int check_sharing( struct fd *fd, unsigned int access, unsigned int shari
}
}
if ((access & GENERIC_READ) && !(existing_sharing & FILE_SHARE_READ)) return 0;
if ((access & GENERIC_WRITE) && !(existing_sharing & FILE_SHARE_WRITE)) return 0;
if ((existing_access & GENERIC_READ) && !(sharing & FILE_SHARE_READ)) return 0;
if ((existing_access & GENERIC_WRITE) && !(sharing & FILE_SHARE_WRITE)) return 0;
if ((access & FILE_UNIX_READ_ACCESS) && !(existing_sharing & FILE_SHARE_READ)) return 0;
if ((access & FILE_UNIX_WRITE_ACCESS) && !(existing_sharing & FILE_SHARE_WRITE)) return 0;
if ((existing_access & FILE_UNIX_READ_ACCESS) && !(sharing & FILE_SHARE_READ)) return 0;
if ((existing_access & FILE_UNIX_WRITE_ACCESS) && !(sharing & FILE_SHARE_WRITE)) return 0;
if (fd->closed->unlink[0] && !(existing_sharing & FILE_SHARE_DELETE)) return 0;
if (unlink && !(sharing & FILE_SHARE_DELETE)) return 0;
return 1;
......
......@@ -57,12 +57,13 @@ struct file
{
struct object obj; /* object header */
struct fd *fd; /* file descriptor for this file */
unsigned int access; /* file access (GENERIC_READ/WRITE) */
unsigned int access; /* file access (FILE_READ_DATA etc.) */
unsigned int options; /* file options (FILE_DELETE_ON_CLOSE, FILE_SYNCHRONOUS...) */
};
static void file_dump( struct object *obj, int verbose );
static struct fd *file_get_fd( struct object *obj );
static unsigned int file_map_access( struct object *obj, unsigned int access );
static void file_destroy( struct object *obj );
static int file_get_poll_events( struct fd *fd );
......@@ -79,7 +80,7 @@ static const struct object_ops file_ops =
no_satisfied, /* satisfied */
no_signal, /* signal */
file_get_fd, /* get_fd */
no_map_access, /* map_access */
file_map_access, /* map_access */
no_lookup_name, /* lookup_name */
no_close_handle, /* close_handle */
file_destroy /* destroy */
......@@ -108,7 +109,7 @@ static struct file *create_file_for_fd( int fd, unsigned int access, unsigned in
if ((file = alloc_object( &file_ops )))
{
file->access = access;
file->access = file_map_access( &file->obj, access );
file->options = FILE_SYNCHRONOUS_IO_NONALERT;
if (!(file->fd = create_anonymous_fd( &file_fd_ops, fd, &file->obj )))
{
......@@ -125,7 +126,7 @@ static struct object *create_file( const char *nameptr, size_t len, unsigned int
unsigned int attrs )
{
struct file *file;
int flags;
int flags, rw_mode;
char *name;
mode_t mode;
......@@ -144,13 +145,6 @@ static struct object *create_file( const char *nameptr, size_t len, unsigned int
default: set_error( STATUS_INVALID_PARAMETER ); goto error;
}
switch(access & (GENERIC_READ | GENERIC_WRITE))
{
case 0: break;
case GENERIC_READ: flags |= O_RDONLY; break;
case GENERIC_WRITE: flags |= O_WRONLY; break;
case GENERIC_READ|GENERIC_WRITE: flags |= O_RDWR; break;
}
mode = (attrs & FILE_ATTRIBUTE_READONLY) ? 0444 : 0666;
if (len >= 4 &&
......@@ -159,13 +153,24 @@ static struct object *create_file( const char *nameptr, size_t len, unsigned int
if (!(file = alloc_object( &file_ops ))) goto error;
file->access = access;
file->access = file_map_access( &file->obj, access );
file->options = options;
rw_mode = 0;
if (file->access & FILE_UNIX_READ_ACCESS) rw_mode |= FILE_READ_DATA;
if (file->access & FILE_UNIX_WRITE_ACCESS) rw_mode |= FILE_WRITE_DATA;
switch(rw_mode)
{
case 0: break;
case FILE_READ_DATA: flags |= O_RDONLY; break;
case FILE_WRITE_DATA: flags |= O_WRONLY; break;
case FILE_READ_DATA|FILE_WRITE_DATA: flags |= O_RDWR; break;
}
/* FIXME: should set error to STATUS_OBJECT_NAME_COLLISION if file existed before */
if (!(file->fd = alloc_fd( &file_fd_ops, &file->obj )) ||
!(file->fd = open_fd( file->fd, name, flags | O_NONBLOCK | O_LARGEFILE,
&mode, access, sharing, options )))
&mode, file->access, sharing, options )))
{
free( name );
release_object( file );
......@@ -223,8 +228,8 @@ static int file_get_poll_events( struct fd *fd )
struct file *file = get_fd_user( fd );
int events = 0;
assert( file->obj.ops == &file_ops );
if (file->access & GENERIC_READ) events |= POLLIN;
if (file->access & GENERIC_WRITE) events |= POLLOUT;
if (file->access & FILE_UNIX_READ_ACCESS) events |= POLLIN;
if (file->access & FILE_UNIX_WRITE_ACCESS) events |= POLLOUT;
return events;
}
......@@ -255,6 +260,15 @@ static struct fd *file_get_fd( struct object *obj )
return (struct fd *)grab_object( file->fd );
}
static unsigned int file_map_access( struct object *obj, unsigned int access )
{
if (access & GENERIC_READ) access |= FILE_GENERIC_READ;
if (access & GENERIC_WRITE) access |= FILE_GENERIC_WRITE;
if (access & GENERIC_EXECUTE) access |= FILE_GENERIC_EXECUTE;
if (access & GENERIC_ALL) access |= FILE_ALL_ACCESS;
return access & ~(GENERIC_READ | GENERIC_WRITE | GENERIC_EXECUTE | GENERIC_ALL);
}
static void file_destroy( struct object *obj )
{
struct file *file = (struct file *)obj;
......
......@@ -125,4 +125,10 @@ static inline void async_terminate_queue( struct list *queue, int status )
while (!list_empty( queue )) async_terminate_head( queue, status );
}
/* access rights that require Unix read permission */
#define FILE_UNIX_READ_ACCESS (FILE_READ_DATA|FILE_READ_ATTRIBUTES|FILE_READ_EA)
/* access rights that require Unix write permission */
#define FILE_UNIX_WRITE_ACCESS (FILE_WRITE_DATA|FILE_WRITE_ATTRIBUTES|FILE_WRITE_EA)
#endif /* __WINE_SERVER_FILE_H */
......@@ -62,16 +62,10 @@ struct mailslot
struct list writers;
};
struct mailslot_device
{
struct object obj; /* object header */
struct fd *fd; /* pseudo-fd for ioctls */
struct namespace *mailslots; /* mailslot namespace */
};
/* mailslot functions */
static void mailslot_dump( struct object*, int );
static struct fd *mailslot_get_fd( struct object * );
static unsigned int mailslot_map_access( struct object *obj, unsigned int access );
static void mailslot_destroy( struct object * );
static const struct object_ops mailslot_ops =
......@@ -84,7 +78,7 @@ static const struct object_ops mailslot_ops =
no_satisfied, /* satisfied */
no_signal, /* signal */
mailslot_get_fd, /* get_fd */
no_map_access, /* map_access */
mailslot_map_access, /* map_access */
no_lookup_name, /* lookup_name */
no_close_handle, /* close_handle */
mailslot_destroy /* destroy */
......@@ -103,17 +97,19 @@ static const struct fd_ops mailslot_fd_ops =
default_fd_cancel_async /* cancel_async */
};
struct mail_writer
{
struct object obj;
struct mailslot *mailslot;
struct list entry;
int access;
int sharing;
unsigned int access;
unsigned int sharing;
};
static void mail_writer_dump( struct object *obj, int verbose );
static struct fd *mail_writer_get_fd( struct object *obj );
static unsigned int mail_writer_map_access( struct object *obj, unsigned int access );
static void mail_writer_destroy( struct object *obj);
static const struct object_ops mail_writer_ops =
......@@ -126,7 +122,7 @@ static const struct object_ops mail_writer_ops =
NULL, /* satisfied */
no_signal, /* signal */
mail_writer_get_fd, /* get_fd */
no_map_access, /* map_access */
mail_writer_map_access, /* map_access */
no_lookup_name, /* lookup_name */
no_close_handle, /* close_handle */
mail_writer_destroy /* destroy */
......@@ -144,6 +140,14 @@ static const struct fd_ops mail_writer_fd_ops =
NULL /* cancel_async */
};
struct mailslot_device
{
struct object obj; /* object header */
struct fd *fd; /* pseudo-fd for ioctls */
struct namespace *mailslots; /* mailslot namespace */
};
static void mailslot_device_dump( struct object *obj, int verbose );
static struct fd *mailslot_device_get_fd( struct object *obj );
static struct object *mailslot_device_lookup_name( struct object *obj, struct unicode_str *name,
......@@ -231,6 +235,15 @@ static struct fd *mailslot_get_fd( struct object *obj )
return (struct fd *)grab_object( mailslot->fd );
}
static unsigned int mailslot_map_access( struct object *obj, unsigned int access )
{
if (access & GENERIC_READ) access |= FILE_GENERIC_READ;
if (access & GENERIC_WRITE) access |= FILE_GENERIC_WRITE;
if (access & GENERIC_EXECUTE) access |= FILE_GENERIC_EXECUTE;
if (access & GENERIC_ALL) access |= FILE_ALL_ACCESS;
return access & ~(GENERIC_READ | GENERIC_WRITE | GENERIC_EXECUTE | GENERIC_ALL);
}
static void mailslot_queue_async( struct fd *fd, void *apc, void *user,
void *iosb, int type, int count )
{
......@@ -396,6 +409,15 @@ static struct fd *mail_writer_get_fd( struct object *obj )
return (struct fd *)grab_object( writer->mailslot->write_fd );
}
static unsigned int mail_writer_map_access( struct object *obj, unsigned int access )
{
if (access & GENERIC_READ) access |= FILE_GENERIC_READ;
if (access & GENERIC_WRITE) access |= FILE_GENERIC_WRITE;
if (access & GENERIC_EXECUTE) access |= FILE_GENERIC_EXECUTE;
if (access & GENERIC_ALL) access |= FILE_ALL_ACCESS;
return access & ~(GENERIC_READ | GENERIC_WRITE | GENERIC_EXECUTE | GENERIC_ALL);
}
/*
* Readers and writers cannot be mixed.
* If there's more than one writer, all writers must open with FILE_SHARE_WRITE
......@@ -409,7 +431,7 @@ static struct mail_writer *create_mail_writer( struct mailslot *mailslot, unsign
{
writer = LIST_ENTRY( list_head(&mailslot->writers), struct mail_writer, entry );
if (((access & GENERIC_WRITE) || (writer->access & GENERIC_WRITE)) &&
if (((access & (GENERIC_WRITE|FILE_WRITE_DATA)) || (writer->access & FILE_WRITE_DATA)) &&
!((sharing & FILE_SHARE_WRITE) && (writer->sharing & FILE_SHARE_WRITE)))
{
set_error( STATUS_SHARING_VIOLATION );
......@@ -423,7 +445,7 @@ static struct mail_writer *create_mail_writer( struct mailslot *mailslot, unsign
grab_object( mailslot );
writer->mailslot = mailslot;
writer->access = access;
writer->access = mail_writer_map_access( &writer->obj, access );
writer->sharing = sharing;
list_add_head( &mailslot->writers, &writer->entry );
......
......@@ -53,6 +53,7 @@ struct mapping
static void mapping_dump( struct object *obj, int verbose );
static struct fd *mapping_get_fd( struct object *obj );
static unsigned int mapping_map_access( struct object *obj, unsigned int access );
static void mapping_destroy( struct object *obj );
static const struct object_ops mapping_ops =
......@@ -65,7 +66,7 @@ static const struct object_ops mapping_ops =
NULL, /* satisfied */
no_signal, /* signal */
mapping_get_fd, /* get_fd */
no_map_access, /* map_access */
mapping_map_access, /* map_access */
no_lookup_name, /* lookup_name */
no_close_handle, /* close_handle */
mapping_destroy /* destroy */
......@@ -164,7 +165,7 @@ static int build_shared_mapping( struct mapping *mapping, int fd,
/* create a temp file for the mapping */
if (!(mapping->shared_file = create_temp_file( GENERIC_READ|GENERIC_WRITE ))) return 0;
if (!(mapping->shared_file = create_temp_file( FILE_GENERIC_READ|FILE_GENERIC_WRITE ))) return 0;
if (!grow_file( mapping->shared_file, total_size )) goto error;
if ((shared_fd = get_file_unix_fd( mapping->shared_file )) == -1) goto error;
......@@ -293,8 +294,8 @@ static struct object *create_mapping( struct directory *root, const struct unico
mapping->shared_file = NULL;
mapping->shared_size = 0;
if (protect & VPROT_READ) access |= GENERIC_READ;
if (protect & VPROT_WRITE) access |= GENERIC_WRITE;
if (protect & VPROT_READ) access |= FILE_READ_DATA;
if (protect & VPROT_WRITE) access |= FILE_WRITE_DATA;
if (handle)
{
......@@ -357,6 +358,15 @@ static struct fd *mapping_get_fd( struct object *obj )
return get_obj_fd( (struct object *)mapping->file );
}
static unsigned int mapping_map_access( struct object *obj, unsigned int access )
{
if (access & GENERIC_READ) access |= STANDARD_RIGHTS_READ | SECTION_QUERY | SECTION_MAP_READ;
if (access & GENERIC_WRITE) access |= STANDARD_RIGHTS_WRITE | SECTION_MAP_WRITE;
if (access & GENERIC_EXECUTE) access |= STANDARD_RIGHTS_EXECUTE | SECTION_MAP_EXECUTE;
if (access & GENERIC_ALL) access |= SECTION_ALL_ACCESS;
return access & ~(GENERIC_READ | GENERIC_WRITE | GENERIC_EXECUTE | GENERIC_ALL);
}
static void mapping_destroy( struct object *obj )
{
struct mapping *mapping = (struct mapping *)obj;
......
......@@ -107,6 +107,7 @@ struct named_pipe_device
};
static void named_pipe_dump( struct object *obj, int verbose );
static unsigned int named_pipe_map_access( struct object *obj, unsigned int access );
static void named_pipe_destroy( struct object *obj );
static const struct object_ops named_pipe_ops =
......@@ -119,12 +120,15 @@ static const struct object_ops named_pipe_ops =
NULL, /* satisfied */
no_signal, /* signal */
no_get_fd, /* get_fd */
no_map_access, /* map_access */
named_pipe_map_access, /* map_access */
no_lookup_name, /* lookup_name */
no_close_handle, /* close_handle */
named_pipe_destroy /* destroy */
};
/* functions common to server and client */
static unsigned int pipe_map_access( struct object *obj, unsigned int access );
/* server end functions */
static void pipe_server_dump( struct object *obj, int verbose );
static struct fd *pipe_server_get_fd( struct object *obj );
......@@ -142,7 +146,7 @@ static const struct object_ops pipe_server_ops =
no_satisfied, /* satisfied */
no_signal, /* signal */
pipe_server_get_fd, /* get_fd */
no_map_access, /* map_access */
pipe_map_access, /* map_access */
no_lookup_name, /* lookup_name */
no_close_handle, /* close_handle */
pipe_server_destroy /* destroy */
......@@ -175,7 +179,7 @@ static const struct object_ops pipe_client_ops =
no_satisfied, /* satisfied */
no_signal, /* signal */
pipe_client_get_fd, /* get_fd */
no_map_access, /* map_access */
pipe_map_access, /* map_access */
no_lookup_name, /* lookup_name */
no_close_handle, /* close_handle */
pipe_client_destroy /* destroy */
......@@ -207,7 +211,7 @@ static const struct object_ops named_pipe_device_ops =
no_satisfied, /* satisfied */
no_signal, /* signal */
named_pipe_device_get_fd, /* get_fd */
no_map_access, /* map_access */
pipe_map_access, /* map_access */
named_pipe_device_lookup_name, /* lookup_name */
no_close_handle, /* close_handle */
named_pipe_device_destroy /* destroy */
......@@ -232,6 +236,15 @@ static void named_pipe_dump( struct object *obj, int verbose )
fprintf( stderr, "\n" );
}
static unsigned int named_pipe_map_access( struct object *obj, unsigned int access )
{
if (access & GENERIC_READ) access |= STANDARD_RIGHTS_READ;
if (access & GENERIC_WRITE) access |= STANDARD_RIGHTS_WRITE | FILE_CREATE_PIPE_INSTANCE;
if (access & GENERIC_EXECUTE) access |= STANDARD_RIGHTS_EXECUTE;
if (access & GENERIC_ALL) access |= STANDARD_RIGHTS_ALL;
return access & ~(GENERIC_READ | GENERIC_WRITE | GENERIC_EXECUTE | GENERIC_ALL);
}
static void pipe_server_dump( struct object *obj, int verbose )
{
struct pipe_server *server = (struct pipe_server *) obj;
......@@ -317,6 +330,15 @@ static void do_disconnect( struct pipe_server *server )
server->fd = NULL;
}
static unsigned int pipe_map_access( struct object *obj, unsigned int access )
{
if (access & GENERIC_READ) access |= FILE_GENERIC_READ;
if (access & GENERIC_WRITE) access |= FILE_GENERIC_WRITE;
if (access & GENERIC_EXECUTE) access |= FILE_GENERIC_EXECUTE;
if (access & GENERIC_ALL) access |= FILE_ALL_ACCESS;
return access & ~(GENERIC_READ | GENERIC_WRITE | GENERIC_EXECUTE | GENERIC_ALL);
}
static void pipe_server_destroy( struct object *obj)
{
struct pipe_server *server = (struct pipe_server *)obj;
......
......@@ -314,7 +314,11 @@ struct fd *no_get_fd( struct object *obj )
unsigned int no_map_access( struct object *obj, unsigned int access )
{
return access;
if (access & GENERIC_READ) access |= STANDARD_RIGHTS_READ;
if (access & GENERIC_WRITE) access |= STANDARD_RIGHTS_WRITE;
if (access & GENERIC_EXECUTE) access |= STANDARD_RIGHTS_EXECUTE;
if (access & GENERIC_ALL) access |= STANDARD_RIGHTS_ALL;
return access & ~(GENERIC_READ | GENERIC_WRITE | GENERIC_EXECUTE | GENERIC_ALL);
}
struct object *no_lookup_name( struct object *obj, struct unicode_str *name,
......
......@@ -900,7 +900,7 @@ DECL_HANDLER(new_process)
info->data = NULL;
if (req->exe_file &&
!(info->exe_file = get_file_obj( current->process, req->exe_file, GENERIC_READ )))
!(info->exe_file = get_file_obj( current->process, req->exe_file, FILE_READ_DATA )))
goto done;
if (!(info->data = memdup( get_req_data(), info->data_size ))) goto done;
......@@ -999,7 +999,7 @@ DECL_HANDLER(init_process_done)
process->exe.size = req->module_size;
process->exe.name = req->name;
if (req->exe_file) file = get_file_obj( process, req->exe_file, GENERIC_READ );
if (req->exe_file) file = get_file_obj( process, req->exe_file, FILE_READ_DATA );
if (process->exe.file) release_object( process->exe.file );
process->exe.file = file;
......@@ -1126,7 +1126,7 @@ DECL_HANDLER(load_dll)
struct process_dll *dll;
struct file *file = NULL;
if (req->handle && !(file = get_file_obj( current->process, req->handle, GENERIC_READ )))
if (req->handle && !(file = get_file_obj( current->process, req->handle, FILE_READ_DATA )))
return;
if ((dll = process_load_dll( current->process, file, req->base,
......
......@@ -1408,7 +1408,7 @@ static void load_registry( struct key *key, obj_handle_t handle )
struct file *file;
int fd;
if (!(file = get_file_obj( current->process, handle, GENERIC_READ ))) return;
if (!(file = get_file_obj( current->process, handle, FILE_READ_DATA ))) return;
fd = dup( get_file_unix_fd( file ) );
release_object( file );
if (fd != -1)
......@@ -1550,7 +1550,7 @@ static void save_registry( struct key *key, obj_handle_t handle )
set_error( STATUS_KEY_DELETED );
return;
}
if (!(file = get_file_obj( current->process, handle, GENERIC_WRITE ))) return;
if (!(file = get_file_obj( current->process, handle, FILE_WRITE_DATA ))) return;
fd = dup( get_file_unix_fd( file ) );
release_object( file );
if (fd != -1)
......
......@@ -58,6 +58,7 @@
static void serial_dump( struct object *obj, int verbose );
static struct fd *serial_get_fd( struct object *obj );
static unsigned int serial_map_access( struct object *obj, unsigned int access );
static void serial_destroy(struct object *obj);
static int serial_get_poll_events( struct fd *fd );
......@@ -102,7 +103,7 @@ static const struct object_ops serial_ops =
no_satisfied, /* satisfied */
no_signal, /* signal */
serial_get_fd, /* get_fd */
no_map_access, /* map_access */
serial_map_access, /* map_access */
no_lookup_name, /* lookup_name */
no_close_handle, /* close_handle */
serial_destroy /* destroy */
......@@ -168,6 +169,15 @@ static struct fd *serial_get_fd( struct object *obj )
return (struct fd *)grab_object( serial->fd );
}
static unsigned int serial_map_access( struct object *obj, unsigned int access )
{
if (access & GENERIC_READ) access |= FILE_GENERIC_READ;
if (access & GENERIC_WRITE) access |= FILE_GENERIC_WRITE;
if (access & GENERIC_EXECUTE) access |= FILE_GENERIC_EXECUTE;
if (access & GENERIC_ALL) access |= FILE_ALL_ACCESS;
return access & ~(GENERIC_READ | GENERIC_WRITE | GENERIC_EXECUTE | GENERIC_ALL);
}
static void serial_destroy( struct object *obj)
{
struct serial *serial = (struct serial *)obj;
......
......@@ -90,6 +90,7 @@ struct sock
static void sock_dump( struct object *obj, int verbose );
static int sock_signaled( struct object *obj, struct thread *thread );
static struct fd *sock_get_fd( struct object *obj );
static unsigned int sock_map_access( struct object *obj, unsigned int access );
static void sock_destroy( struct object *obj );
static int sock_get_poll_events( struct fd *fd );
......@@ -111,7 +112,7 @@ static const struct object_ops sock_ops =
no_satisfied, /* satisfied */
no_signal, /* signal */
sock_get_fd, /* get_fd */
no_map_access, /* map_access */
sock_map_access, /* map_access */
no_lookup_name, /* lookup_name */
no_close_handle, /* close_handle */
sock_destroy /* destroy */
......@@ -457,6 +458,15 @@ static int sock_signaled( struct object *obj, struct thread *thread )
return check_fd_events( sock->fd, sock_get_poll_events( sock->fd ) ) != 0;
}
static unsigned int sock_map_access( struct object *obj, unsigned int access )
{
if (access & GENERIC_READ) access |= FILE_GENERIC_READ;
if (access & GENERIC_WRITE) access |= FILE_GENERIC_WRITE;
if (access & GENERIC_EXECUTE) access |= FILE_GENERIC_EXECUTE;
if (access & GENERIC_ALL) access |= FILE_ALL_ACCESS;
return access & ~(GENERIC_READ | GENERIC_WRITE | GENERIC_EXECUTE | GENERIC_ALL);
}
static int sock_get_poll_events( struct fd *fd )
{
struct sock *sock = get_fd_user( fd );
......@@ -629,8 +639,7 @@ static struct sock *accept_socket( obj_handle_t handle )
int acceptfd;
struct sockaddr saddr;
sock=(struct sock*)get_handle_obj(current->process,handle,
GENERIC_READ|GENERIC_WRITE|SYNCHRONIZE,&sock_ops);
sock = (struct sock *)get_handle_obj( current->process, handle, FILE_READ_DATA, &sock_ops );
if (!sock)
return NULL;
......@@ -801,9 +810,8 @@ DECL_HANDLER(set_socket_event)
struct event *old_event;
int pollev;
if (!(sock = (struct sock*)get_handle_obj( current->process, req->handle,
GENERIC_READ|GENERIC_WRITE|SYNCHRONIZE, &sock_ops)))
return;
if (!(sock = (struct sock *)get_handle_obj( current->process, req->handle,
FILE_WRITE_ATTRIBUTES, &sock_ops))) return;
old_event = sock->event;
sock->mask = req->mask;
sock->event = NULL;
......@@ -835,7 +843,7 @@ DECL_HANDLER(get_socket_event)
{
struct sock *sock;
sock=(struct sock*)get_handle_obj(current->process,req->handle,GENERIC_READ|GENERIC_WRITE|SYNCHRONIZE,&sock_ops);
sock = (struct sock *)get_handle_obj( current->process, req->handle, FILE_READ_ATTRIBUTES, &sock_ops );
if (!sock)
{
reply->mask = 0;
......@@ -874,7 +882,7 @@ DECL_HANDLER(enable_socket_event)
int pollev;
if (!(sock = (struct sock*)get_handle_obj( current->process, req->handle,
GENERIC_READ|GENERIC_WRITE|SYNCHRONIZE, &sock_ops)))
FILE_WRITE_ATTRIBUTES, &sock_ops)))
return;
sock->pmask &= ~req->mask; /* is this safe? */
......@@ -895,15 +903,13 @@ DECL_HANDLER(set_socket_deferred)
{
struct sock *sock, *acceptsock;
sock=(struct sock*)get_handle_obj( current->process,req->handle,
GENERIC_READ|GENERIC_WRITE|SYNCHRONIZE,&sock_ops );
sock=(struct sock *)get_handle_obj( current->process, req->handle, FILE_WRITE_ATTRIBUTES, &sock_ops );
if ( !sock )
{
set_error( WSAENOTSOCK );
return;
}
acceptsock = (struct sock*)get_handle_obj( current->process,req->deferred,
GENERIC_READ|GENERIC_WRITE|SYNCHRONIZE,&sock_ops );
acceptsock = (struct sock *)get_handle_obj( current->process, req->deferred, 0, &sock_ops );
if ( !acceptsock )
{
release_object( sock );
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment