svn commit: samba r15720 - in trunk/source: include smbd

vlendec at samba.org vlendec at samba.org
Fri May 19 19:50:33 GMT 2006


Author: vlendec
Date: 2006-05-19 19:50:33 +0000 (Fri, 19 May 2006)
New Revision: 15720

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

Log:
Steal the NT_STATUS_DOS trick to stash forced DOS error codes into NTSTATUS
from Samba4.

Get rid of set_saved_error_triple. The places where DOS and NTSTATUS codes are
actually not mappable are made explicit in the code by looking at what kind of
code is required.

Volker

Modified:
   trunk/source/include/nt_status.h
   trunk/source/include/nterr.h
   trunk/source/include/smb_macros.h
   trunk/source/smbd/error.c
   trunk/source/smbd/open.c
   trunk/source/smbd/process.c
   trunk/source/smbd/reply.c


Changeset:
Modified: trunk/source/include/nt_status.h
===================================================================
--- trunk/source/include/nt_status.h	2006-05-19 18:37:35 UTC (rev 15719)
+++ trunk/source/include/nt_status.h	2006-05-19 19:50:33 UTC (rev 15720)
@@ -56,7 +56,6 @@
 
 #define NT_STATUS_IS_OK(x) (NT_STATUS_V(x) == 0)
 #define NT_STATUS_IS_ERR(x) ((NT_STATUS_V(x) & 0xc0000000) == 0xc0000000)
-#define NT_STATUS_IS_INVALID(x) (NT_STATUS_V(x) == 0xFFFFFFFF)
 #define NT_STATUS_EQUAL(x,y) (NT_STATUS_V(x) == NT_STATUS_V(y))
 #define W_ERROR_IS_OK(x) (W_ERROR_V(x) == 0)
 #define W_ERROR_EQUAL(x,y) (W_ERROR_V(x) == W_ERROR_V(y))
@@ -67,4 +66,12 @@
         }\
 } while (0)
 
+/* this defines special NTSTATUS codes to represent DOS errors.  I
+   have chosen this macro to produce status codes in the invalid
+   NTSTATUS range */
+#define NT_STATUS_DOS(class, code) NT_STATUS(0xF1000000 | ((class)<<16) | code)
+#define NT_STATUS_IS_DOS(status) ((NT_STATUS_V(status) & 0xFF000000) == 0xF1000000)
+#define NT_STATUS_DOS_CLASS(status) ((NT_STATUS_V(status) >> 16) & 0xFF)
+#define NT_STATUS_DOS_CODE(status) (NT_STATUS_V(status) & 0xFFFF)
+
 #endif

Modified: trunk/source/include/nterr.h
===================================================================
--- trunk/source/include/nterr.h	2006-05-19 18:37:35 UTC (rev 15719)
+++ trunk/source/include/nterr.h	2006-05-19 19:50:33 UTC (rev 15720)
@@ -37,9 +37,6 @@
 #define STATUS_NOTIFY_ENUM_DIR            NT_STATUS(0x010c)
 #define ERROR_INVALID_DATATYPE		  NT_STATUS(0x070c)
 
-/* Special "invalid" NT status code. */
-#define NT_STATUS_INVALID		  NT_STATUS(0xFFFFFFFF)
-
 /* Win32 Error codes extracted using a loop in smbclient then printing a
    netmon sniff to a file. */
 

Modified: trunk/source/include/smb_macros.h
===================================================================
--- trunk/source/include/smb_macros.h	2006-05-19 18:37:35 UTC (rev 15719)
+++ trunk/source/include/smb_macros.h	2006-05-19 19:50:33 UTC (rev 15720)
@@ -182,7 +182,6 @@
 #define CACHED_ERROR(fsp) cached_error_packet(outbuf,fsp,__LINE__,__FILE__)
 
 #define ERROR_DOS(class,code) error_packet(outbuf,class,code,NT_STATUS_OK,__LINE__,__FILE__)
-#define ERROR_FORCE_DOS(class,code) error_packet(outbuf,class,code,NT_STATUS_INVALID,__LINE__,__FILE__)
 #define ERROR_NT(status) error_packet(outbuf,0,0,status,__LINE__,__FILE__)
 #define ERROR_FORCE_NT(status) error_packet(outbuf,-1,-1,status,__LINE__,__FILE__)
 #define ERROR_BOTH(status,class,code) error_packet(outbuf,class,code,status,__LINE__,__FILE__)

