1
0
mirror of https://github.com/samba-team/samba.git synced 2024-12-23 17:34:34 +03:00

smbd: use remote arch caching

We're using the client guid as gencache db key, so this can only be used
with SMB 2_10 or higher.

The idea is that whenever we get a direct SMB2 negprot, we can then try
to see if a value is cached for the client's guid.

When a user logs off the cache entry is deleted.

Signed-off-by: Ralph Boehme <slow@samba.org>
Reviewed-by: Jeremy Allison <jra@samba.org>
This commit is contained in:
Ralph Boehme 2016-04-13 17:44:26 +02:00 committed by Jeremy Allison
parent 719e42294d
commit a2c59d3e45
2 changed files with 23 additions and 1 deletions

View File

@ -162,6 +162,7 @@ NTSTATUS smbd_smb2_request_process_negprot(struct smbd_smb2_request *req)
uint32_t max_write = lp_smb2_max_write();
NTTIME now = timeval_to_nttime(&req->request_time);
bool signing_required = true;
bool ok;
status = smbd_smb2_request_verify_sizes(req, 0x24);
if (!NT_STATUS_IS_OK(status)) {
@ -260,6 +261,17 @@ NTSTATUS smbd_smb2_request_process_negprot(struct smbd_smb2_request *req)
}
}
if ((dialect != SMB2_DIALECT_REVISION_2FF) &&
(protocol >= PROTOCOL_SMB2_10) &&
!GUID_all_zero(&in_guid))
{
ok = remote_arch_cache_update(&in_guid);
if (!ok) {
return smbd_smb2_request_error(
req, NT_STATUS_UNSUCCESSFUL);
}
}
switch (get_remote_arch()) {
case RA_VISTA:
case RA_SAMBA:
@ -532,7 +544,6 @@ NTSTATUS smbd_smb2_request_process_negprot(struct smbd_smb2_request *req)
static const uint8_t zeros[8];
size_t pad = 0;
size_t ofs;
bool ok;
outdyn = data_blob_dup_talloc(req, security_buffer);
if (outdyn.length != security_buffer.length) {

View File

@ -1306,6 +1306,9 @@ static void smbd_smb2_logoff_shutdown_done(struct tevent_req *subreq)
struct smbd_smb2_logoff_state *state = tevent_req_data(
req, struct smbd_smb2_logoff_state);
NTSTATUS status;
bool ok;
const struct GUID *client_guid =
&state->smb2req->session->client->connections->smb2.client.guid;
status = smb2srv_session_shutdown_recv(subreq);
if (tevent_req_nterror(req, status)) {
@ -1313,6 +1316,14 @@ static void smbd_smb2_logoff_shutdown_done(struct tevent_req *subreq)
}
TALLOC_FREE(subreq);
if (!GUID_all_zero(client_guid)) {
ok = remote_arch_cache_delete(client_guid);
if (!ok) {
/* Most likely not an error, but not in cache */
DBG_DEBUG("Deletion from remote arch cache failed\n");
}
}
/*
* As we've been awoken, we may have changed
* uid in the meantime. Ensure we're still