svn commit: samba r15161 - in trunk/source: include libsmb

jra at samba.org jra at samba.org
Sat Apr 22 02:32:36 GMT 2006


Author: jra
Date: 2006-04-22 02:32:35 +0000 (Sat, 22 Apr 2006)
New Revision: 15161

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

Log:
Patch for bug #3668. Windows has a bug with LARGE_READX
where if you ask for exactly 64k bytes it returns 0.
Jeremy.

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


Changeset:
Modified: trunk/source/include/client.h
===================================================================
--- trunk/source/include/client.h	2006-04-22 01:59:23 UTC (rev 15160)
+++ trunk/source/include/client.h	2006-04-22 02:32:35 UTC (rev 15161)
@@ -27,7 +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)
+#define CLI_SAMBA_MAX_LARGE_READX_SIZE (127*1024) /* Works for Samba servers */
+#define CLI_WINDOWS_MAX_LARGE_READX_SIZE ((64*1024)-2) /* Windows servers are broken.... */
 
 /*
  * These definitions depend on smb.h
@@ -143,6 +144,7 @@
 	unsigned int bufsize;
 	int initialised;
 	int win95;
+	BOOL is_samba;
 	uint32 capabilities;
 	BOOL dfsroot;
 

Modified: trunk/source/libsmb/cliconnect.c
===================================================================
--- trunk/source/libsmb/cliconnect.c	2006-04-22 01:59:23 UTC (rev 15160)
+++ trunk/source/libsmb/cliconnect.c	2006-04-22 02:32:35 UTC (rev 15161)
@@ -199,6 +199,10 @@
 	p += clistr_pull(cli, cli->server_type, p, sizeof(fstring), -1, STR_TERMINATE);
 	p += clistr_pull(cli, cli->server_domain, p, sizeof(fstring), -1, STR_TERMINATE);
 
+	if (strstr(cli->server_type, "Samba")) {
+		cli->is_samba = True;
+	}
+
 	fstrcpy(cli->user_name, "");
 
 	return True;
@@ -263,6 +267,10 @@
 	p += clistr_pull(cli, cli->server_domain, p, sizeof(fstring), -1, STR_TERMINATE);
 	fstrcpy(cli->user_name, user);
 
+	if (strstr(cli->server_type, "Samba")) {
+		cli->is_samba = True;
+	}
+
 	return True;
 }
 
@@ -408,6 +416,10 @@
 	p += clistr_pull(cli, cli->server_type, p, sizeof(fstring), -1, STR_TERMINATE);
 	p += clistr_pull(cli, cli->server_domain, p, sizeof(fstring), -1, STR_TERMINATE);
 
+	if (strstr(cli->server_type, "Samba")) {
+		cli->is_samba = True;
+	}
+
 	fstrcpy(cli->user_name, user);
 
 	if (session_key.data) {
@@ -873,6 +885,10 @@
 		}
 	}
 
+	if (strstr(cli->server_type, "Samba")) {
+		cli->is_samba = True;
+	}
+
 	return True;
 
 }
@@ -1159,9 +1175,9 @@
 		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;
+			cli->outbuf = (char *)SMB_MALLOC(CLI_SAMBA_MAX_LARGE_READX_SIZE+SAFETY_MARGIN);
+			cli->inbuf = (char *)SMB_MALLOC(CLI_SAMBA_MAX_LARGE_READX_SIZE+SAFETY_MARGIN);
+			cli->bufsize = CLI_SAMBA_MAX_LARGE_READX_SIZE;
 		}
 
 	} else if (cli->protocol >= PROTOCOL_LANMAN1) {

Modified: trunk/source/libsmb/clireadwrite.c
===================================================================
--- trunk/source/libsmb/clireadwrite.c	2006-04-22 01:59:23 UTC (rev 15160)
+++ trunk/source/libsmb/clireadwrite.c	2006-04-22 02:32:35 UTC (rev 15161)
@@ -76,7 +76,11 @@
 	 */
 
 	if (cli->capabilities & CAP_LARGE_READX) {
-		readsize = CLI_MAX_LARGE_READX_SIZE;
+		if (cli->is_samba) {
+			readsize = CLI_SAMBA_MAX_LARGE_READX_SIZE;
+		} else {
+			readsize = CLI_WINDOWS_MAX_LARGE_READX_SIZE;
+		}
 	} else {
 		readsize = (cli->max_xmit - (smb_size+32)) & ~1023;
 	}



More information about the samba-cvs mailing list