s3: smbd: Make dptr_close() safe to call with an fsp handle stored in dptr->dir_hnd.
authorJeremy Allison <jra@samba.org>
Wed, 17 Jul 2019 19:57:00 +0000 (12:57 -0700)
committerRalph Boehme <slow@samba.org>
Tue, 6 Aug 2019 14:23:33 +0000 (14:23 +0000)
SMB1 doesn't currently do this, but subsequent changes will add handle based
calls to SMB1 so dptr_close() has to be able to cleanly remove any back pointers.

Signed-off-by: Jeremy Allison <jra@samba.org>
Reviewed-by: Ralph Boehme <slow@samba.org>
source3/smbd/dir.c

index b885769fff788be6550a9ff4551d10793a85ba7f..541e7cfff6208758e1526de52e5a4471dc4064e2 100644 (file)
@@ -229,6 +229,8 @@ done:
 void dptr_close(struct smbd_server_connection *sconn, int *key)
 {
        struct dptr_struct *dptr;
+       files_struct *fsp = NULL;
+       struct smb_Dir *dir_hnd = NULL;
 
        SMB_ASSERT(!sconn->using_smb2);
 
@@ -242,8 +244,19 @@ void dptr_close(struct smbd_server_connection *sconn, int *key)
                return;
        }
 
+       dir_hnd = dptr->dir_hnd;
+
+       if (dir_hnd != NULL && dir_hnd->fsp != NULL) {
+               SMB_ASSERT(dir_hnd->fsp->dptr->dir_hnd == dir_hnd);
+               fsp = dir_hnd->fsp;
+       }
+
        dptr_close_internal(dptr);
 
+       if (fsp != NULL) {
+               fsp->dptr = NULL;
+       }
+
        *key = INVALID_DPTR_KEY;
 }