1
0
mirror of https://github.com/samba-team/samba.git synced 2025-02-02 09:47:23 +03:00

libcli/smb2: make it possible to handle incoming oplock requests

metze
(This used to be commit 58189b87eade62b717c2c17c679e482786bf2098)
This commit is contained in:
Stefan Metzmacher 2008-04-18 22:27:24 +02:00
parent 0f4a60ff24
commit 132852f44a
2 changed files with 54 additions and 0 deletions

View File

@ -21,6 +21,8 @@
#include "libcli/raw/request.h"
struct smb2_handle;
struct smb2_options {
uint32_t timeout;
};
@ -58,6 +60,15 @@ struct smb2_transport {
void *private;
uint_t period;
} idle;
struct {
/* a oplock break request handler */
bool (*handler)(struct smb2_transport *transport,
const struct smb2_handle *handle,
uint8_t level, void *private_data);
/* private data passed to the oplock handler */
void *private_data;
} oplock;
};

View File

@ -140,6 +140,44 @@ void smb2_transport_dead(struct smb2_transport *transport, NTSTATUS status)
}
}
static bool smb2_handle_oplock_break(struct smb2_transport *transport,
const DATA_BLOB *blob)
{
uint8_t *hdr;
uint16_t opcode;
uint64_t seqnum;
hdr = blob->data+NBT_HDR_SIZE;
if (blob->length < (SMB2_MIN_SIZE+0x18)) {
DEBUG(1,("Discarding smb2 oplock reply of size %u\n",
blob->length));
return false;
}
opcode = SVAL(hdr, SMB2_HDR_OPCODE);
seqnum = BVAL(hdr, SMB2_HDR_MESSAGE_ID);
if ((opcode != SMB2_OP_BREAK) ||
(seqnum != UINT64_MAX)) {
return false;
}
if (transport->oplock.handler) {
uint8_t *body = hdr+SMB2_HDR_BODY;
struct smb2_handle h;
uint8_t level;
level = CVAL(body, 0x02);
smb2_pull_handle(body+0x08, &h);
transport->oplock.handler(transport, &h, level,
transport->oplock.private_data);
}
return true;
}
/*
we have a full request in our receive buffer - match it to a pending request
and process
@ -167,6 +205,11 @@ static NTSTATUS smb2_transport_finish_recv(void *private, DATA_BLOB blob)
goto error;
}
if (smb2_handle_oplock_break(transport, &blob)) {
talloc_free(buffer);
return NT_STATUS_OK;
}
flags = IVAL(hdr, SMB2_HDR_FLAGS);
seqnum = BVAL(hdr, SMB2_HDR_MESSAGE_ID);