From 6c81893b342786d5f63aaa89e855e9378def50c3 Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Wed, 31 Oct 2012 08:37:13 +0100 Subject: s4:libcli/smb2: add support for SMB2 LEASES v2 Signed-off-by: Stefan Metzmacher Reviewed-by: Volker Lendecke --- source4/libcli/smb2/create.c | 48 +++++++++++++++++++++++++++++++++++++++----- 1 file changed, 43 insertions(+), 5 deletions(-) (limited to 'source4/libcli/smb2/create.c') diff --git a/source4/libcli/smb2/create.c b/source4/libcli/smb2/create.c index db9abbee69..6047a85d87 100644 --- a/source4/libcli/smb2/create.c +++ b/source4/libcli/smb2/create.c @@ -226,6 +226,27 @@ struct smb2_request *smb2_create_send(struct smb2_tree *tree, struct smb2_create } } + if (io->in.lease_request_v2) { + struct smb2_lease *ls = &io->in.lease_request_v2; + uint8_t data[52]; + + memcpy(&data[0], &ls->lease_key, 16); + SIVAL(data, 16, ls->lease_state); + SIVAL(data, 20, ls->lease_flags); + SBVAL(data, 24, ls->lease_duration); + memcpy(&data[32], &ls->parent_lease_key, 16); + SSVAL(data, 48, ls->lease_epoch); + SSVAL(data, 50, 0); /* reserved */ + + status = smb2_create_blob_add(req, &blobs, + SMB2_CREATE_TAG_RQLS, + data_blob_const(data, 52)); + if (!NT_STATUS_IS_OK(status)) { + talloc_free(req); + return NULL; + } + } + if (io->in.app_instance_id) { uint8_t data[20]; DATA_BLOB guid_blob; @@ -342,17 +363,34 @@ NTSTATUS smb2_create_recv(struct smb2_request *req, TALLOC_CTX *mem_ctx, struct memcpy(io->out.on_disk_id, io->out.blobs.blobs[i].data.data, 32); } if (strcmp(io->out.blobs.blobs[i].tag, SMB2_CREATE_TAG_RQLS) == 0) { + struct smb2_lease *ls = NULL; uint8_t *data; - if (io->out.blobs.blobs[i].data.length != 32) { + + ZERO_STRUCT(io->out.lease_response); + ZERO_STRUCT(io->out.lease_response_v2); + + switch (io->out.blobs.blobs[i].data.length) { + case 32: + ls = &io->out.lease_response; + break; + case 52: + ls = &io->out.lease_response_v2; + break; + default: smb2_request_destroy(req); return NT_STATUS_INVALID_NETWORK_RESPONSE; } data = io->out.blobs.blobs[i].data.data; - memcpy(&io->out.lease_response.lease_key, data, 16); - io->out.lease_response.lease_state = IVAL(data, 16); - io->out.lease_response.lease_flags = IVAL(data, 20); - io->out.lease_response.lease_duration = BVAL(data, 24); + memcpy(&ls->lease_key, data, 16); + ls->lease_state = IVAL(data, 16); + ls->lease_flags = IVAL(data, 20); + ls->lease_duration = BVAL(data, 24); + + if (io->out.blobs.blobs[i].data.length == 52) { + memcpy(&ls->parent_lease_key, data+32, 16); + ls->lease_epoch = SVAL(data, 48); + } } if (strcmp(io->out.blobs.blobs[i].tag, SMB2_CREATE_TAG_DHNQ) == 0) { if (io->out.blobs.blobs[i].data.length != 8) { -- cgit