server: Always switch back to server dir when open_fd returns.

Sebastian Lackner sebastian at fds-team.de
Wed Sep 23 21:20:18 CDT 2015


create_temp_file() assumes that the working directory is set correctly.

Signed-off-by: Sebastian Lackner <sebastian at fds-team.de>
---
 server/fd.c |   16 +++++++---------
 1 file changed, 7 insertions(+), 9 deletions(-)

diff --git a/server/fd.c b/server/fd.c
index fef4827..6c78a0a 100644
--- a/server/fd.c
+++ b/server/fd.c
@@ -1835,34 +1835,31 @@ struct fd *open_fd( struct fd *root, const char *name, int flags, mode_t *mode,
         fd->closed = closed_fd;
         fd->cacheable = !inode->device->removable;
         list_add_head( &inode->open, &fd->inode_entry );
+        closed_fd = NULL;
 
         /* check directory options */
         if ((options & FILE_DIRECTORY_FILE) && !S_ISDIR(st.st_mode))
         {
-            release_object( fd );
             set_error( STATUS_NOT_A_DIRECTORY );
-            return NULL;
+            goto error;
         }
         if ((options & FILE_NON_DIRECTORY_FILE) && S_ISDIR(st.st_mode))
         {
-            release_object( fd );
             set_error( STATUS_FILE_IS_A_DIRECTORY );
-            return NULL;
+            goto error;
         }
         if ((err = check_sharing( fd, access, sharing, flags, options )))
         {
-            release_object( fd );
             set_error( err );
-            return NULL;
+            goto error;
         }
-        closed_fd->unlink = (options & FILE_DELETE_ON_CLOSE) != 0;
+        fd->closed->unlink = (options & FILE_DELETE_ON_CLOSE) != 0;
         if (flags & O_TRUNC)
         {
             if (S_ISDIR(st.st_mode))
             {
-                release_object( fd );
                 set_error( STATUS_OBJECT_NAME_COLLISION );
-                return NULL;
+                goto error;
             }
             ftruncate( fd->unix_fd, 0 );
         }
@@ -1877,6 +1874,7 @@ struct fd *open_fd( struct fd *root, const char *name, int flags, mode_t *mode,
         free( closed_fd );
         fd->cacheable = 1;
     }
+    if (root_fd != -1) fchdir( server_dir_fd ); /* go back to the server dir */
     return fd;
 
 error:
-- 
2.5.1



More information about the wine-patches mailing list