[SCM] Samba Shared Repository - branch master updated
Stefan Metzmacher
metze at samba.org
Tue Nov 8 09:02:03 MST 2011
The branch, master has been updated
via 95595dd s3:libsmb: fix cli_write_and_x() against OS/2 print shares (bug #5326)
via 0fb4991 s3:libsmb: correctly parse the LANMAN2.1 negprot response from OS/2 (bug #8584)
via 9a3fe3a s3:libsmb: key_len is 8bit only in the NT1 case
from 26d736f s3: Remove two unused variables
http://gitweb.samba.org/?p=samba.git;a=shortlog;h=master
- Log -----------------------------------------------------------------
commit 95595dd93fd04999fcf56ecaab7c29b064d021f8
Author: Stefan Metzmacher <metze at samba.org>
Date: Tue Nov 8 08:25:16 2011 +0100
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 <metze at samba.org>
Autobuild-Date: Tue Nov 8 17:01:36 CET 2011 on sn-devel-104
commit 0fb4991116fe07956ad2355121d7b580486b9a45
Author: Stefan Metzmacher <metze at samba.org>
Date: Tue Nov 8 08:14:31 2011 +0100
s3:libsmb: correctly parse the LANMAN2.1 negprot response from OS/2 (bug #8584)
metze
commit 9a3fe3a3292a780743df9dc4afd00864755d3dfd
Author: Stefan Metzmacher <metze at samba.org>
Date: Tue Nov 8 08:13:27 2011 +0100
s3:libsmb: key_len is 8bit only in the NT1 case
metze
-----------------------------------------------------------------------
Summary of changes:
source3/libsmb/cliconnect.c | 36 +++++++++++++++++++++++++++++++-----
source3/libsmb/clireadwrite.c | 19 +++++++++++++++----
2 files changed, 46 insertions(+), 9 deletions(-)
Changeset truncated at 500 lines:
diff --git a/source3/libsmb/cliconnect.c b/source3/libsmb/cliconnect.c
index af6c51b..8361715 100644
--- a/source3/libsmb/cliconnect.c
+++ b/source3/libsmb/cliconnect.c
@@ -2666,7 +2666,7 @@ static void cli_negprot_done(struct tevent_req *subreq)
bool server_allowed;
const char *server_signing = NULL;
bool ok;
- uint16_t key_len;
+ uint8_t key_len;
if (wct != 0x11) {
tevent_req_nterror(req, NT_STATUS_INVALID_NETWORK_RESPONSE);
@@ -2802,6 +2802,10 @@ static void cli_negprot_done(struct tevent_req *subreq)
}
} else if (protocol >= PROTOCOL_LANMAN1) {
+ DATA_BLOB blob1;
+ ssize_t ret = 0;
+ uint16_t key_len;
+
if (wct != 0x0D) {
tevent_req_nterror(req, NT_STATUS_INVALID_NETWORK_RESPONSE);
return;
@@ -2810,23 +2814,45 @@ static void cli_negprot_done(struct tevent_req *subreq)
server_security_mode = SVAL(vwv + 1, 0);
server_max_xmit = SVAL(vwv + 2, 0);
server_max_mux = SVAL(vwv + 3, 0);
+ server_readbraw = ((SVAL(vwv + 5, 0) & 0x1) != 0);
+ server_writebraw = ((SVAL(vwv + 5, 0) & 0x2) != 0);
server_session_key = IVAL(vwv + 6, 0);
server_time_zone = SVALS(vwv + 10, 0);
server_time_zone *= 60;
/* this time is converted to GMT by make_unix_date */
server_system_time = make_unix_date(
(char *)(vwv + 8), server_time_zone);
- server_readbraw = ((SVAL(vwv + 5, 0) & 0x1) != 0);
- server_writebraw = ((SVAL(vwv + 5, 0) & 0x2) != 0);
+ key_len = SVAL(vwv + 11, 0);
- if (num_bytes != 0 && num_bytes != 8) {
+ if (num_bytes < key_len) {
tevent_req_nterror(req, NT_STATUS_INVALID_NETWORK_RESPONSE);
return;
}
- if (num_bytes == 8) {
+ if (key_len != 0 && key_len != 8) {
+ tevent_req_nterror(req, NT_STATUS_INVALID_NETWORK_RESPONSE);
+ return;
+ }
+
+ if (key_len == 8) {
memcpy(server_challenge, bytes, 8);
}
+
+ blob1 = data_blob_const(bytes+key_len, num_bytes-key_len);
+ if (blob1.length > 0) {
+ ret = pull_string_talloc(state,
+ (char *)inbuf,
+ SVAL(inbuf, smb_flg2),
+ &server_workgroup,
+ blob1.data,
+ blob1.length,
+ STR_TERMINATE|
+ STR_ASCII);
+ if (ret == -1) {
+ tevent_req_oom(req);
+ return;
+ }
+ }
} else {
/* the old core protocol */
server_time_zone = get_time_zone(time(NULL));
diff --git a/source3/libsmb/clireadwrite.c b/source3/libsmb/clireadwrite.c
index e8c9017..79624ec 100644
--- a/source3/libsmb/clireadwrite.c
+++ b/source3/libsmb/clireadwrite.c
@@ -850,7 +850,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;
@@ -862,8 +862,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)
@@ -933,7 +933,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);
}
--
Samba Shared Repository
More information about the samba-cvs
mailing list