Modified: trunk/source/smbd/error.c
===================================================================
--- trunk/source/smbd/error.c	2006-05-19 18:37:35 UTC (rev 15719)
+++ trunk/source/smbd/error.c	2006-05-19 19:50:33 UTC (rev 15720)
@@ -25,29 +25,11 @@
 
 extern uint32 global_client_caps;
 /* these can be set by some functions to override the error codes */
-static int override_ERR_class;
-static uint32 override_ERR_code;
 static NTSTATUS override_ERR_ntstatus;
 
-/****************************************************************************
- Setting eclass and ecode only and status to NT_STATUS_INVALID forces DOS errors.
- Setting status only and eclass and ecode to -1 forces NT errors.
-****************************************************************************/
- 
-void set_saved_error_triple(int eclass, int ecode, NTSTATUS status)
-{
-	override_ERR_class = eclass;
-	override_ERR_code = ecode;
-	override_ERR_ntstatus = status;
-}
-
 void set_saved_ntstatus(NTSTATUS status)
 {
-	uint8 tmp_eclass;	/* Hmmm. override_ERR_class is not uint8... */
 	override_ERR_ntstatus = status;
-	ntstatus_to_dos(status, &tmp_eclass, &override_ERR_code);
-	override_ERR_class = tmp_eclass;
-	
 }
 
 /****************************************************************************
@@ -103,6 +85,10 @@
 	return error_packet(outbuf,eclass,ecode,ntstatus,line,file);
 }
 
+BOOL use_nt_status(void)
+{
+	return lp_nt_status_support() && (global_client_caps & CAP_STATUS32);
+}
 
 /****************************************************************************
  Create an error packet. Normally called using the ERROR() macro.
@@ -117,18 +103,14 @@
 	BOOL force_nt_status = False;
 	BOOL force_dos_status = False;
 
-	if (override_ERR_class != SMB_SUCCESS || !NT_STATUS_IS_OK(override_ERR_ntstatus)) {
-		eclass = override_ERR_class;
-		ecode = override_ERR_code;
+	if (!NT_STATUS_IS_OK(override_ERR_ntstatus)) {
 		ntstatus = override_ERR_ntstatus;
-		override_ERR_class = SMB_SUCCESS;
-		override_ERR_code = 0;
 		override_ERR_ntstatus = NT_STATUS_OK;
 	}
 
 	if (eclass == (uint8)-1) {
 		force_nt_status = True;
-	} else if (NT_STATUS_IS_INVALID(ntstatus)) {
+	} else if (NT_STATUS_IS_DOS(ntstatus)) {
 		force_dos_status = True;
 	}
 
@@ -146,7 +128,10 @@
 			 nt_errstr(ntstatus)));
 	} else {
 		/* We're returning a DOS error only. */
