summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--source3/smbd/globals.h19
-rw-r--r--source3/smbd/ipc.c3
-rw-r--r--source3/smbd/nttrans.c3
-rw-r--r--source3/smbd/process.c4
-rw-r--r--source3/smbd/reply.c23
-rw-r--r--source3/smbd/sesssetup.c17
-rw-r--r--source3/smbd/trans2.c3
7 files changed, 41 insertions, 31 deletions
diff --git a/source3/smbd/globals.h b/source3/smbd/globals.h
index 625bff690b..e077133d25 100644
--- a/source3/smbd/globals.h
+++ b/source3/smbd/globals.h
@@ -365,6 +365,16 @@ struct smbXsrv_connection {
*/
int max_recv;
} negprot;
+
+ struct {
+ bool done_sesssetup;
+ /*
+ * Size of data we can send to client. Set
+ * by the client for all protocols above CORE.
+ * Set by us for CORE protocol.
+ */
+ int max_send;
+ } sessions;
} smb1;
struct {
struct {
@@ -754,15 +764,6 @@ struct smbd_server_connection {
uint32_t client_cap_high;
} unix_info;
- struct {
- bool done_sesssetup;
- /*
- * Size of data we can send to client. Set
- * by the client for all protocols above CORE.
- * Set by us for CORE protocol.
- */
- int max_send;
- } sessions;
struct smb_signing_state *signing_state;
struct notify_mid_map *notify_mid_maps;
diff --git a/source3/smbd/ipc.c b/source3/smbd/ipc.c
index dbb259cedc..1c8033d6fa 100644
--- a/source3/smbd/ipc.c
+++ b/source3/smbd/ipc.c
@@ -108,7 +108,8 @@ void send_trans_reply(connection_struct *conn,
int ldata = rdata ? rdata_len : 0;
int lparam = rparam ? rparam_len : 0;
struct smbd_server_connection *sconn = req->sconn;
- int max_send = sconn->smb1.sessions.max_send;
+ struct smbXsrv_connection *xconn = sconn->conn;
+ int max_send = xconn->smb1.sessions.max_send;
/* HACK: make sure we send at least 128 byte in one go */
int hdr_overhead = SMB_BUFFER_SIZE_MIN - 128;
diff --git a/source3/smbd/nttrans.c b/source3/smbd/nttrans.c
index bca4cd8ab5..018a89db74 100644
--- a/source3/smbd/nttrans.c
+++ b/source3/smbd/nttrans.c
@@ -68,7 +68,8 @@ static void send_nt_replies(connection_struct *conn,
int alignment_offset = 1;
int data_alignment_offset = 0;
struct smbd_server_connection *sconn = req->sconn;
- int max_send = sconn->smb1.sessions.max_send;
+ struct smbXsrv_connection *xconn = sconn->conn;
+ int max_send = xconn->smb1.sessions.max_send;
/*
* If there genuinely are no parameters or data to send just send
diff --git a/source3/smbd/process.c b/source3/smbd/process.c
index 3c5d025704..c78915723e 100644
--- a/source3/smbd/process.c
+++ b/source3/smbd/process.c
@@ -3830,8 +3830,8 @@ void smbd_process(struct tevent_context *ev_ctx,
conn->smb1.negprot.max_recv = tmp;
- sconn->smb1.sessions.done_sesssetup = false;
- sconn->smb1.sessions.max_send = SMB_BUFFER_SIZE_MAX;
+ conn->smb1.sessions.done_sesssetup = false;
+ conn->smb1.sessions.max_send = SMB_BUFFER_SIZE_MAX;
if (!init_dptrs(sconn)) {
exit_server("init_dptrs() failed");
diff --git a/source3/smbd/reply.c b/source3/smbd/reply.c
index 72f493194a..f15e69953a 100644
--- a/source3/smbd/reply.c
+++ b/source3/smbd/reply.c
@@ -1556,6 +1556,7 @@ void reply_search(struct smb_request *req)
bool ask_sharemode = lp_parm_bool(SNUM(conn), "smbd", "search ask sharemode", true);
struct dptr_struct *dirptr = NULL;
struct smbd_server_connection *sconn = req->sconn;
+ struct smbXsrv_connection *xconn = sconn->conn;
START_PROFILE(SMBsearch);
@@ -1705,7 +1706,7 @@ void reply_search(struct smb_request *req)
} else {
unsigned int i;
size_t hdr_size = ((uint8_t *)smb_buf(req->outbuf) + 3 - req->outbuf);
- size_t available_space = sconn->smb1.sessions.max_send - hdr_size;
+ size_t available_space = xconn->smb1.sessions.max_send - hdr_size;
maxentries = MIN(maxentries, available_space/DIR_STRUCT_SIZE);
@@ -3477,6 +3478,7 @@ void reply_lockread(struct smb_request *req)
struct byte_range_lock *br_lck = NULL;
char *p = NULL;
struct smbd_server_connection *sconn = req->sconn;
+ struct smbXsrv_connection *xconn = sconn->conn;
START_PROFILE(SMBlockread);
@@ -3531,13 +3533,13 @@ void reply_lockread(struct smb_request *req)
/*
* However the requested READ size IS affected by max_send. Insanity.... JRA.
*/
- maxtoread = sconn->smb1.sessions.max_send - (smb_size + 5*2 + 3);
+ maxtoread = xconn->smb1.sessions.max_send - (smb_size + 5*2 + 3);
if (numtoread > maxtoread) {
DEBUG(0,("reply_lockread: requested read size (%u) is greater than maximum allowed (%u/%u). \
Returning short read of maximum allowed for compatibility with Windows 2000.\n",
(unsigned int)numtoread, (unsigned int)maxtoread,
- (unsigned int)sconn->smb1.sessions.max_send));
+ (unsigned int)xconn->smb1.sessions.max_send));
numtoread = maxtoread;
}
@@ -3586,6 +3588,7 @@ void reply_read(struct smb_request *req)
files_struct *fsp;
struct lock_struct lock;
struct smbd_server_connection *sconn = req->sconn;
+ struct smbXsrv_connection *xconn = sconn->conn;
START_PROFILE(SMBread);
@@ -3614,13 +3617,13 @@ void reply_read(struct smb_request *req)
/*
* The requested read size cannot be greater than max_send. JRA.
*/
- maxtoread = sconn->smb1.sessions.max_send - (smb_size + 5*2 + 3);
+ maxtoread = xconn->smb1.sessions.max_send - (smb_size + 5*2 + 3);
if (numtoread > maxtoread) {
DEBUG(0,("reply_read: requested read size (%u) is greater than maximum allowed (%u/%u). \
Returning short read of maximum allowed for compatibility with Windows 2000.\n",
(unsigned int)numtoread, (unsigned int)maxtoread,
- (unsigned int)sconn->smb1.sessions.max_send));
+ (unsigned int)xconn->smb1.sessions.max_send));
numtoread = maxtoread;
}
@@ -3899,16 +3902,18 @@ nosendfile_read:
static size_t calc_max_read_pdu(const struct smb_request *req)
{
+ struct smbXsrv_connection *xconn = req->sconn->conn;
+
if (req->sconn->conn->protocol < PROTOCOL_NT1) {
- return req->sconn->smb1.sessions.max_send;
+ return xconn->smb1.sessions.max_send;
}
if (!lp_large_readwrite()) {
- return req->sconn->smb1.sessions.max_send;
+ return xconn->smb1.sessions.max_send;
}
if (req_is_in_chain(req)) {
- return req->sconn->smb1.sessions.max_send;
+ return xconn->smb1.sessions.max_send;
}
if (req->encrypted) {
@@ -3917,7 +3922,7 @@ static size_t calc_max_read_pdu(const struct smb_request *req)
* limit. There are padding considerations
* that make that tricky.
*/
- return req->sconn->smb1.sessions.max_send;
+ return xconn->smb1.sessions.max_send;
}
if (srv_is_signing_active(req->sconn)) {
diff --git a/source3/smbd/sesssetup.c b/source3/smbd/sesssetup.c
index a908f69c78..75da143a28 100644
--- a/source3/smbd/sesssetup.c
+++ b/source3/smbd/sesssetup.c
@@ -132,6 +132,7 @@ static void reply_sesssetup_and_X_spnego(struct smb_request *req)
uint64_t vuid = req->vuid;
NTSTATUS status = NT_STATUS_OK;
struct smbd_server_connection *sconn = req->sconn;
+ struct smbXsrv_connection *xconn = sconn->conn;
uint16_t action = 0;
NTTIME now = timeval_to_nttime(&req->request_time);
struct smbXsrv_session *session = NULL;
@@ -140,7 +141,7 @@ static void reply_sesssetup_and_X_spnego(struct smb_request *req)
DEBUG(3,("Doing spnego session setup\n"));
- if (!sconn->smb1.sessions.done_sesssetup) {
+ if (!xconn->smb1.sessions.done_sesssetup) {
global_client_caps = client_caps;
if (!(global_client_caps & CAP_STATUS32)) {
@@ -381,13 +382,13 @@ static void reply_sesssetup_and_X_spnego(struct smb_request *req)
return;
}
- if (!sconn->smb1.sessions.done_sesssetup) {
+ if (!xconn->smb1.sessions.done_sesssetup) {
if (smb_bufsize < SMB_BUFFER_SIZE_MIN) {
reply_force_doserror(req, ERRSRV, ERRerror);
return;
}
- sconn->smb1.sessions.max_send = smb_bufsize;
- sconn->smb1.sessions.done_sesssetup = true;
+ xconn->smb1.sessions.max_send = smb_bufsize;
+ xconn->smb1.sessions.done_sesssetup = true;
}
/* current_user_info is changed on new vuid */
@@ -683,7 +684,7 @@ void reply_sesssetup_and_X(struct smb_request *req)
const uint8_t *save_p = req->buf;
uint16 byte_count;
- if (!sconn->smb1.sessions.done_sesssetup) {
+ if (!xconn->smb1.sessions.done_sesssetup) {
global_client_caps = IVAL(req->vwv+11, 0);
if (!(global_client_caps & CAP_STATUS32)) {
@@ -1090,14 +1091,14 @@ void reply_sesssetup_and_X(struct smb_request *req)
SSVAL(discard_const_p(char, req->inbuf),smb_uid,sess_vuid);
req->vuid = sess_vuid;
- if (!sconn->smb1.sessions.done_sesssetup) {
+ if (!xconn->smb1.sessions.done_sesssetup) {
if (smb_bufsize < SMB_BUFFER_SIZE_MIN) {
reply_force_doserror(req, ERRSRV, ERRerror);
END_PROFILE(SMBsesssetupX);
return;
}
- sconn->smb1.sessions.max_send = smb_bufsize;
- sconn->smb1.sessions.done_sesssetup = true;
+ xconn->smb1.sessions.max_send = smb_bufsize;
+ xconn->smb1.sessions.done_sesssetup = true;
}
END_PROFILE(SMBsesssetupX);
diff --git a/source3/smbd/trans2.c b/source3/smbd/trans2.c
index 5304052f59..76e410f87b 100644
--- a/source3/smbd/trans2.c
+++ b/source3/smbd/trans2.c
@@ -860,7 +860,8 @@ void send_trans2_replies(connection_struct *conn,
int data_alignment_offset = 0;
bool overflow = False;
struct smbd_server_connection *sconn = req->sconn;
- int max_send = sconn->smb1.sessions.max_send;
+ struct smbXsrv_connection *xconn = sconn->conn;
+ int max_send = xconn->smb1.sessions.max_send;
/* Modify the data_to_send and datasize and set the error if
we're trying to send more than max_data_bytes. We still send