[PATCH] Fix for bug #9706 - Parameter is incorrect on Android
Jeremy Allison
jra at samba.org
Mon Mar 11 15:54:27 MDT 2013
On Mon, Mar 11, 2013 at 01:55:12PM -0700, Jeremy Allison wrote:
> We need to tweak the 'large read' detection code some more...
Ok, here's a version with the correct MS-doc reference
in the comment, and also a better order of tests in the
second part.
Please review (and test :-) and push if you're happy.
Jeremy.
-------------- next part --------------
From 468ee6e751345639dbc386a51eb1720c9fdec0ca Mon Sep 17 00:00:00 2001
From: Jeremy Allison <jra at samba.org>
Date: Mon, 11 Mar 2013 12:27:59 -0700
Subject: [PATCH 1/2] Part 1 of fix for 9706 - Parameter is incorrect on
Android.
Match Windows in ignoring a upper_read size of 0xFFFF
explicitly.
Signed-off-by: Jeremy Allison <jra at samba.org>
---
source3/smbd/reply.c | 11 +++++++++--
1 file changed, 9 insertions(+), 2 deletions(-)
diff --git a/source3/smbd/reply.c b/source3/smbd/reply.c
index 64c4fdb..1566045 100644
--- a/source3/smbd/reply.c
+++ b/source3/smbd/reply.c
@@ -3855,12 +3855,19 @@ nosendfile_read:
we supported this.
****************************************************************************/
-static bool server_will_accept_large_read(void)
+static bool server_will_accept_large_read(size_t upper_size)
{
/* Samba client ? No problem. */
if (get_remote_arch() == RA_SAMBA) {
return true;
}
+ /*
+ * Windows explicitly ignores upper size of 0xFFFF.
+ * See [MS-SMB].pdf <26> Section 2.2.4.2.1:
+ */
+ if (upper_size == 0xFFFF) {
+ return false;
+ }
/* Need UNIX extensions. */
if (!lp_unix_extensions()) {
return false;
@@ -3914,7 +3921,7 @@ void reply_read_and_X(struct smb_request *req)
}
upper_size = SVAL(req->vwv+7, 0);
- if ((upper_size != 0) && server_will_accept_large_read()) {
+ if ((upper_size != 0) && server_will_accept_large_read(upper_size)) {
/*
* This is Samba only behavior (up to Samba 3.6)!
*
--
1.8.1.3
From 655da481098b4296fcaad4d79e3e59b25493383c Mon Sep 17 00:00:00 2001
From: Jeremy Allison <jra at samba.org>
Date: Mon, 11 Mar 2013 12:29:40 -0700
Subject: [PATCH 2/2] Part 2 of fix for 9706 - Parameter is incorrect on
Android.
Client must have told us it will do CAP_LARGE_READX,
and we must have told it we will do UNIX extensions.
Signed-off-by: Jeremy Allison <jra at samba.org>
---
source3/smbd/reply.c | 17 ++++++++++++++---
1 file changed, 14 insertions(+), 3 deletions(-)
diff --git a/source3/smbd/reply.c b/source3/smbd/reply.c
index 1566045..50a743d 100644
--- a/source3/smbd/reply.c
+++ b/source3/smbd/reply.c
@@ -3868,11 +3868,22 @@ static bool server_will_accept_large_read(size_t upper_size)
if (upper_size == 0xFFFF) {
return false;
}
- /* Need UNIX extensions. */
- if (!lp_unix_extensions()) {
+ /*
+ * Client needs to have told us it can accept
+ * a large readX reply in sessionsetup.
+ */
+ if (!(global_client_caps & CAP_LARGE_READX)) {
return false;
}
- return true;
+ /*
+ * Yes if the client told us it can do CAP_LARGE_READX
+ * and we told the client we do UNIX extensions.
+ */
+ if (lp_unix_extensions()) {
+ return true;
+ }
+ /* Otherwise ignore the upper size. */
+ return false;
}
/****************************************************************************
--
1.8.1.3
More information about the samba-technical
mailing list