From 47f704a9e1c6fc74cd5302f5198f4b95edec89c9 Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Tue, 8 Nov 2011 08:25:16 +0100 Subject: [PATCH 1/2] s3:libsmb: fix cli_write_and_x() against OS/2 print shares (bug #5326) Print shares doesn't support CAP_LARGE_WRITEX, while it's negotiated by the file server part. metze Autobuild-User: Stefan Metzmacher Autobuild-Date: Tue Nov 8 17:01:36 CET 2011 on sn-devel-104 (cherry picked from commit 95595dd93fd04999fcf56ecaab7c29b064d021f8) --- source3/libsmb/clireadwrite.c | 19 +++++++++++++++---- 1 files changed, 15 insertions(+), 4 deletions(-) diff --git a/source3/libsmb/clireadwrite.c b/source3/libsmb/clireadwrite.c index b0f988c..5a70f65 100644 --- a/source3/libsmb/clireadwrite.c +++ b/source3/libsmb/clireadwrite.c @@ -807,7 +807,7 @@ struct tevent_req *cli_write_andx_create(TALLOC_CTX *mem_ctx, return NULL; } - size = MIN(size, max_write); + state->size = MIN(size, max_write); vwv = state->vwv; @@ -819,8 +819,8 @@ struct tevent_req *cli_write_andx_create(TALLOC_CTX *mem_ctx, SIVAL(vwv+5, 0, 0); SSVAL(vwv+7, 0, mode); SSVAL(vwv+8, 0, 0); - SSVAL(vwv+9, 0, (size>>16)); - SSVAL(vwv+10, 0, size); + SSVAL(vwv+9, 0, (state->size>>16)); + SSVAL(vwv+10, 0, state->size); SSVAL(vwv+11, 0, cli_smb_wct_ofs(reqs_before, num_reqs_before) @@ -890,7 +890,18 @@ static void cli_write_andx_done(struct tevent_req *subreq) return; } state->written = SVAL(vwv+2, 0); - state->written |= SVAL(vwv+4, 0)<<16; + if (state->size > UINT16_MAX) { + /* + * It is important that we only set the + * high bits only if we asked for a large write. + * + * OS/2 print shares get this wrong and may send + * invalid values. + * + * See bug #5326. + */ + state->written |= SVAL(vwv+4, 0)<<16; + } tevent_req_done(req); } -- 1.7.4.1 From 7f56f3e77c00d8312d9cb72cae7a6fe31fa75d92 Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Fri, 11 Nov 2011 02:10:00 +0100 Subject: [PATCH 2/2] s3:libsmb: consistently use state->size in cli_write_andx_create() (bug #5326) Otherwise we may get unexpected results. This is a fix that was missing in commit 95595dd93fd04999fcf56ecaab7c29b064d021f8 (s3:libsmb: fix cli_write_and_x() against OS/2 print shares (bug #5326)) metze Autobuild-User: Stefan Metzmacher Autobuild-Date: Wed Nov 9 10:13:32 CET 2011 on sn-devel-104 (cherry picked from commit 4b31c4273c45faa639445614061f3da548eb8505) --- source3/libsmb/clireadwrite.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/source3/libsmb/clireadwrite.c b/source3/libsmb/clireadwrite.c index 5a70f65..215e1d3 100644 --- a/source3/libsmb/clireadwrite.c +++ b/source3/libsmb/clireadwrite.c @@ -837,7 +837,7 @@ struct tevent_req *cli_write_andx_create(TALLOC_CTX *mem_ctx, state->iov[0].iov_base = (void *)&state->pad; state->iov[0].iov_len = 1; state->iov[1].iov_base = CONST_DISCARD(void *, buf); - state->iov[1].iov_len = size; + state->iov[1].iov_len = state->size; subreq = cli_smb_req_create(state, ev, cli, SMBwriteX, 0, wct, vwv, 2, state->iov); -- 1.7.4.1