Pass fsp to dptr_CloseDir(). Cope with setting the fd if we're closing an fd that...
authorJeremy Allison <jra@samba.org>
Tue, 8 Feb 2011 23:05:00 +0000 (15:05 -0800)
committerJeremy Allison <jra@samba.org>
Tue, 8 Feb 2011 23:06:00 +0000 (15:06 -0800)
source3/include/proto.h
source3/smbd/close.c
source3/smbd/dir.c
source3/smbd/open.c
source3/smbd/smb2_find.c

index 77a7a4055a04623881537c410f26f2c014a3ebc4..00e9de4c137adcab4d4a071b11fb8fa986a9c3bf 100644 (file)
@@ -4548,7 +4548,7 @@ void dptr_closepath(struct smbd_server_connection *sconn,
                    char *path,uint16 spid);
 NTSTATUS dptr_create(connection_struct *conn, const char *path, bool old_handle, bool expect_close,uint16 spid,
                const char *wcard, bool wcard_has_wild, uint32 attr, struct dptr_struct **dptr_ret);
-int dptr_CloseDir(struct dptr_struct *dptr);
+void dptr_CloseDir(files_struct *fsp);
 void dptr_SeekDir(struct dptr_struct *dptr, long offset);
 long dptr_TellDir(struct dptr_struct *dptr);
 bool dptr_has_wild(struct dptr_struct *dptr);
index 25ed9a3c4db7726ecad22a8beaf94df387ac556c..d5a824f868fbc2ec22a719d26bd3703eef09980f 100644 (file)
@@ -1061,10 +1061,6 @@ static NTSTATUS close_directory(struct smb_request *req, files_struct *fsp,
                          strerror(errno)));
        }
 
-       if (fsp->dptr) {
-               dptr_CloseDir(fsp->dptr);
-       }
-
        /*
         * Do the code common to files and directories.
         */
index 7c9d6e262e0d72e365d1250d719595654e869b59..f81206e0ecfeebde899a2d1c0a3c1779570f403d 100644 (file)
@@ -554,10 +554,16 @@ NTSTATUS dptr_create(connection_struct *conn, const char *path, bool old_handle,
  Wrapper functions to access the lower level directory handles.
 ****************************************************************************/
 
-int dptr_CloseDir(struct dptr_struct *dptr)
+void dptr_CloseDir(files_struct *fsp)
 {
-       dptr_close_internal(dptr);
-       return 0;
+       if (fsp->dptr) {
+               if (fsp->fh->fd == dirfd(fsp->dptr->dir_hnd->dir)) {
+                       /* The call below closes the underlying fd. */
+                       fsp->fh->fd = -1;
+               }
+               dptr_close_internal(fsp->dptr);
+               fsp->dptr = NULL;
+       }
 }
 
 void dptr_SeekDir(struct dptr_struct *dptr, long offset)
index ded3d344c55e4488596c19927cb1b7389023b295..a9a12eaa0b233c6c478cd30100a3b9089f3ebd6a 100644 (file)
@@ -168,6 +168,9 @@ NTSTATUS fd_close(files_struct *fsp)
 {
        int ret;
 
+       if (fsp->dptr) {
+               dptr_CloseDir(fsp);
+       }
        if (fsp->fh->fd == -1) {
                return NT_STATUS_OK; /* What we used to call a stat open. */
        }
index 9a7738ab7629a6c0253e4d9f5920d9ef7bd0a3f3..b10446c3f10c009d2c603a4522e37d30ed185c6b 100644 (file)
@@ -317,10 +317,7 @@ static struct tevent_req *smbd_smb2_find_send(TALLOC_CTX *mem_ctx,
        }
 
        if (in_flags & SMB2_CONTINUE_FLAG_REOPEN) {
-               if (fsp->dptr) {
-                       dptr_CloseDir(fsp->dptr);
-                       fsp->dptr = NULL;
-               }
+               dptr_CloseDir(fsp);
        }
 
        if (fsp->dptr == NULL) {