svn commit: samba r22129 - in branches: SAMBA_3_0/source/smbd SAMBA_3_0_25/source/smbd

jra at samba.org jra at samba.org
Sun Apr 8 04:54:45 GMT 2007


Author: jra
Date: 2007-04-08 04:54:44 +0000 (Sun, 08 Apr 2007)
New Revision: 22129

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

Log:
Fix the nttrans create extended response for pipes
and files (tested with Win32 code). Bug #4404 should
now be dead :-).
Jeremy.

Modified:
   branches/SAMBA_3_0/source/smbd/nttrans.c
   branches/SAMBA_3_0_25/source/smbd/nttrans.c


Changeset:
Modified: branches/SAMBA_3_0/source/smbd/nttrans.c
===================================================================
--- branches/SAMBA_3_0/source/smbd/nttrans.c	2007-04-08 00:47:49 UTC (rev 22128)
+++ branches/SAMBA_3_0/source/smbd/nttrans.c	2007-04-08 04:54:44 UTC (rev 22129)
@@ -942,7 +942,6 @@
 	p += 4;
 	SCVAL(p,0,fsp->is_directory ? 1 : 0);
 
-	/* Fixme - we must do the same for NTTransCreate and pipe open. */
 	if (flags & EXTENDED_RESPONSE_REQUIRED) {
 		uint32 perms = 0;
 		p += 26;
@@ -976,6 +975,8 @@
 	int pnum = -1;
 	char *p = NULL;
 	NTSTATUS status;
+	size_t param_len;
+	uint32 flags;
 
 	/*
 	 * Ensure minimum number of parameters sent.
@@ -986,6 +987,8 @@
 		return ERROR_DOS(ERRDOS,ERRnoaccess);
 	}
 
+	flags = IVAL(params,0);
+
 	srvstr_get_path(inbuf, fname, params+53, sizeof(fname), parameter_count-53, STR_TERMINATE, &status);
 	if (!NT_STATUS_IS_OK(status)) {
 		return ERROR_NT(status);
@@ -996,7 +999,13 @@
 	}
 	
 	/* Realloc the size of parameters and data we will return */
-	params = nttrans_realloc(ppparams, 69);
+	if (flags & EXTENDED_RESPONSE_REQUIRED) {
+		/* Extended response is 32 more byyes. */
+		param_len = 101;
+	} else {
+		param_len = 69;
+	}
+	params = nttrans_realloc(ppparams, param_len);
 	if(params == NULL) {
 		return ERROR_DOS(ERRDOS,ERRnomem);
 	}
@@ -1017,11 +1026,23 @@
 	SSVAL(p,0,FILE_TYPE_MESSAGE_MODE_PIPE);
 	/* Device state. */
 	SSVAL(p,2, 0x5FF); /* ? */
+	p += 4;
 	
+	if (flags & EXTENDED_RESPONSE_REQUIRED) {
+		p += 26;
+		SIVAL(p,0,FILE_GENERIC_ALL);
+		/* 
+		 * For pipes W2K3 seems to return
+ 		 * 0x12019B next.
+ 		 * This is ((FILE_GENERIC_READ|FILE_GENERIC_WRITE) & ~FILE_APPEND_DATA)
+ 		 */
+		SIVAL(p,4,(FILE_GENERIC_READ|FILE_GENERIC_WRITE)&~FILE_APPEND_DATA);
+	}
+
 	DEBUG(5,("do_nt_transact_create_pipe: open name = %s\n", fname));
 	
 	/* Send the required number of replies */
-	send_nt_replies(outbuf, bufsize, NT_STATUS_OK, params, 69, *ppdata, 0);
+	send_nt_replies(outbuf, bufsize, NT_STATUS_OK, params, param_len, *ppdata, 0);
 	
 	return -1;
 }
@@ -1166,6 +1187,7 @@
 	TALLOC_CTX *ctx = NULL;
 	char *pdata = NULL;
 	NTSTATUS status;
+	size_t param_len;
 
 	DEBUG(5,("call_nt_transact_create\n"));
 
@@ -1536,7 +1558,13 @@
 	}
 
 	/* Realloc the size of parameters and data we will return */
-	params = nttrans_realloc(ppparams, 69);
+	if (flags & EXTENDED_RESPONSE_REQUIRED) {
+		/* Extended response is 32 more byyes. */
+		param_len = 101;
+	} else {
+		param_len = 69;
+	}
+	params = nttrans_realloc(ppparams, param_len);
 	if(params == NULL) {
 		return ERROR_DOS(ERRDOS,ERRnomem);
 	}
@@ -1595,10 +1623,21 @@
 	p += 4;
 	SCVAL(p,0,fsp->is_directory ? 1 : 0);
 
+	if (flags & EXTENDED_RESPONSE_REQUIRED) {
+		uint32 perms = 0;
+		p += 26;
+		if (fsp->is_directory || can_write_to_file(conn, fname, &sbuf)) {
+			perms = FILE_GENERIC_ALL;
+		} else {
+			perms = FILE_GENERIC_READ|FILE_EXECUTE;
+		}
+		SIVAL(p,0,perms);
+	}
+
 	DEBUG(5,("call_nt_transact_create: open name = %s\n", fname));
 
 	/* Send the required number of replies */
