#include "smbprofile.h"
#include "../lib/util/bitmap.h"
#include "../librpc/gen_ndr/krb5pac.h"
+#include "lib/iov_buf.h"
#include "auth.h"
static void smbd_smb2_connection_handler(struct tevent_context *ev,
goto inval;
}
- if (!(xconn->smb2.server.capabilities & SMB2_CAP_ENCRYPTION)) {
+ if (xconn->smb2.server.cipher == 0) {
DEBUG(10, ("Got SMB2_TRANSFORM header, "
"but not negotiated "
"client[0x%08X] server[0x%08X]\n",
tf_iov[1].iov_len = enc_len;
status = smb2_signing_decrypt_pdu(s->global->decryption_key,
- xconn->protocol,
+ xconn->smb2.server.cipher,
tf_iov, 2);
if (!NT_STATUS_IS_OK(status)) {
TALLOC_FREE(iov_alloc);
}
static NTSTATUS smbd_smb2_request_create(struct smbXsrv_connection *xconn,
- uint8_t *inbuf, size_t size,
+ const uint8_t *_inpdu, size_t size,
struct smbd_smb2_request **_req)
{
- struct smbd_server_connection *sconn = xconn->sconn;
+ struct smbd_server_connection *sconn = xconn->client->sconn;
struct smbd_smb2_request *req;
uint32_t protocol_version;
+ uint8_t *inpdu = NULL;
const uint8_t *inhdr = NULL;
uint16_t cmd;
uint32_t next_command_ofs;
NTSTATUS status;
NTTIME now;
- if (size < (4 + SMB2_HDR_BODY + 2)) {
+ if (size < (SMB2_HDR_BODY + 2)) {
DEBUG(0,("Invalid SMB2 packet length count %ld\n", (long)size));
return NT_STATUS_INVALID_PARAMETER;
}
- inhdr = inbuf + 4;
+ inhdr = _inpdu;
protocol_version = IVAL(inhdr, SMB2_HDR_PROTOCOL_ID);
if (protocol_version != SMB2_MAGIC) {
req->sconn = sconn;
req->xconn = xconn;
- talloc_steal(req, inbuf);
+ inpdu = talloc_memdup(req, _inpdu, size);
+ if (inpdu == NULL) {
+ return NT_STATUS_NO_MEMORY;
+ }
req->request_time = timeval_current();
now = timeval_to_nttime(&req->request_time);
status = smbd_smb2_inbuf_parse_compound(xconn,
now,
- inbuf + NBT_HDR_SIZE,
- size - NBT_HDR_SIZE,
+ inpdu,
+ size,
req, &req->in.vector,
&req->in.vector_count);
if (!NT_STATUS_IS_OK(status)) {
const struct iovec *in_vector,
struct iovec *out_vector)
{
- struct smbd_server_connection *sconn = xconn->sconn;
const uint8_t *inhdr = (const uint8_t *)in_vector->iov_base;
uint8_t *outhdr = (uint8_t *)out_vector->iov_base;
uint16_t credit_charge = 1;
SMB_ASSERT(xconn->smb2.credits.max >= xconn->smb2.credits.granted);
if (xconn->smb2.credits.max < credit_charge) {
- smbd_server_connection_terminate(sconn,
+ smbd_server_connection_terminate(xconn,
"client error: credit charge > max credits\n");
return;
}
return NT_STATUS_OK;
}
-void smbd_server_connection_terminate_ex(struct smbd_server_connection *sconn,
+void smbd_server_connection_terminate_ex(struct smbXsrv_connection *xconn,
const char *reason,
const char *location)
{
*/
if (firsttf->iov_len == SMB2_TF_HDR_SIZE) {
status = smb2_signing_encrypt_pdu(req->first_key,
- xconn->protocol,
+ xconn->smb2.server.cipher,
firsttf,
nreq->out.vector_count - first_idx);
if (!NT_STATUS_IS_OK(status)) {
return NT_STATUS_OK;
}
+static DATA_BLOB smbd_smb2_signing_key(struct smbXsrv_session *session,
+ struct smbXsrv_connection *xconn)
+{
+ struct smbXsrv_channel_global0 *c = NULL;
+ NTSTATUS status;
+ DATA_BLOB key = data_blob_null;
+
+ status = smbXsrv_session_find_channel(session, xconn, &c);
+ if (NT_STATUS_IS_OK(status)) {
+ key = c->signing_key;
+ }
+
+ if (key.length == 0) {
+ key = session->global->signing_key;
+ }
+
+ return key;
+}
+
static void smbd_smb2_request_pending_timer(struct tevent_context *ev,
struct tevent_timer *te,
struct timeval current_time,
state = talloc_zero(req->xconn, struct smbd_smb2_request_pending_state);
if (state == NULL) {
- smbd_server_connection_terminate(req->sconn,
+ smbd_server_connection_terminate(xconn,
nt_errstr(NT_STATUS_NO_MEMORY));
return;
}
DATA_BLOB encryption_key = x->global->encryption_key;
status = smb2_signing_encrypt_pdu(encryption_key,
- xconn->protocol,
+ xconn->smb2.server.cipher,
&state->vector[1+SMBD_SMB2_TF_IOV_OFS],
SMBD_SMB2_NUM_IOV_PER_REQ);
if (!NT_STATUS_IS_OK(status)) {
- smbd_server_connection_terminate(req->sconn,
+ smbd_server_connection_terminate(xconn,
nt_errstr(status));
return;
}
} else if (req->do_signing) {
struct smbXsrv_session *x = req->session;
- DATA_BLOB signing_key = x->global->channels[0].signing_key;
+ DATA_BLOB signing_key = smbd_smb2_signing_key(x, xconn);
status = smb2_signing_sign_pdu(signing_key,
xconn->protocol,
&state->vector[1+SMBD_SMB2_HDR_IOV_OFS],
SMBD_SMB2_NUM_IOV_PER_REQ - 1);
if (!NT_STATUS_IS_OK(status)) {
- smbd_server_connection_terminate(req->sconn,
+ smbd_server_connection_terminate(xconn,
nt_errstr(status));
return;
}
status = smbd_smb2_flush_send_queue(xconn);
if (!NT_STATUS_IS_OK(status)) {
- smbd_server_connection_terminate(req->sconn,
+ smbd_server_connection_terminate(xconn,
nt_errstr(status));
return;
}
return NT_STATUS_INVALID_HANDLE;
}
- if (in_session_id != req->xconn->last_session_id) {
- req->xconn->last_session_id = in_session_id;
+ if (in_session_id != req->xconn->client->last_session_id) {
+ req->xconn->client->last_session_id = in_session_id;
set_current_user_info(session_info->unix_info->sanitized_username,
session_info->unix_info->unix_name,
session_info->info->domain_name);
inhdr = SMBD_SMB2_IN_HDR_PTR(req);
+ DO_PROFILE_INC(request);
+
/* TODO: verify more things */
flags = IVAL(inhdr, SMB2_HDR_FLAGS);
encryption_required = x->global->encryption_required;
if (opcode == SMB2_OP_SESSSETUP &&
- x->global->channels[0].signing_key.length) {
+ x->global->signing_key.length > 0) {
signing_required = true;
}
}
if (req->do_encryption) {
signing_required = false;
} else if (signing_required || (flags & SMB2_HDR_FLAG_SIGNED)) {
- DATA_BLOB signing_key;
+ DATA_BLOB signing_key = data_blob_null;
if (x == NULL) {
/*
return smbd_smb2_request_error(req, status);
}
- signing_key = x->global->channels[0].signing_key;
+ signing_key = smbd_smb2_signing_key(x, xconn);
/*
* If we have a signing key, we should
SMB_ASSERT(call->need_tcon);
}
+#define _INBYTES(_r) \
+ iov_buflen(SMBD_SMB2_IN_HDR_IOV(_r), SMBD_SMB2_NUM_IOV_PER_REQ-1)
+
switch (opcode) {
case SMB2_OP_NEGPROT:
- {
- START_PROFILE(smb2_negprot);
- return_value = smbd_smb2_request_process_negprot(req);
- END_PROFILE(smb2_negprot);
- }
+ SMBPROFILE_IOBYTES_ASYNC_START(smb2_negprot, profile_p,
+ req->profile, _INBYTES(req));
+ return_value = smbd_smb2_request_process_negprot(req);
break;
case SMB2_OP_SESSSETUP:
- {
- START_PROFILE(smb2_sesssetup);
- return_value = smbd_smb2_request_process_sesssetup(req);
- END_PROFILE(smb2_sesssetup);
- }
+ SMBPROFILE_IOBYTES_ASYNC_START(smb2_sesssetup, profile_p,
+ req->profile, _INBYTES(req));
+ return_value = smbd_smb2_request_process_sesssetup(req);
break;
case SMB2_OP_LOGOFF:
- {
- START_PROFILE(smb2_logoff);
- return_value = smbd_smb2_request_process_logoff(req);
- END_PROFILE(smb2_logoff);
- }
+ SMBPROFILE_IOBYTES_ASYNC_START(smb2_logoff, profile_p,
+ req->profile, _INBYTES(req));
+ return_value = smbd_smb2_request_process_logoff(req);
break;
case SMB2_OP_TCON:
- {
- START_PROFILE(smb2_tcon);
- return_value = smbd_smb2_request_process_tcon(req);
- END_PROFILE(smb2_tcon);
- }
+ SMBPROFILE_IOBYTES_ASYNC_START(smb2_tcon, profile_p,
+ req->profile, _INBYTES(req));
+ return_value = smbd_smb2_request_process_tcon(req);
break;
case SMB2_OP_TDIS:
- {
- START_PROFILE(smb2_tdis);
- return_value = smbd_smb2_request_process_tdis(req);
- END_PROFILE(smb2_tdis);
- }
+ SMBPROFILE_IOBYTES_ASYNC_START(smb2_tdis, profile_p,
+ req->profile, _INBYTES(req));
+ return_value = smbd_smb2_request_process_tdis(req);
break;
case SMB2_OP_CREATE:
- {
- START_PROFILE(smb2_create);
- return_value = smbd_smb2_request_process_create(req);
- END_PROFILE(smb2_create);
+ if (req->subreq == NULL) {
+ SMBPROFILE_IOBYTES_ASYNC_START(smb2_create, profile_p,
+ req->profile, _INBYTES(req));
+ } else {
+ SMBPROFILE_IOBYTES_ASYNC_SET_BUSY(req->profile);
}
+ return_value = smbd_smb2_request_process_create(req);
break;
case SMB2_OP_CLOSE:
- {
- START_PROFILE(smb2_close);
- return_value = smbd_smb2_request_process_close(req);
- END_PROFILE(smb2_close);
- }
+ SMBPROFILE_IOBYTES_ASYNC_START(smb2_close, profile_p,
+ req->profile, _INBYTES(req));
+ return_value = smbd_smb2_request_process_close(req);
break;
case SMB2_OP_FLUSH:
- {
- START_PROFILE(smb2_flush);
- return_value = smbd_smb2_request_process_flush(req);
- END_PROFILE(smb2_flush);
- }
+ SMBPROFILE_IOBYTES_ASYNC_START(smb2_flush, profile_p,
+ req->profile, _INBYTES(req));
+ return_value = smbd_smb2_request_process_flush(req);
break;
case SMB2_OP_READ:
- {
- START_PROFILE(smb2_read);
- return_value = smbd_smb2_request_process_read(req);
- END_PROFILE(smb2_read);
- }
+ SMBPROFILE_IOBYTES_ASYNC_START(smb2_read, profile_p,
+ req->profile, _INBYTES(req));
+ return_value = smbd_smb2_request_process_read(req);
break;
case SMB2_OP_WRITE:
- {
- START_PROFILE(smb2_write);
- return_value = smbd_smb2_request_process_write(req);
- END_PROFILE(smb2_write);
- }
+ SMBPROFILE_IOBYTES_ASYNC_START(smb2_write, profile_p,
+ req->profile, _INBYTES(req));
+ return_value = smbd_smb2_request_process_write(req);
break;
case SMB2_OP_LOCK:
- {
- START_PROFILE(smb2_lock);
- return_value = smbd_smb2_request_process_lock(req);
- END_PROFILE(smb2_lock);
- }
+ SMBPROFILE_IOBYTES_ASYNC_START(smb2_lock, profile_p,
+ req->profile, _INBYTES(req));
+ return_value = smbd_smb2_request_process_lock(req);
break;
case SMB2_OP_IOCTL:
- {
- START_PROFILE(smb2_ioctl);
- return_value = smbd_smb2_request_process_ioctl(req);
- END_PROFILE(smb2_ioctl);
- }
+ SMBPROFILE_IOBYTES_ASYNC_START(smb2_ioctl, profile_p,
+ req->profile, _INBYTES(req));
+ return_value = smbd_smb2_request_process_ioctl(req);
break;
case SMB2_OP_CANCEL:
- {
- START_PROFILE(smb2_cancel);
- return_value = smbd_smb2_request_process_cancel(req);
- END_PROFILE(smb2_cancel);
- }
+ SMBPROFILE_IOBYTES_ASYNC_START(smb2_cancel, profile_p,
+ req->profile, _INBYTES(req));
+ return_value = smbd_smb2_request_process_cancel(req);
+ SMBPROFILE_IOBYTES_ASYNC_END(req->profile, 0);
break;
case SMB2_OP_KEEPALIVE:
- {
- START_PROFILE(smb2_keepalive);
- return_value = smbd_smb2_request_process_keepalive(req);
- END_PROFILE(smb2_keepalive);
- }
+ SMBPROFILE_IOBYTES_ASYNC_START(smb2_keepalive, profile_p,
+ req->profile, _INBYTES(req));
+ return_value = smbd_smb2_request_process_keepalive(req);
break;
case SMB2_OP_FIND:
- {
- START_PROFILE(smb2_find);
- return_value = smbd_smb2_request_process_find(req);
- END_PROFILE(smb2_find);
- }
+ SMBPROFILE_IOBYTES_ASYNC_START(smb2_find, profile_p,
+ req->profile, _INBYTES(req));
+ return_value = smbd_smb2_request_process_find(req);
break;
case SMB2_OP_NOTIFY:
- {
- START_PROFILE(smb2_notify);
- return_value = smbd_smb2_request_process_notify(req);
- END_PROFILE(smb2_notify);
- }
+ SMBPROFILE_IOBYTES_ASYNC_START(smb2_notify, profile_p,
+ req->profile, _INBYTES(req));
+ return_value = smbd_smb2_request_process_notify(req);
break;
case SMB2_OP_GETINFO:
- {
- START_PROFILE(smb2_getinfo);
- return_value = smbd_smb2_request_process_getinfo(req);
- END_PROFILE(smb2_getinfo);
- }
+ SMBPROFILE_IOBYTES_ASYNC_START(smb2_getinfo, profile_p,
+ req->profile, _INBYTES(req));
+ return_value = smbd_smb2_request_process_getinfo(req);
break;
case SMB2_OP_SETINFO:
- {
- START_PROFILE(smb2_setinfo);
- return_value = smbd_smb2_request_process_setinfo(req);
- END_PROFILE(smb2_setinfo);
- }
+ SMBPROFILE_IOBYTES_ASYNC_START(smb2_setinfo, profile_p,
+ req->profile, _INBYTES(req));
+ return_value = smbd_smb2_request_process_setinfo(req);
break;
case SMB2_OP_BREAK:
- {
- START_PROFILE(smb2_break);
- return_value = smbd_smb2_request_process_break(req);
- END_PROFILE(smb2_break);
- }
+ SMBPROFILE_IOBYTES_ASYNC_START(smb2_break, profile_p,
+ req->profile, _INBYTES(req));
+ return_value = smbd_smb2_request_process_break(req);
break;
default:
data_blob_clear_free(&req->last_key);
}
+ SMBPROFILE_IOBYTES_ASYNC_END(req->profile,
+ iov_buflen(outhdr, SMBD_SMB2_NUM_IOV_PER_REQ-1));
+
req->current_idx += SMBD_SMB2_NUM_IOV_PER_REQ;
if (req->current_idx < req->out.vector_count) {
if (req->do_signing && firsttf->iov_len == 0) {
struct smbXsrv_session *x = req->session;
- DATA_BLOB signing_key = x->global->channels[0].signing_key;
+ DATA_BLOB signing_key = smbd_smb2_signing_key(x, xconn);
/*
* we need to remember the signing key
*/
if (firsttf->iov_len == SMB2_TF_HDR_SIZE) {
status = smb2_signing_encrypt_pdu(req->first_key,
- xconn->protocol,
+ xconn->smb2.server.cipher,
firsttf,
req->out.vector_count - first_idx);
if (!NT_STATUS_IS_OK(status)) {
}
} else if (req->do_signing) {
struct smbXsrv_session *x = req->session;
- DATA_BLOB signing_key = x->global->channels[0].signing_key;
+ DATA_BLOB signing_key = smbd_smb2_signing_key(x, xconn);
status = smb2_signing_sign_pdu(signing_key,
xconn->protocol,
{
struct smbd_smb2_request *req = talloc_get_type_abort(private_data,
struct smbd_smb2_request);
- struct smbd_server_connection *sconn = req->sconn;
struct smbXsrv_connection *xconn = req->xconn;
NTSTATUS status;
status = smbd_smb2_request_dispatch(req);
if (!NT_STATUS_IS_OK(status)) {
- smbd_server_connection_terminate(sconn, nt_errstr(status));
+ smbd_server_connection_terminate(xconn, nt_errstr(status));
return;
}
status = smbd_smb2_request_next_incoming(xconn);
if (!NT_STATUS_IS_OK(status)) {
- smbd_server_connection_terminate(sconn, nt_errstr(status));
+ smbd_server_connection_terminate(xconn, nt_errstr(status));
return;
}
}
uint8_t body[1];
};
-static NTSTATUS smbd_smb2_send_break(struct smbd_server_connection *sconn,
+static NTSTATUS smbd_smb2_send_break(struct smbXsrv_connection *xconn,
struct smbXsrv_session *session,
struct smbXsrv_tcon *tcon,
const uint8_t *body,
size_t body_len)
{
struct smbd_smb2_send_break_state *state;
- struct smbXsrv_connection *xconn = sconn->conn;
- bool do_encryption = session->global->encryption_required;
+ bool do_encryption = false;
+ uint64_t session_wire_id = 0;
uint64_t nonce_high = 0;
uint64_t nonce_low = 0;
NTSTATUS status;
size_t statelen;
- if (tcon->global->encryption_required) {
- do_encryption = true;
+ if (session != NULL) {
+ session_wire_id = session->global->session_wire_id;
+ do_encryption = session->global->encryption_required;
+ if (tcon->global->encryption_required) {
+ do_encryption = true;
+ }
}
statelen = offsetof(struct smbd_smb2_send_break_state, body) +
body_len;
- state = talloc_zero_size(sconn, statelen);
+ state = talloc_zero_size(xconn, statelen);
if (state == NULL) {
return NT_STATUS_NO_MEMORY;
}
SIVAL(state->tf, SMB2_TF_PROTOCOL_ID, SMB2_TF_MAGIC);
SBVAL(state->tf, SMB2_TF_NONCE+0, nonce_low);
SBVAL(state->tf, SMB2_TF_NONCE+8, nonce_high);
- SBVAL(state->tf, SMB2_TF_SESSION_ID, session->global->session_wire_id);
+ SBVAL(state->tf, SMB2_TF_SESSION_ID, session_wire_id);
SIVAL(state->hdr, 0, SMB2_MAGIC);
SSVAL(state->hdr, SMB2_HDR_LENGTH, SMB2_HDR_BODY);
DATA_BLOB encryption_key = session->global->encryption_key;
status = smb2_signing_encrypt_pdu(encryption_key,
- xconn->protocol,
+ xconn->smb2.server.cipher,
&state->vector[1+SMBD_SMB2_TF_IOV_OFS],
SMBD_SMB2_NUM_IOV_PER_REQ);
if (!NT_STATUS_IS_OK(status)) {
return NT_STATUS_OK;
}
-NTSTATUS smbd_smb2_send_oplock_break(struct smbd_server_connection *sconn,
+NTSTATUS smbd_smb2_send_oplock_break(struct smbXsrv_connection *xconn,
struct smbXsrv_session *session,
struct smbXsrv_tcon *tcon,
struct smbXsrv_open *op,
SBVAL(body, 0x08, op->global->open_persistent_id);
SBVAL(body, 0x10, op->global->open_volatile_id);
- return smbd_smb2_send_break(sconn, session, tcon, body, sizeof(body));
+ return smbd_smb2_send_break(xconn, session, tcon, body, sizeof(body));
+}
+
+NTSTATUS smbd_smb2_send_lease_break(struct smbXsrv_connection *xconn,
+ uint16_t new_epoch,
+ uint32_t lease_flags,
+ struct smb2_lease_key *lease_key,
+ uint32_t current_lease_state,
+ uint32_t new_lease_state)
+{
+ uint8_t body[0x2c];
+
+ SSVAL(body, 0x00, sizeof(body));
+ SSVAL(body, 0x02, new_epoch);
+ SIVAL(body, 0x04, lease_flags);
+ SBVAL(body, 0x08, lease_key->data[0]);
+ SBVAL(body, 0x10, lease_key->data[1]);
+ SIVAL(body, 0x18, current_lease_state);
+ SIVAL(body, 0x1c, new_lease_state);
+ SIVAL(body, 0x20, 0); /* BreakReason, MUST be 0 */
+ SIVAL(body, 0x24, 0); /* AccessMaskHint, MUST be 0 */
+ SIVAL(body, 0x28, 0); /* ShareMaskHint, MUST be 0 */
+
+ return smbd_smb2_send_break(xconn, NULL, NULL, body, sizeof(body));
}
static bool is_smb2_recvfile_write(struct smbd_smb2_request_read_state *state)
static NTSTATUS smbd_smb2_request_next_incoming(struct smbXsrv_connection *xconn)
{
- struct smbd_server_connection *sconn = xconn->sconn;
+ struct smbd_server_connection *sconn = xconn->client->sconn;
struct smbd_smb2_request_read_state *state = &xconn->smb2.request_read_state;
size_t max_send_queue_len;
size_t cur_send_queue_len;
}
void smbd_smb2_first_negprot(struct smbXsrv_connection *xconn,
- uint8_t *inbuf, size_t size)
+ const uint8_t *inpdu, size_t size)
{
- struct smbd_server_connection *sconn = xconn->sconn;
+ struct smbd_server_connection *sconn = xconn->client->sconn;
NTSTATUS status;
struct smbd_smb2_request *req = NULL;
status = smbd_initialize_smb2(xconn);
if (!NT_STATUS_IS_OK(status)) {
- smbd_server_connection_terminate(sconn, nt_errstr(status));
+ smbd_server_connection_terminate(xconn, nt_errstr(status));
return;
}
- status = smbd_smb2_request_create(xconn, inbuf, size, &req);
+ status = smbd_smb2_request_create(xconn, inpdu, size, &req);
if (!NT_STATUS_IS_OK(status)) {
- smbd_server_connection_terminate(sconn, nt_errstr(status));
+ smbd_server_connection_terminate(xconn, nt_errstr(status));
return;
}
status = smbd_smb2_request_validate(req);
if (!NT_STATUS_IS_OK(status)) {
- smbd_server_connection_terminate(sconn, nt_errstr(status));
+ smbd_server_connection_terminate(xconn, nt_errstr(status));
return;
}
status = smbd_smb2_request_setup_out(req);
if (!NT_STATUS_IS_OK(status)) {
- smbd_server_connection_terminate(sconn, nt_errstr(status));
+ smbd_server_connection_terminate(xconn, nt_errstr(status));
return;
}
+#ifdef WITH_PROFILE
+ /*
+ * this was already counted at the SMB1 layer =>
+ * smbd_smb2_request_dispatch() should not count it twice.
+ */
+ if (profile_p->request_stats.count > 0) {
+ profile_p->request_stats.count--;
+ }
+#endif
status = smbd_smb2_request_dispatch(req);
if (!NT_STATUS_IS_OK(status)) {
- smbd_server_connection_terminate(sconn, nt_errstr(status));
+ smbd_server_connection_terminate(xconn, nt_errstr(status));
return;
}
status = smbd_smb2_request_next_incoming(xconn);
if (!NT_STATUS_IS_OK(status)) {
- smbd_server_connection_terminate(sconn, nt_errstr(status));
+ smbd_server_connection_terminate(xconn, nt_errstr(status));
return;
}
struct smbd_smb2_send_queue *e = xconn->smb2.send_queue;
if (e->sendfile_header != NULL) {
+ NTSTATUS status = NT_STATUS_INTERNAL_ERROR;
size_t size = 0;
size_t i = 0;
uint8_t *buf;
e->sendfile_header->data = buf;
e->sendfile_header->length = size;
+ e->sendfile_status = &status;
e->count = 0;
xconn->smb2.send_queue_len--;
* the destructor.
*/
talloc_free(e->mem_ctx);
+
+ if (!NT_STATUS_IS_OK(status)) {
+ return status;
+ }
continue;
}
static NTSTATUS smbd_smb2_io_handler(struct smbXsrv_connection *xconn,
uint16_t fde_flags)
{
- struct smbd_server_connection *sconn = xconn->sconn;
+ struct smbd_server_connection *sconn = xconn->client->sconn;
struct smbd_smb2_request_read_state *state = &xconn->smb2.request_read_state;
struct smbd_smb2_request *req = NULL;
size_t min_recvfile_size = UINT32_MAX;
struct smbXsrv_connection *xconn =
talloc_get_type_abort(private_data,
struct smbXsrv_connection);
- struct smbd_server_connection *sconn = xconn->sconn;
NTSTATUS status;
status = smbd_smb2_io_handler(xconn, flags);
if (!NT_STATUS_IS_OK(status)) {
- smbd_server_connection_terminate(sconn, nt_errstr(status));
+ smbd_server_connection_terminate(xconn, nt_errstr(status));
return;
}
}