gerard patel <[EMAIL PROTECTED]> writes:
> Now, another app has still problems; it seems it's trying to
> read on an invalid handle, and send_client_fd (in server/request.c)
> fails because it gets an EBADF error.
Does this help?
Index: scheduler/thread.c
===================================================================
RCS file: /opt/cvs-commit/wine/scheduler/thread.c,v
retrieving revision 1.85
diff -u -r1.85 thread.c
--- scheduler/thread.c 2000/12/22 02:04:15 1.85
+++ scheduler/thread.c 2000/12/22 17:37:12
@@ -115,8 +115,8 @@
/* Free the associated memory */
if (teb->socket != -1) close( teb->socket );
- close( NtCurrentTeb()->request_fd );
- close( NtCurrentTeb()->reply_fd );
+ close( teb->request_fd );
+ close( teb->reply_fd );
if (teb->stack_sel) FreeSelector16( teb->stack_sel );
FreeSelector16( teb->teb_sel );
if (teb->buffer) munmap( (void *)teb->buffer,
Index: server/async.c
===================================================================
RCS file: /opt/cvs-commit/wine/server/async.c,v
retrieving revision 1.2
diff -u -r1.2 async.c
--- server/async.c 2000/12/19 02:12:45 1.2
+++ server/async.c 2000/12/22 17:37:12
@@ -117,7 +117,7 @@
{
struct async *async = (struct async *)obj;
assert( obj->ops == &async_ops );
- return dup( async->obj.fd );
+ return async->obj.fd;
}
static int async_get_info( struct object *obj, struct get_file_info_request *req ) {
Index: server/console.c
===================================================================
RCS file: /opt/cvs-commit/wine/server/console.c,v
retrieving revision 1.22
diff -u -r1.22 console.c
--- server/console.c 2000/12/22 02:04:15 1.22
+++ server/console.c 2000/12/22 17:37:12
@@ -354,7 +354,7 @@
{
struct console_input *console = (struct console_input *)obj;
assert( obj->ops == &console_input_ops );
- return dup( console->obj.fd );
+ return console->obj.fd;
}
static int console_get_info( struct object *obj, struct get_file_info_request *req )
@@ -395,7 +395,7 @@
{
struct screen_buffer *console = (struct screen_buffer *)obj;
assert( obj->ops == &screen_buffer_ops );
- return dup( console->obj.fd );
+ return console->obj.fd;
}
static void screen_buffer_destroy( struct object *obj )
@@ -481,7 +481,7 @@
if (!(obj = get_handle_obj( current->process, req->file_handle,
GENERIC_READ | GENERIC_WRITE, NULL ))) return;
- if ((fd_in = obj->ops->get_fd( obj )) == -1)
+ if ((fd_in = dup(obj->ops->get_fd( obj ))) == -1)
{
release_object( obj );
return;
Index: server/file.c
===================================================================
RCS file: /opt/cvs-commit/wine/server/file.c,v
retrieving revision 1.33
diff -u -r1.33 file.c
--- server/file.c 2000/12/22 02:04:15 1.33
+++ server/file.c 2000/12/22 17:37:12
@@ -235,7 +235,7 @@
{
struct file *file = (struct file *)obj;
assert( obj->ops == &file_ops );
- return dup( file->obj.fd );
+ return file->obj.fd;
}
static int file_flush( struct object *obj )
@@ -474,8 +474,13 @@
req->fd = -1;
if ((obj = get_handle_obj( current->process, req->handle, req->access, NULL )))
{
- if ((req->fd = get_handle_fd( current->process, req->handle, req->access ))
== -1)
- send_client_fd( current, obj->ops->get_fd( obj ), req->handle );
+ int fd = get_handle_fd( current->process, req->handle, req->access );
+ if (fd != -1) req->fd = fd;
+ else if (!get_error())
+ {
+ if ((fd = obj->ops->get_fd( obj )) != -1)
+ send_client_fd( current, fd, req->handle );
+ }
release_object( obj );
}
}
Index: server/handle.c
===================================================================
RCS file: /opt/cvs-commit/wine/server/handle.c,v
retrieving revision 1.13
diff -u -r1.13 handle.c
--- server/handle.c 2000/12/22 02:04:15 1.13
+++ server/handle.c 2000/12/22 17:37:12
@@ -362,7 +362,6 @@
{
struct handle_entry *entry;
- if (HANDLE_IS_GLOBAL(handle)) return -1; /* no fd cache for global handles */
if (!(entry = get_handle( process, handle ))) return -1;
if ((entry->access & access) != access)
{
Index: server/mapping.c
===================================================================
RCS file: /opt/cvs-commit/wine/server/mapping.c,v
retrieving revision 1.19
diff -u -r1.19 mapping.c
--- server/mapping.c 2000/12/22 02:04:15 1.19
+++ server/mapping.c 2000/12/22 17:37:12
@@ -91,7 +91,11 @@
inline static int get_mmap_fd( struct file *file )
{
struct object *obj;
- if (!(obj = (struct object *)file)) return -1;
+ if (!(obj = (struct object *)file))
+ {
+ set_error( STATUS_INVALID_HANDLE );
+ return -1;
+ }
return obj->ops->get_fd( obj );
}
@@ -100,8 +104,8 @@
IMAGE_SECTION_HEADER *sec, int nb_sec )
{
int i, max_size, total_size, pos;
- char *buffer = NULL;
- int shared_fd = -1;
+ char *buffer = NULL;
+ int shared_fd;
long toread;
/* compute the total size of the shared mapping */
@@ -147,12 +151,10 @@
}
if (write( shared_fd, buffer, sec[i].SizeOfRawData ) != sec[i].SizeOfRawData)
goto error;
}
- close( shared_fd );
free( buffer );
return 1;
error:
- if (shared_fd != -1) close( shared_fd );
if (buffer) free( buffer );
return 0;
}
@@ -193,13 +195,11 @@
if (mapping->header_size > mapping->size_low) goto error;
lseek( fd, filepos, SEEK_SET );
- close( fd );
free( sec );
return 1;
error:
lseek( fd, filepos, SEEK_SET );
- close( fd );
if (sec) free( sec );
set_error( STATUS_INVALID_FILE_FOR_SECTION );
return 0;
Index: server/pipe.c
===================================================================
RCS file: /opt/cvs-commit/wine/server/pipe.c,v
retrieving revision 1.15
diff -u -r1.15 pipe.c
--- server/pipe.c 2000/12/22 02:04:15 1.15
+++ server/pipe.c 2000/12/22 17:37:12
@@ -122,7 +122,7 @@
set_error( STATUS_PIPE_BROKEN );
return -1;
}
- return dup( pipe->obj.fd );
+ return pipe->obj.fd;
}
static int pipe_get_info( struct object *obj, struct get_file_info_request *req )
Index: server/registry.c
===================================================================
RCS file: /opt/cvs-commit/wine/server/registry.c,v
retrieving revision 1.29
diff -u -r1.29 registry.c
--- server/registry.c 2000/12/19 02:12:46 1.29
+++ server/registry.c 2000/12/22 17:37:13
@@ -1340,7 +1340,7 @@
int fd;
if (!(obj = get_handle_obj( current->process, handle, GENERIC_READ, NULL )))
return;
- fd = obj->ops->get_fd( obj );
+ fd = dup(obj->ops->get_fd( obj ));
release_object( obj );
if (fd != -1)
{
@@ -1435,7 +1435,7 @@
return;
}
if (!(obj = get_handle_obj( current->process, handle, GENERIC_WRITE, NULL )))
return;
- fd = obj->ops->get_fd( obj );
+ fd = dup(obj->ops->get_fd( obj ));
release_object( obj );
if (fd != -1)
{
Index: server/request.c
===================================================================
RCS file: /opt/cvs-commit/wine/server/request.c,v
retrieving revision 1.44
diff -u -r1.44 request.c
--- server/request.c 2000/12/22 02:04:15 1.44
+++ server/request.c 2000/12/22 17:37:13
@@ -259,6 +259,9 @@
{
int ret;
+ if (debug_level)
+ fprintf( stderr, "%08x: *fd* %d = %d\n", (unsigned int)thread, handle, fd );
+
#ifdef HAVE_MSGHDR_ACCRIGHTS
msghdr.msg_accrightslen = sizeof(fd);
msghdr.msg_accrights = (void *)&fd;
@@ -272,7 +275,6 @@
myiovec.iov_len = sizeof(handle);
ret = sendmsg( thread->obj.fd, &msghdr, 0 );
- close( fd );
if (ret > 0) return 0;
if (errno == EPIPE)
@@ -381,6 +383,7 @@
}
sock->thread = thread;
send_client_fd( thread, fd[1], -1 );
+ close( fd[1] );
set_select_events( &sock->obj, POLLIN );
return &sock->obj;
}
Index: server/serial.c
===================================================================
RCS file: /opt/cvs-commit/wine/server/serial.c,v
retrieving revision 1.5
diff -u -r1.5 serial.c
--- server/serial.c 2000/12/19 02:12:46 1.5
+++ server/serial.c 2000/12/22 17:37:13
@@ -154,7 +154,7 @@
{
struct serial *serial = (struct serial *)obj;
assert( obj->ops == &serial_ops );
- return dup( serial->obj.fd );
+ return serial->obj.fd;
}
static int serial_get_info( struct object *obj, struct get_file_info_request *req )
Index: server/sock.c
===================================================================
RCS file: /opt/cvs-commit/wine/server/sock.c,v
retrieving revision 1.15
diff -u -r1.15 sock.c
--- server/sock.c 2000/12/19 02:12:46 1.15
+++ server/sock.c 2000/12/22 17:37:13
@@ -255,12 +255,8 @@
static int sock_get_fd( struct object *obj )
{
struct sock *sock = (struct sock *)obj;
- int fd;
assert( obj->ops == &sock_ops );
- fd = dup( sock->obj.fd );
- if (fd==-1)
- sock_set_error();
- return fd;
+ return sock->obj.fd;
}
static void sock_destroy( struct object *obj )
Index: server/thread.c
===================================================================
RCS file: /opt/cvs-commit/wine/server/thread.c,v
retrieving revision 1.55
diff -u -r1.55 thread.c
--- server/thread.c 2000/12/22 02:04:15 1.55
+++ server/thread.c 2000/12/22 17:37:13
@@ -109,6 +109,8 @@
send_client_fd( thread, fd_pipe[0], -1 );
send_client_fd( thread, fd, -1 );
send_reply( thread );
+ close( fd_pipe[0] );
+ close( fd );
return 1;
error:
@@ -691,6 +693,7 @@
THREAD_ALL_ACCESS, req->inherit )) != -1)
{
send_client_fd( current, sock[1], req->handle );
+ close( sock[1] );
/* thread object will be released when the thread gets killed */
add_process_thread( current->process, thread );
return;
--
Alexandre Julliard
[EMAIL PROTECTED]