summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libcli/smb/smbXcli_base.c20
-rw-r--r--libcli/smb/smbXcli_base.h3
-rw-r--r--source3/libsmb/cliconnect.c4
-rw-r--r--source3/torture/torture.c2
-rw-r--r--source4/libcli/raw/libcliraw.h1
-rw-r--r--source4/libcli/raw/rawnegotiate.c3
-rw-r--r--source4/libcli/smb2/connect.c6
-rw-r--r--source4/param/loadparm.c2
8 files changed, 21 insertions, 20 deletions
diff --git a/libcli/smb/smbXcli_base.c b/libcli/smb/smbXcli_base.c
index a7b24f01497..70285e63173 100644
--- a/libcli/smb/smbXcli_base.c
+++ b/libcli/smb/smbXcli_base.c
@@ -4092,7 +4092,8 @@ struct tevent_req *smbXcli_negprot_send(TALLOC_CTX *mem_ctx,
struct smbXcli_conn *conn,
uint32_t timeout_msec,
enum protocol_types min_protocol,
- enum protocol_types max_protocol)
+ enum protocol_types max_protocol,
+ uint16_t max_credits)
{
struct tevent_req *req, *subreq;
struct smbXcli_negprot_state *state;
@@ -4125,6 +4126,10 @@ struct tevent_req *smbXcli_negprot_send(TALLOC_CTX *mem_ctx,
conn->max_protocol = max_protocol;
conn->protocol = PROTOCOL_NONE;
+ if (max_protocol >= PROTOCOL_SMB2_02) {
+ conn->smb2.max_credits = max_credits;
+ }
+
if ((min_protocol < PROTOCOL_SMB2_02) &&
(max_protocol < PROTOCOL_SMB2_02)) {
/*
@@ -4147,16 +4152,6 @@ struct tevent_req *smbXcli_negprot_send(TALLOC_CTX *mem_ctx,
*/
conn->dispatch_incoming = smb2cli_conn_dispatch_incoming;
- /*
- * As we're starting with an SMB2 negprot, emulate Windows
- * and ask for 31 credits in the initial SMB2 negprot.
- * If we don't and leave requested credits at
- * zero, MacOSX servers return zero credits on
- * the negprot reply and we fail to connect.
- */
- smb2cli_conn_set_max_credits(conn,
- WINDOWS_CLIENT_PURE_SMB2_NEGPROT_INITIAL_CREDIT_ASK);
-
subreq = smbXcli_negprot_smb2_subreq(state);
if (tevent_req_nomem(subreq, req)) {
return tevent_req_post(req, ev);
@@ -5137,7 +5132,8 @@ NTSTATUS smbXcli_negprot(struct smbXcli_conn *conn,
goto fail;
}
req = smbXcli_negprot_send(frame, ev, conn, timeout_msec,
- min_protocol, max_protocol);
+ min_protocol, max_protocol,
+ WINDOWS_CLIENT_PURE_SMB2_NEGPROT_INITIAL_CREDIT_ASK);
if (req == NULL) {
goto fail;
}
diff --git a/libcli/smb/smbXcli_base.h b/libcli/smb/smbXcli_base.h
index 702eedf5dba..6041ae53d07 100644
--- a/libcli/smb/smbXcli_base.h
+++ b/libcli/smb/smbXcli_base.h
@@ -436,7 +436,8 @@ struct tevent_req *smbXcli_negprot_send(TALLOC_CTX *mem_ctx,
struct smbXcli_conn *conn,
uint32_t timeout_msec,
enum protocol_types min_protocol,
- enum protocol_types max_protocol);
+ enum protocol_types max_protocol,
+ uint16_t max_credits);
NTSTATUS smbXcli_negprot_recv(struct tevent_req *req);
NTSTATUS smbXcli_negprot(struct smbXcli_conn *conn,
uint32_t timeout_msec,
diff --git a/source3/libsmb/cliconnect.c b/source3/libsmb/cliconnect.c
index a9451fbd571..029c3d4760e 100644
--- a/source3/libsmb/cliconnect.c
+++ b/source3/libsmb/cliconnect.c
@@ -39,6 +39,7 @@
#include "../libcli/smb/smbXcli_base.h"
#include "../libcli/smb/smb_seal.h"
#include "lib/param/param.h"
+#include "../libcli/smb/smb2_negotiate_context.h"
#define STAR_SMBSERVER "*SMBSERVER"
@@ -2754,7 +2755,8 @@ static void cli_start_connection_connected(struct tevent_req *subreq)
subreq = smbXcli_negprot_send(state, state->ev, state->cli->conn,
state->cli->timeout,
state->min_protocol,
- state->max_protocol);
+ state->max_protocol,
+ WINDOWS_CLIENT_PURE_SMB2_NEGPROT_INITIAL_CREDIT_ASK);
if (tevent_req_nomem(subreq, req)) {
return;
}
diff --git a/source3/torture/torture.c b/source3/torture/torture.c
index 2c10ae87e8e..dbbd072c679 100644
--- a/source3/torture/torture.c
+++ b/source3/torture/torture.c
@@ -2990,7 +2990,7 @@ static bool run_negprot_nowait(int dummy)
struct tevent_req *req;
req = smbXcli_negprot_send(ev, ev, cli->conn, cli->timeout,
- PROTOCOL_CORE, PROTOCOL_NT1);
+ PROTOCOL_CORE, PROTOCOL_NT1, 0);
if (req == NULL) {
TALLOC_FREE(ev);
return false;
diff --git a/source4/libcli/raw/libcliraw.h b/source4/libcli/raw/libcliraw.h
index 8220cd7c563..96dfcd4c765 100644
--- a/source4/libcli/raw/libcliraw.h
+++ b/source4/libcli/raw/libcliraw.h
@@ -103,6 +103,7 @@ struct smbcli_options {
enum smb_signing_setting signing;
uint32_t smb2_capabilities;
struct GUID client_guid;
+ uint64_t max_credits;
};
/* this is the context for the client transport layer */
diff --git a/source4/libcli/raw/rawnegotiate.c b/source4/libcli/raw/rawnegotiate.c
index 4b42c2662a0..f6a189ff8d7 100644
--- a/source4/libcli/raw/rawnegotiate.c
+++ b/source4/libcli/raw/rawnegotiate.c
@@ -60,7 +60,8 @@ struct tevent_req *smb_raw_negotiate_send(TALLOC_CTX *mem_ctx,
transport->conn,
timeout_msec,
minprotocol,
- maxprotocol);
+ maxprotocol,
+ transport->options.max_credits);
if (tevent_req_nomem(subreq, req)) {
return tevent_req_post(req, ev);
}
diff --git a/source4/libcli/smb2/connect.c b/source4/libcli/smb2/connect.c
index 1a6ae34d2cd..8ff56c9ca8f 100644
--- a/source4/libcli/smb2/connect.c
+++ b/source4/libcli/smb2/connect.c
@@ -155,7 +155,8 @@ static void smb2_connect_socket_done(struct composite_context *creq)
subreq = smbXcli_negprot_send(state, state->ev,
state->transport->conn, timeout_msec,
min_protocol,
- state->transport->options.max_protocol);
+ state->transport->options.max_protocol,
+ state->transport->options.max_credits);
if (tevent_req_nomem(subreq, req)) {
return;
}
@@ -181,9 +182,6 @@ static void smb2_connect_negprot_done(struct tevent_req *subreq)
return;
}
- /* This is a hack... */
- smb2cli_conn_set_max_credits(transport->conn, 30);
-
state->session = smb2_session_init(transport, state->gensec_settings, state);
if (tevent_req_nomem(state->session, req)) {
return;
diff --git a/source4/param/loadparm.c b/source4/param/loadparm.c
index f53b2dd1807..1044a07ee30 100644
--- a/source4/param/loadparm.c
+++ b/source4/param/loadparm.c
@@ -30,6 +30,7 @@
#include "lib/param/param.h"
#include "libcli/raw/libcliraw.h"
#include "librpc/ndr/libndr.h"
+#include "libcli/smb/smb2_negotiate_context.h"
void lpcfg_smbcli_options(struct loadparm_context *lp_ctx,
struct smbcli_options *options)
@@ -47,6 +48,7 @@ void lpcfg_smbcli_options(struct loadparm_context *lp_ctx,
options->use_level2_oplocks = true;
options->smb2_capabilities = SMB2_CAP_ALL;
options->client_guid = GUID_random();
+ options->max_credits = WINDOWS_CLIENT_PURE_SMB2_NEGPROT_INITIAL_CREDIT_ASK;
}
void lpcfg_smbcli_session_options(struct loadparm_context *lp_ctx,