-	send_nt_replies(outbuf, bufsize, NT_STATUS_OK, params, 69, *ppdata, 0);
+	send_nt_replies(outbuf, bufsize, NT_STATUS_OK, params, param_len, *ppdata, 0);
 
 	return -1;
 }

Modified: branches/SAMBA_3_0_25/source/smbd/nttrans.c
===================================================================
--- branches/SAMBA_3_0_25/source/smbd/nttrans.c	2007-04-08 00:47:49 UTC (rev 22128)
+++ branches/SAMBA_3_0_25/source/smbd/nttrans.c	2007-04-08 04:54:44 UTC (rev 22129)
@@ -942,7 +942,6 @@
 	p += 4;
 	SCVAL(p,0,fsp->is_directory ? 1 : 0);
 
-	/* Fixme - we must do the same for NTTransCreate and pipe open. */
 	if (flags & EXTENDED_RESPONSE_REQUIRED) {
 		uint32 perms = 0;
 		p += 26;
@@ -976,6 +975,8 @@
 	int pnum = -1;
 	char *p = NULL;
 	NTSTATUS status;
+	size_t param_len;
+	uint32 flags;
 
 	/*
 	 * Ensure minimum number of parameters sent.
@@ -986,6 +987,8 @@
 		return ERROR_DOS(ERRDOS,ERRnoaccess);
 	}
 
+	flags = IVAL(params,0);
+
 	srvstr_get_path(inbuf, fname, params+53, sizeof(fname), parameter_count-53, STR_TERMINATE, &status);
 	if (!NT_STATUS_IS_OK(status)) {
 		return ERROR_NT(status);
@@ -996,7 +999,13 @@
 	}
 	
 	/* Realloc the size of parameters and data we will return */
-	params = nttrans_realloc(ppparams, 69);
+	if (flags & EXTENDED_RESPONSE_REQUIRED) {
+		/* Extended response is 32 more byyes. */
+		param_len = 101;
+	} else {
+		param_len = 69;
+	}
+	params = nttrans_realloc(ppparams, param_len);
 	if(params == NULL) {
 		return ERROR_DOS(ERRDOS,ERRnomem);
 	}
@@ -1017,11 +1026,23 @@
 	SSVAL(p,0,FILE_TYPE_MESSAGE_MODE_PIPE);
 	/* Device state. */
 	SSVAL(p,2, 0x5FF); /* ? */
+	p += 4;
 	
+	if (flags & EXTENDED_RESPONSE_REQUIRED) {
+		p += 26;
+		SIVAL(p,0,FILE_GENERIC_ALL);
+		/* 
+		 * For pipes W2K3 seems to return
+ 		 * 0x12019B next.
+ 		 * This is ((FILE_GENERIC_READ|FILE_GENERIC_WRITE) & ~FILE_APPEND_DATA)
+ 		 */
+		SIVAL(p,4,(FILE_GENERIC_READ|FILE_GENERIC_WRITE)&~FILE_APPEND_DATA);
+	}
+
 	DEBUG(5,("do_nt_transact_create_pipe: open name = %s\n", fname));
 	
 	/* Send the required number of replies */
-	send_nt_replies(outbuf, bufsize, NT_STATUS_OK, params, 69, *ppdata, 0);
+	send_nt_replies(outbuf, bufsize, NT_STATUS_OK, params, param_len, *ppdata, 0);
 	
 	return -1;
 }
@@ -1166,6 +1187,7 @@
 	TALLOC_CTX *ctx = NULL;
 	char *pdata = NULL;
 	NTSTATUS status;
+	size_t param_len;
 
 	DEBUG(5,("call_nt_transact_create\n"));
 
@@ -1536,7 +1558,13 @@
 	}
 
 	/* Realloc the size of parameters and data we will return */
-	params = nttrans_realloc(ppparams, 69);
+	if (flags & EXTENDED_RESPONSE_REQUIRED) {
+		/* Extended response is 32 more byyes. */
+		param_len = 101;
+	} else {
+		param_len = 69;
+	}
+	params = nttrans_realloc(ppparams, param_len);
 	if(params == NULL) {
 		return ERROR_DOS(ERRDOS,ERRnomem);
 	}
@@ -1595,10 +1623,21 @@
 	p += 4;
 	SCVAL(p,0,fsp->is_directory ? 1 : 0);
 
+	if (flags & EXTENDED_RESPONSE_REQUIRED) {
+		uint32 perms = 0;
+		p += 26;
+		if (fsp->is_directory || can_write_to_file(conn, fname, &sbuf)) {
+			perms = FILE_GENERIC_ALL;
+		} else {
+			perms = FILE_GENERIC_READ|FILE_EXECUTE;
+		}
+		SIVAL(p,0,perms);
+	}
+
 	DEBUG(5,("call_nt_transact_create: open name = %s\n", fname));
 
 	/* Send the required number of replies */
-	send_nt_replies(outbuf, bufsize, NT_STATUS_OK, params, 69, *ppdata, 0);
+	send_nt_replies(outbuf, bufsize, NT_STATUS_OK, params, param_len, *ppdata, 0);
 
 	return -1;
 }



More information about the samba-cvs mailing list