svn commit: samba r16539 - in trunk/source: include locking smbd

jra at samba.org jra at samba.org
Tue Jun 27 00:10:45 GMT 2006


Author: jra
Date: 2006-06-27 00:10:40 +0000 (Tue, 27 Jun 2006)
New Revision: 16539

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

Log:
Fix some of Volker's INVALID_DEVICE_REQUEST
replies on a directory handle.
Jeremy.

Modified:
   trunk/source/include/smb_macros.h
   trunk/source/locking/locking.c
   trunk/source/smbd/fake_file.c
   trunk/source/smbd/open.c


Changeset:
Modified: trunk/source/include/smb_macros.h
===================================================================
--- trunk/source/include/smb_macros.h	2006-06-26 23:46:15 UTC (rev 16538)
+++ trunk/source/include/smb_macros.h	2006-06-27 00:10:40 UTC (rev 16539)
@@ -83,8 +83,6 @@
 #define SMB_ASSERT_ARRAY(a,n) SMB_ASSERT((sizeof(a)/sizeof((a)[0])) >= (n))
 
 /* these are useful macros for checking validity of handles */
-#define OPEN_FSP(fsp)    ((fsp) && !(fsp)->is_directory)
-#define OPEN_CONN(conn)    ((conn) && (conn)->open)
 #define IS_IPC(conn)       ((conn) && (conn)->ipc)
 #define IS_PRINT(conn)       ((conn) && (conn)->printer)
 /* you must add the following extern declaration to files using this macro
@@ -96,17 +94,19 @@
 				return(ERROR_DOS(ERRDOS,ERRbadfid));\
 			} while(0)
 
-#define FNUM_OK(fsp,c) (OPEN_FSP(fsp) && (c)==(fsp)->conn && current_user.vuid==(fsp)->vuid)
+#define FNUM_OK(fsp,c) ((fsp) && !(fsp)->is_directory && (c)==(fsp)->conn && current_user.vuid==(fsp)->vuid)
 
 /* you must add the following extern declaration to files using this macro
  * extern struct current_user current_user;
  */
 #define CHECK_FSP(fsp,conn) do {\
 			extern struct current_user current_user;\
-			if (!FNUM_OK(fsp,conn)) \
-				return(ERROR_DOS(ERRDOS,ERRbadfid)); \
+			if ((fsp) && (fsp)->is_directory) \
+				return ERROR_NT(NT_STATUS_INVALID_DEVICE_REQUEST); \
+			else if (!FNUM_OK(fsp,conn)) \
+				return ERROR_NT(NT_STATUS_INVALID_HANDLE); \
 			else if((fsp)->fh->fd == -1) \
-				return(ERROR_DOS(ERRDOS,ERRbadaccess));\
+				return ERROR_NT(NT_STATUS_ACCESS_DENIED); \
 			(fsp)->num_smb_operations++;\
 			} while(0)
 

Modified: trunk/source/locking/locking.c
===================================================================
--- trunk/source/locking/locking.c	2006-06-26 23:46:15 UTC (rev 16538)
+++ trunk/source/locking/locking.c	2006-06-27 00:10:40 UTC (rev 16539)
@@ -150,8 +150,8 @@
 	struct byte_range_lock *br_lck = NULL;
 	NTSTATUS status = NT_STATUS_LOCK_NOT_GRANTED;
 
-	if (!OPEN_FSP(fsp) || !fsp->can_lock) {
-		return NT_STATUS_INVALID_HANDLE;
+	if (!fsp->can_lock) {
+		return fsp->is_directory ? NT_STATUS_INVALID_DEVICE_REQUEST : NT_STATUS_INVALID_HANDLE;
 	}
 
 	if (!lp_locking(SNUM(fsp->conn))) {
@@ -190,8 +190,8 @@
 	struct byte_range_lock *br_lck = NULL;
 	NTSTATUS status = NT_STATUS_LOCK_NOT_GRANTED;
 
-	if (!OPEN_FSP(fsp) || !fsp->can_lock) {
-		return NT_STATUS_INVALID_HANDLE;
+	if (!fsp->can_lock) {
+		return fsp->is_directory ? NT_STATUS_INVALID_DEVICE_REQUEST : NT_STATUS_INVALID_HANDLE;
 	}
 
 	if (!lp_locking(SNUM(fsp->conn))) {
@@ -294,14 +294,14 @@
 	BOOL ok = False;
 	struct byte_range_lock *br_lck = NULL;
 	
+	if (!fsp->can_lock) {
+		return fsp->is_directory ? NT_STATUS_INVALID_DEVICE_REQUEST : NT_STATUS_INVALID_HANDLE;
+	}
+	
 	if (!lp_locking(SNUM(fsp->conn))) {
 		return NT_STATUS_OK;
 	}
 	
-	if (!OPEN_FSP(fsp) || !fsp->can_lock) {
-		return NT_STATUS_INVALID_HANDLE;
-	}
-	
 	DEBUG(10,("do_unlock: unlock start=%.0f len=%.0f requested for fnum %d file %s\n",
 		  (double)offset, (double)count, fsp->fnum, fsp->fsp_name ));
 

Modified: trunk/source/smbd/fake_file.c
===================================================================
--- trunk/source/smbd/fake_file.c	2006-06-26 23:46:15 UTC (rev 16538)
+++ trunk/source/smbd/fake_file.c	2006-06-27 00:10:40 UTC (rev 16539)
@@ -130,7 +130,7 @@
 	fsp->fh->fd = -1;
 	fsp->vuid = current_user.vuid;
 	fsp->fh->pos = -1;
-	fsp->can_lock = True; /* Should this be true ? */
+	fsp->can_lock = False; /* Should this be true ? - No, JRA */
 	fsp->access_mask = access_mask;
 	string_set(&fsp->fsp_name,fname);
 	

Modified: trunk/source/smbd/open.c
===================================================================
--- trunk/source/smbd/open.c	2006-06-26 23:46:15 UTC (rev 16538)
+++ trunk/source/smbd/open.c	2006-06-27 00:10:40 UTC (rev 16539)
@@ -1951,7 +1951,7 @@
 	fsp->dev = psbuf->st_dev;
 	fsp->vuid = current_user.vuid;
 	fsp->file_pid = global_smbpid;
-	fsp->can_lock = True;
+	fsp->can_lock = False;
 	fsp->can_read = False;
 	fsp->can_write = False;
 



More information about the samba-cvs mailing list