summaryrefslogtreecommitdiff
path: root/source3/locking/locking.c
diff options
context:
space:
mode:
authorJeremy Allison <jra@samba.org>2007-01-18 06:19:24 +0000
committerGerald (Jerry) Carter <jerry@samba.org>2007-10-10 12:17:16 -0500
commitfd37f98158161406229b728a7c767121a30e254f (patch)
treebcc2ecea864702f61d56ccb1e2b10f7fa3672cc6 /source3/locking/locking.c
parenta99840e59ee4bd27fd4f2cf8b465dd0f215ea067 (diff)
downloadsamba-fd37f98158161406229b728a7c767121a30e254f.tar.gz
samba-fd37f98158161406229b728a7c767121a30e254f.tar.bz2
samba-fd37f98158161406229b728a7c767121a30e254f.zip
r20873: Some correctness fixes w.r.t. Samba4 torture BASE-DELETE.
Allow us to correctly refuse to set delete on close on a non-empty directory. There are still some delete-on-close wrinkles to be fixed, but I understand how to do that better now. I'll fix this tomorrow. Jeremy. (This used to be commit 029635885825a5562e7974a6f5675cce3bf1b5dc)
Diffstat (limited to 'source3/locking/locking.c')
-rw-r--r--source3/locking/locking.c40
1 files changed, 40 insertions, 0 deletions
diff --git a/source3/locking/locking.c b/source3/locking/locking.c
index 13c7724656..111fc98bbe 100644
--- a/source3/locking/locking.c
+++ b/source3/locking/locking.c
@@ -1152,6 +1152,46 @@ NTSTATUS can_set_delete_on_close(files_struct *fsp, BOOL delete_on_close,
return NT_STATUS_ACCESS_DENIED;
}
+ /* Don't allow delete on close for non-empty directories. */
+ if (fsp->is_directory) {
+ long offset = 0;
+ NTSTATUS status;
+ SMB_STRUCT_STAT st;
+ struct dptr_struct *dirptr;
+ const char *name;
+
+ status = dptr_create(fsp->conn,
+ fsp->fsp_name,
+ False,
+ True,
+ 0,
+ "*",
+ True,
+ 0,
+ &dirptr);
+ if (!NT_STATUS_IS_OK(status)) {
+ return status;
+ }
+
+ /* Read 3 entries. Ignore first 2 (they're . and .. ) */
+ name = dptr_ReadDirName(dirptr, &offset, &st);
+ if (!name) {
+ dptr_CloseDir(dirptr);
+ return NT_STATUS_ACCESS_DENIED;
+ }
+ name = dptr_ReadDirName(dirptr, &offset, &st);
+ if (!name) {
+ dptr_CloseDir(dirptr);
+ return NT_STATUS_ACCESS_DENIED;
+ }
+ name = dptr_ReadDirName(dirptr, &offset, &st);
+ dptr_CloseDir(dirptr);
+ if (name) {
+ DEBUG(10,("can_set_delete_on_close: got name %s - can't delete\n", name ));
+ return NT_STATUS_DIRECTORY_NOT_EMPTY;
+ }
+ }
+
return NT_STATUS_OK;
}