svn commit: samba r21257 - in branches: SAMBA_3_0/source/lib SAMBA_3_0/source/locking SAMBA_3_0/source/smbd SAMBA_3_0_25/source/lib SAMBA_3_0_25/source/locking SAMBA_3_0_25/source/smbd

jra at samba.org jra at samba.org
Fri Feb 9 02:03:40 GMT 2007


Author: jra
Date: 2007-02-09 02:03:39 +0000 (Fri, 09 Feb 2007)
New Revision: 21257

WebSVN: http://websvn.samba.org/cgi-bin/viewcvs.cgi?view=rev&root=samba&rev=21257

Log:
Better fix for bug #4188 :
Windows Vista RC1 and RC2 can't delete directory on Samba share
based on work by Joe Meadows <jmeadows at webopolis.com>.
Jeremy.

Modified:
   branches/SAMBA_3_0/source/lib/dummysmbd.c
   branches/SAMBA_3_0/source/locking/locking.c
   branches/SAMBA_3_0/source/smbd/dir.c
   branches/SAMBA_3_0_25/source/lib/dummysmbd.c
   branches/SAMBA_3_0_25/source/locking/locking.c
   branches/SAMBA_3_0_25/source/smbd/dir.c


Changeset:
Modified: branches/SAMBA_3_0/source/lib/dummysmbd.c
===================================================================
--- branches/SAMBA_3_0/source/lib/dummysmbd.c	2007-02-09 01:52:13 UTC (rev 21256)
+++ branches/SAMBA_3_0/source/lib/dummysmbd.c	2007-02-09 02:03:39 UTC (rev 21257)
@@ -38,22 +38,13 @@
 {
 }
 
-NTSTATUS dptr_create(connection_struct *conn, pstring path, BOOL old_handle, BOOL expect_close,uint16 spid,
-		                const char *wcard, BOOL wcard_has_wild, uint32 attr, struct dptr_struct **dptr_ret)
+void send_stat_cache_delete_message(const char *name)
 {
-	return NT_STATUS_OK;
 }
 
-int dptr_CloseDir(struct dptr_struct *dptr)
+NTSTATUS can_delete_directory(struct connection_struct *conn,
+				const char *dirname)
 {
-	return 0;
+	return NT_STATUS_OK;
 }
 
-const char *dptr_ReadDirName(struct dptr_struct *dptr, long *poffset, SMB_STRUCT_STAT *pst)
-{
-	return NULL;
-}
-
-void send_stat_cache_delete_message(const char *name)
-{
-}

Modified: branches/SAMBA_3_0/source/locking/locking.c
===================================================================
--- branches/SAMBA_3_0/source/locking/locking.c	2007-02-09 01:52:13 UTC (rev 21256)
+++ branches/SAMBA_3_0/source/locking/locking.c	2007-02-09 02:03:39 UTC (rev 21257)
@@ -1151,42 +1151,7 @@
 
 	/* 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 can_delete_directory(fsp->conn, fsp->fsp_name);
 	}
 
 	return NT_STATUS_OK;

Modified: branches/SAMBA_3_0/source/smbd/dir.c
===================================================================
--- branches/SAMBA_3_0/source/smbd/dir.c	2007-02-09 01:52:13 UTC (rev 21256)
+++ branches/SAMBA_3_0/source/smbd/dir.c	2007-02-09 02:03:39 UTC (rev 21257)
@@ -1279,3 +1279,42 @@
 	}
 	return False;
 }
+
+/*****************************************************************
+ Is this directory empty ?
+*****************************************************************/
+
+NTSTATUS can_delete_directory(struct connection_struct *conn,
+				const char *dirname)
+{
+	NTSTATUS status = NT_STATUS_OK;
+	long dirpos = 0;
+	const char *dname;
+	struct smb_Dir *dir_hnd = OpenDir(conn, dirname, NULL, 0);
+
+	if (!dir_hnd) {
+		return map_nt_error_from_unix(errno);
+	}
+
+	while ((dname = ReadDirName(dir_hnd,&dirpos))) {
+		SMB_STRUCT_STAT st;
+
+		/* Quick check for "." and ".." */
+		if (dname[0] == '.') {
+			if (!dname[1] || (dname[1] == '.' && !dname[2])) {
+				continue;
+			}
+		}
+
+		if (!is_visible_file(conn, dirname, dname, &st, True)) {
+			continue;
+		}
+
+		DEBUG(10,("can_delete_directory: got name %s - can't delete\n", dname ));
+		status = NT_STATUS_DIRECTORY_NOT_EMPTY;
+		break;
+	}
+	CloseDir(dir_hnd);
+
+	return status;
+}

