diff options
author | Stefan Metzmacher <metze@samba.org> | 2009-08-12 17:43:03 +0200 |
---|---|---|
committer | Stefan Metzmacher <metze@samba.org> | 2009-08-12 19:22:06 +0200 |
commit | 1d75a6e2245c022e2688d5fa6807d572fa18bcd6 (patch) | |
tree | f86ae9bd5b2316a97b05c02d9cb3256654b181bd /source4 | |
parent | 1df883aa39ce69b040f9d9e72125bf4b80c714a9 (diff) | |
download | samba-1d75a6e2245c022e2688d5fa6807d572fa18bcd6.tar.gz samba-1d75a6e2245c022e2688d5fa6807d572fa18bcd6.tar.bz2 samba-1d75a6e2245c022e2688d5fa6807d572fa18bcd6.zip |
libcli/smb: move smb2_create_blob code to libcli/smb/
I want to use this in source3/smbd/
metze
Diffstat (limited to 'source4')
-rw-r--r-- | source4/libcli/config.mk | 2 | ||||
-rw-r--r-- | source4/libcli/raw/interfaces.h | 8 | ||||
-rw-r--r-- | source4/libcli/smb2/create.c | 157 | ||||
-rw-r--r-- | source4/main.mk | 1 |
4 files changed, 3 insertions, 165 deletions
diff --git a/source4/libcli/config.mk b/source4/libcli/config.mk index ad7bc311c2..b6a9f112a0 100644 --- a/source4/libcli/config.mk +++ b/source4/libcli/config.mk @@ -147,7 +147,7 @@ $(eval $(call proto_header_template,$(libclisrcdir)/libcli_proto.h,$(LIBCLI_SMB_ [SUBSYSTEM::LIBCLI_RAW] PRIVATE_DEPENDENCIES = LIBCLI_COMPOSITE LP_RESOLVE gensec LIBCLI_RESOLVE LIBSECURITY LIBNDR #LDFLAGS = $(LIBCLI_SMB_COMPOSITE_OUTPUT) -PUBLIC_DEPENDENCIES = samba_socket LIBPACKET gensec LIBCRYPTO CREDENTIALS +PUBLIC_DEPENDENCIES = samba_socket LIBPACKET gensec LIBCRYPTO CREDENTIALS LIBCLI_SMB_COMMON LIBCLI_RAW_OBJ_FILES = $(addprefix $(libclisrcdir)/raw/, rawfile.o smb_signing.o clisocket.o \ clitransport.o clisession.o clitree.o clierror.o rawrequest.o \ diff --git a/source4/libcli/raw/interfaces.h b/source4/libcli/raw/interfaces.h index ad5f5bf223..13217158cb 100644 --- a/source4/libcli/raw/interfaces.h +++ b/source4/libcli/raw/interfaces.h @@ -1660,13 +1660,7 @@ union smb_open { struct smb2_lease *lease_request; /* and any additional blobs the caller wants */ - struct smb2_create_blobs { - uint32_t num_blobs; - struct smb2_create_blob { - const char *tag; - DATA_BLOB data; - } *blobs; - } blobs; + struct smb2_create_blobs blobs; } in; struct { union smb_handle file; diff --git a/source4/libcli/smb2/create.c b/source4/libcli/smb2/create.c index 363210bd03..c9fb4ea4e0 100644 --- a/source4/libcli/smb2/create.c +++ b/source4/libcli/smb2/create.c @@ -26,163 +26,6 @@ #include "libcli/smb2/smb2_calls.h" #include "librpc/gen_ndr/ndr_security.h" - -/* - parse a set of SMB2 create blobs -*/ -NTSTATUS smb2_create_blob_parse(TALLOC_CTX *mem_ctx, const DATA_BLOB buffer, - struct smb2_create_blobs *blobs) -{ - const uint8_t *data = buffer.data; - uint32_t remaining = buffer.length; - - while (remaining > 0) { - uint32_t next; - uint32_t name_offset, name_length; - uint32_t reserved, data_offset; - uint32_t data_length; - char *tag; - DATA_BLOB b; - NTSTATUS status; - - if (remaining < 16) { - return NT_STATUS_INVALID_PARAMETER; - } - next = IVAL(data, 0); - name_offset = SVAL(data, 4); - name_length = SVAL(data, 6); - reserved = SVAL(data, 8); - data_offset = SVAL(data, 10); - data_length = IVAL(data, 12); - - if ((next & 0x7) != 0 || - next > remaining || - name_offset < 16 || - name_offset > remaining || - name_length != 4 || /* windows enforces this */ - name_offset + name_length > remaining || - data_offset < name_offset + name_length || - data_offset > remaining || - data_offset + (uint64_t)data_length > remaining) { - return NT_STATUS_INVALID_PARAMETER; - } - - tag = talloc_strndup(mem_ctx, (const char *)data + name_offset, name_length); - if (tag == NULL) { - return NT_STATUS_NO_MEMORY; - } - - b = data_blob_const(data+data_offset, data_length); - status = smb2_create_blob_add(mem_ctx, blobs, tag, b); - if (!NT_STATUS_IS_OK(status)) { - return status; - } - - talloc_free(tag); - - if (next == 0) break; - - remaining -= next; - data += next; - - if (remaining < 16) { - return NT_STATUS_INVALID_PARAMETER; - } - } - - return NT_STATUS_OK; -} - - -/* - add a blob to a smb2_create attribute blob -*/ -static NTSTATUS smb2_create_blob_push_one(TALLOC_CTX *mem_ctx, DATA_BLOB *buffer, - const struct smb2_create_blob *blob, - bool last) -{ - uint32_t ofs = buffer->length; - size_t tag_length = strlen(blob->tag); - uint8_t pad = smb2_padding_size(blob->data.length+tag_length, 4); - - if (!data_blob_realloc(mem_ctx, buffer, - buffer->length + 0x14 + tag_length + blob->data.length + pad)) - return NT_STATUS_NO_MEMORY; - - if (last) { - SIVAL(buffer->data, ofs+0x00, 0); - } else { - SIVAL(buffer->data, ofs+0x00, 0x14 + tag_length + blob->data.length + pad); - } - SSVAL(buffer->data, ofs+0x04, 0x10); /* offset of tag */ - SIVAL(buffer->data, ofs+0x06, tag_length); /* tag length */ - SSVAL(buffer->data, ofs+0x0A, 0x14 + tag_length); /* offset of data */ - SIVAL(buffer->data, ofs+0x0C, blob->data.length); - memcpy(buffer->data+ofs+0x10, blob->tag, tag_length); - SIVAL(buffer->data, ofs+0x10+tag_length, 0); /* pad? */ - memcpy(buffer->data+ofs+0x14+tag_length, blob->data.data, blob->data.length); - memset(buffer->data+ofs+0x14+tag_length+blob->data.length, 0, pad); - - return NT_STATUS_OK; -} - - -/* - create a buffer of a set of create blobs -*/ -NTSTATUS smb2_create_blob_push(TALLOC_CTX *mem_ctx, DATA_BLOB *buffer, - const struct smb2_create_blobs blobs) -{ - int i; - NTSTATUS status; - - *buffer = data_blob(NULL, 0); - for (i=0; i < blobs.num_blobs; i++) { - bool last = false; - const struct smb2_create_blob *c; - - if ((i + 1) == blobs.num_blobs) { - last = true; - } - - c = &blobs.blobs[i]; - status = smb2_create_blob_push_one(mem_ctx, buffer, c, last); - if (!NT_STATUS_IS_OK(status)) { - return status; - } - } - return NT_STATUS_OK; -} - - -NTSTATUS smb2_create_blob_add(TALLOC_CTX *mem_ctx, struct smb2_create_blobs *b, - const char *tag, DATA_BLOB data) -{ - struct smb2_create_blob *array; - - array = talloc_realloc(mem_ctx, b->blobs, - struct smb2_create_blob, - b->num_blobs + 1); - NT_STATUS_HAVE_NO_MEMORY(array); - b->blobs = array; - - b->blobs[b->num_blobs].tag = talloc_strdup(b->blobs, tag); - NT_STATUS_HAVE_NO_MEMORY(b->blobs[b->num_blobs].tag); - - if (data.data) { - b->blobs[b->num_blobs].data = data_blob_talloc(b->blobs, - data.data, - data.length); - NT_STATUS_HAVE_NO_MEMORY(b->blobs[b->num_blobs].data.data); - } else { - b->blobs[b->num_blobs].data = data_blob(NULL, 0); - } - - b->num_blobs += 1; - - return NT_STATUS_OK; -} - /* send a create request */ diff --git a/source4/main.mk b/source4/main.mk index 4d7fd584f8..63eea36cdf 100644 --- a/source4/main.mk +++ b/source4/main.mk @@ -48,6 +48,7 @@ mkinclude torture/config.mk mkinclude librpc/config.mk mkinclude client/config.mk mkinclude libcli/config.mk +mkinclude ../libcli/smb/config.mk mkinclude ../libcli/cldap/config.mk mkinclude scripting/python/config.mk mkinclude kdc/config.mk |