svn commit: samba r4187 - in trunk/source: include libsmb smbd

jra at samba.org jra at samba.org
Tue Dec 14 00:25:26 GMT 2004


Author: jra
Date: 2004-12-14 00:25:23 +0000 (Tue, 14 Dec 2004)
New Revision: 4187

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

Log:
Fix client  & server to allow 127k READX calls.
Jeremy.

Modified:
   trunk/source/include/client.h
   trunk/source/libsmb/cliconnect.c
   trunk/source/libsmb/clireadwrite.c
   trunk/source/smbd/process.c
   trunk/source/smbd/reply.c


Changeset:
Modified: trunk/source/include/client.h
===================================================================
--- trunk/source/include/client.h	2004-12-14 00:25:11 UTC (rev 4186)
+++ trunk/source/include/client.h	2004-12-14 00:25:23 UTC (rev 4187)
@@ -27,8 +27,8 @@
    overlap on the wire. This size gives us a nice read/write size, which
    will be a multiple of the page size on almost any system */
 #define CLI_BUFFER_SIZE (0xFFFF)
+#define CLI_MAX_LARGE_READX_SIZE (127*1024)
 
-
 /*
  * These definitions depend on smb.h
  */

Modified: trunk/source/libsmb/cliconnect.c
===================================================================
--- trunk/source/libsmb/cliconnect.c	2004-12-14 00:25:11 UTC (rev 4186)
+++ trunk/source/libsmb/cliconnect.c	2004-12-14 00:25:23 UTC (rev 4187)
@@ -151,12 +151,7 @@
 	if (cli->use_level_II_oplocks)
 		capabilities |= CAP_LEVEL_II_OPLOCKS;
 
-	if (cli->capabilities & CAP_UNICODE)
-		capabilities |= CAP_UNICODE;
-
-	if (cli->capabilities & CAP_LARGE_FILES)
-		capabilities |= CAP_LARGE_FILES;
-
+	capabilities |= (cli->capabilities & (CAP_UNICODE|CAP_LARGE_FILES|CAP_LARGE_READX|CAP_LARGE_WRITEX));
 	return capabilities;
 }
 
@@ -1134,6 +1129,14 @@
 			cli->sign_info.negotiated_smb_signing = True;
 		}
 
+		if (cli->capabilities & (CAP_LARGE_READX|CAP_LARGE_WRITEX)) {
+			SAFE_FREE(cli->outbuf);
+			SAFE_FREE(cli->inbuf);
+			cli->outbuf = (char *)SMB_MALLOC(CLI_MAX_LARGE_READX_SIZE+SAFETY_MARGIN);
+			cli->inbuf = (char *)SMB_MALLOC(CLI_MAX_LARGE_READX_SIZE+SAFETY_MARGIN);
+			cli->bufsize = CLI_MAX_LARGE_READX_SIZE;
+		}
+
 	} else if (cli->protocol >= PROTOCOL_LANMAN1) {
 		cli->use_spnego = False;
 		cli->sec_mode = SVAL(cli->inbuf,smb_vwv1);

Modified: trunk/source/libsmb/clireadwrite.c
===================================================================
--- trunk/source/libsmb/clireadwrite.c	2004-12-14 00:25:11 UTC (rev 4186)
+++ trunk/source/libsmb/clireadwrite.c	2004-12-14 00:25:23 UTC (rev 4187)
@@ -48,6 +48,7 @@
 	SIVAL(cli->outbuf,smb_vwv3,offset);
 	SSVAL(cli->outbuf,smb_vwv5,size);
 	SSVAL(cli->outbuf,smb_vwv6,size);
+	SSVAL(cli->outbuf,smb_vwv7,((size >> 16) & 1));
 	SSVAL(cli->outbuf,smb_mid,cli->mid + i);
 
 	if (bigoffset)
@@ -75,7 +76,11 @@
 	 * rounded down to a multiple of 1024.
 	 */
 
-	readsize = (cli->max_xmit - (smb_size+32)) & ~1023;
+	if (cli->capabilities & CAP_LARGE_READX) {
+		readsize = CLI_MAX_LARGE_READX_SIZE;
+	} else {
+		readsize = (cli->max_xmit - (smb_size+32)) & ~1023;
+	}
 
 	while (total < size) {
 		readsize = MIN(readsize, size-total);
@@ -117,6 +122,7 @@
 		}
 
 		size2 = SVAL(cli->inbuf, smb_vwv5);
+		size2 |= (SVAL(cli->inbuf, smb_vwv7) & 1);
 
 		if (size2 > readsize) {
 			DEBUG(5,("server returned more than we wanted!\n"));

Modified: trunk/source/smbd/process.c
===================================================================
--- trunk/source/smbd/process.c	2004-12-14 00:25:11 UTC (rev 4186)
+++ trunk/source/smbd/process.c	2004-12-14 00:25:23 UTC (rev 4187)
@@ -1177,8 +1177,7 @@
 	int outsize2;
 	char inbuf_saved[smb_wct];
 	char outbuf_saved[smb_wct];
-	int wct = CVAL(outbuf,smb_wct);
-	int outsize = smb_size + 2*wct + SVAL(outbuf,smb_vwv0+2*wct);
+	int outsize = smb_len(outbuf);
 
 	/* maybe its not chained */
 	if (smb_com2 == 0xFF) {

Modified: trunk/source/smbd/reply.c
===================================================================
--- trunk/source/smbd/reply.c	2004-12-14 00:25:11 UTC (rev 4186)
+++ trunk/source/smbd/reply.c	2004-12-14 00:25:23 UTC (rev 4187)
@@ -2148,6 +2148,7 @@
 		SSVAL(outbuf,smb_vwv2,0xFFFF); /* Remaining - must be -1. */
 		SSVAL(outbuf,smb_vwv5,smb_maxcnt);
 		SSVAL(outbuf,smb_vwv6,smb_offset(data,outbuf));
+		SSVAL(outbuf,smb_vwv7,((smb_maxcnt >> 16) & 1));
 		SSVAL(smb_buf(outbuf),-2,smb_maxcnt);
 		SCVAL(outbuf,smb_vwv0,0xFF);
 		set_message(outbuf,12,smb_maxcnt,False);
@@ -2196,9 +2197,11 @@
 		return(UNIXERROR(ERRDOS,ERRnoaccess));
 	}
 
+	set_message(outbuf,12,nread,False);
 	SSVAL(outbuf,smb_vwv2,0xFFFF); /* Remaining - must be -1. */
 	SSVAL(outbuf,smb_vwv5,nread);
 	SSVAL(outbuf,smb_vwv6,smb_offset(data,outbuf));
+	SSVAL(outbuf,smb_vwv7,((nread >> 16) & 1));
 	SSVAL(smb_buf(outbuf),-2,nread);
   
 	DEBUG( 3, ( "send_file_readX fnum=%d max=%d nread=%d\n",



More information about the samba-cvs mailing list