Bill Medland (billmedland@mercuryspeed.com) Fix for client accessing a named pipe after the server closes it. Index: wine/server/named_pipe.c =================================================================== RCS file: /home/wine/wine/server/named_pipe.c,v retrieving revision 1.22 diff -u -r1.22 named_pipe.c --- wine/server/named_pipe.c 4 Apr 2003 22:26:34 -0000 1.22 +++ wine/server/named_pipe.c 14 Apr 2003 19:37:55 -0000 @@ -163,7 +163,19 @@ static struct fd *pipe_user_get_fd( struct object *obj ) { struct pipe_user *user = (struct pipe_user *)obj; - return (struct fd *)grab_object( user->fd ); + /* Beware. If this is a client then the fd may be null */ + if (user && user->fd) + return (struct fd *)grab_object( user->fd ); + else + { + set_error (STATUS_PIPE_DISCONNECTED); + /* I presume that this is the correct value. Whatever is entered here, + * it has to translate into ERROR_PIPE_NOT_CONNECTED by the time + * ReadFile returns. + * NB It is NOT STATUS_PIPE_BROKEN. + */ + return 0; + } } static void pipe_user_destroy( struct object *obj) Index: wine/server/fd.c =================================================================== RCS file: /home/wine/wine/server/fd.c,v retrieving revision 1.8 diff -u -r1.8 fd.c --- wine/server/fd.c 26 Mar 2003 01:32:18 -0000 1.8 +++ wine/server/fd.c 14 Apr 2003 19:38:07 -0000 @@ -987,7 +987,10 @@ if ((obj = get_handle_obj( process, handle, access, NULL ))) { - if (!(fd = get_obj_fd( obj ))) set_error( STATUS_OBJECT_TYPE_MISMATCH ); + fd = get_obj_fd (obj); + /* NB It is the object's responsibility to set the error if it + * has no fd + */ release_object( obj ); } return fd; -- Bill Medland ACCPAC International, Inc. medbi01@accpac.com Corporate: www.accpac.com Hosted Services: www.accpaconline.com