-		if (eclass == 0 && NT_STATUS_V(ntstatus)) {
+		if (NT_STATUS_IS_DOS(ntstatus)) {
+			eclass = NT_STATUS_DOS_CLASS(ntstatus);
+			ecode = NT_STATUS_DOS_CODE(ntstatus);
+		} else 	if (eclass == 0 && NT_STATUS_V(ntstatus)) {
 			ntstatus_to_dos(ntstatus, &eclass, &ecode);
 		}
 

Modified: trunk/source/smbd/open.c
===================================================================
--- trunk/source/smbd/open.c	2006-05-19 18:37:35 UTC (rev 15719)
+++ trunk/source/smbd/open.c	2006-05-19 19:50:33 UTC (rev 15720)
@@ -1178,8 +1178,11 @@
 	if (!lp_posix_pathnames() && strstr(fname,".+,;=[].")) {
 		/* OS/2 Workplace shell fix may be main code stream in a later
 		 * release. */ 
-		set_saved_error_triple(ERRDOS, ERRcannotopen,
-				       NT_STATUS_OBJECT_NAME_NOT_FOUND);
+		if (use_nt_status()) {
+			set_saved_ntstatus(NT_STATUS_OBJECT_NAME_NOT_FOUND);
+		} else {
+			set_saved_ntstatus(NT_STATUS_DOS(ERRDOS, ERRcannotopen));
+		}
 		DEBUG(5,("open_file_ntcreate: OS/2 long filenames are not "
 			 "supported.\n"));
 		return NULL;
@@ -1873,8 +1876,11 @@
 				DEBUG(5,("open_directory: FILE_CREATE "
 					 "requested for directory %s and it "
 					 "already exists.\n", fname ));
-				set_saved_error_triple(ERRDOS, ERRfilexists,
-						       NT_STATUS_OBJECT_NAME_COLLISION);
+				if (use_nt_status()) {
+					set_saved_ntstatus(NT_STATUS_OBJECT_NAME_COLLISION);
+				} else {
+					set_saved_ntstatus(NT_STATUS_DOS(ERRDOS, ERRfilexists));
+				}
 				return NULL;
 			}
 			create_dir = True;

Modified: trunk/source/smbd/process.c
===================================================================
--- trunk/source/smbd/process.c	2006-05-19 18:37:35 UTC (rev 15719)
+++ trunk/source/smbd/process.c	2006-05-19 19:50:33 UTC (rev 15720)
@@ -958,7 +958,7 @@
 			if (flags & AS_GUEST) 
 				flags &= ~AS_USER;
 			else
-				return(ERROR_FORCE_DOS(ERRSRV,ERRbaduid));
+				return(ERROR_NT(NT_STATUS_DOS(ERRSRV,ERRbaduid)));
 		}
 
 		/* this code is to work around a bug is MS client 3 without

Modified: trunk/source/smbd/reply.c
===================================================================
--- trunk/source/smbd/reply.c	2006-05-19 18:37:35 UTC (rev 15719)
+++ trunk/source/smbd/reply.c	2006-05-19 19:50:33 UTC (rev 15720)
@@ -1367,7 +1367,7 @@
 	if (!map_open_params_to_ntcreate(fname, deny_mode, OPENX_FILE_EXISTS_OPEN,
 			&access_mask, &share_mode, &create_disposition, &create_options)) {
 		END_PROFILE(SMBopen);
-		return ERROR_FORCE_DOS(ERRDOS, ERRbadaccess);
+		return ERROR_NT(NT_STATUS_DOS(ERRDOS, ERRbadaccess));
 	}
 
 	fsp = open_file_ntcreate(conn,fname,&sbuf,
@@ -1490,7 +1490,7 @@
 				&create_disposition,
 				&create_options)) {
 		END_PROFILE(SMBopenX);
-		return ERROR_FORCE_DOS(ERRDOS, ERRbadaccess);
+		return ERROR_NT(NT_STATUS_DOS(ERRDOS, ERRbadaccess));
 	}
 
 	fsp = open_file_ntcreate(conn,fname,&sbuf,
@@ -4988,8 +4988,12 @@
 			END_PROFILE(SMBcopy);
 			return ERROR_DOS(ERRDOS,error);
 		} else {
-			if((errno == ENOENT) && (bad_path1 || bad_path2)) {
-				set_saved_error_triple(ERRDOS, ERRbadpath, NT_STATUS_OK);
+			if((errno == ENOENT) && (bad_path1 || bad_path2) &&
+			   !use_nt_status()) {
+				/* Samba 3.0.22 has ERRDOS/ERRbadpath in the
+				 * DOS error code case
+				 */
+				set_saved_ntstatus(NT_STATUS_DOS(ERRDOS, ERRbadpath));
 			}
 			END_PROFILE(SMBcopy);
 			return(UNIXERROR(ERRDOS,error));
@@ -5222,7 +5226,7 @@
 		/* we don't support these - and CANCEL_LOCK makes w2k
 		   and XP reboot so I don't really want to be
 		   compatible! (tridge) */
-		return ERROR_FORCE_DOS(ERRDOS, ERRnoatomiclocks);
+		return ERROR_NT(NT_STATUS_DOS(ERRDOS, ERRnoatomiclocks));
 	}
 	
 	if (locktype & LOCKING_ANDX_CANCEL_LOCK) {



More information about the samba-cvs mailing list