Modified: branches/SAMBA_3_0_25/source/lib/dummysmbd.c
===================================================================
--- branches/SAMBA_3_0_25/source/lib/dummysmbd.c	2007-02-09 01:52:13 UTC (rev 21256)
+++ branches/SAMBA_3_0_25/source/lib/dummysmbd.c	2007-02-09 02:03:39 UTC (rev 21257)
@@ -38,22 +38,13 @@
 {
 }
 
-NTSTATUS dptr_create(connection_struct *conn, pstring path, BOOL old_handle, BOOL expect_close,uint16 spid,
-		                const char *wcard, BOOL wcard_has_wild, uint32 attr, struct dptr_struct **dptr_ret)
+void send_stat_cache_delete_message(const char *name)
 {
-	return NT_STATUS_OK;
 }
 
-int dptr_CloseDir(struct dptr_struct *dptr)
+NTSTATUS can_delete_directory(struct connection_struct *conn,
+				const char *dirname)
 {
-	return 0;
+	return NT_STATUS_OK;
 }
 
-const char *dptr_ReadDirName(struct dptr_struct *dptr, long *poffset, SMB_STRUCT_STAT *pst)
-{
-	return NULL;
-}
-
-void send_stat_cache_delete_message(const char *name)
-{
-}

Modified: branches/SAMBA_3_0_25/source/locking/locking.c
===================================================================
--- branches/SAMBA_3_0_25/source/locking/locking.c	2007-02-09 01:52:13 UTC (rev 21256)
+++ branches/SAMBA_3_0_25/source/locking/locking.c	2007-02-09 02:03:39 UTC (rev 21257)
@@ -1151,42 +1151,7 @@
 
 	/* 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 can_delete_directory(fsp->conn, fsp->fsp_name);
 	}
 
 	return NT_STATUS_OK;

Modified: branches/SAMBA_3_0_25/source/smbd/dir.c
===================================================================
--- branches/SAMBA_3_0_25/source/smbd/dir.c	2007-02-09 01:52:13 UTC (rev 21256)
+++ branches/SAMBA_3_0_25/source/smbd/dir.c	2007-02-09 02:03:39 UTC (rev 21257)
@@ -1279,3 +1279,42 @@
 	}
 	return False;
 }
+
+/*****************************************************************
+ Is this directory empty ?
+*****************************************************************/
+
+NTSTATUS can_delete_directory(struct connection_struct *conn,
+				const char *dirname)
+{
+	NTSTATUS status = NT_STATUS_OK;
+	long dirpos = 0;
+	const char *dname;
+	struct smb_Dir *dir_hnd = OpenDir(conn, dirname, NULL, 0);
+
+	if (!dir_hnd) {
+		return map_nt_error_from_unix(errno);
+	}
+
+	while ((dname = ReadDirName(dir_hnd,&dirpos))) {
+		SMB_STRUCT_STAT st;
+
+		/* Quick check for "." and ".." */
+		if (dname[0] == '.') {
+			if (!dname[1] || (dname[1] == '.' && !dname[2])) {
+				continue;
+			}
+		}
+
+		if (!is_visible_file(conn, dirname, dname, &st, True)) {
+			continue;
+		}
+
+		DEBUG(10,("can_delete_directory: got name %s - can't delete\n", dname ));
+		status = NT_STATUS_DIRECTORY_NOT_EMPTY;
+		break;
+	}
+	CloseDir(dir_hnd);
+
+	return status;
+}



More information about the samba-cvs mailing list