diff options
Diffstat (limited to 'source4/libcli/ndr/ndr.c')
-rw-r--r-- | source4/libcli/ndr/ndr.c | 187 |
1 files changed, 0 insertions, 187 deletions
diff --git a/source4/libcli/ndr/ndr.c b/source4/libcli/ndr/ndr.c deleted file mode 100644 index 4e5f199835..0000000000 --- a/source4/libcli/ndr/ndr.c +++ /dev/null @@ -1,187 +0,0 @@ -/* - Unix SMB/CIFS implementation. - - libndr interface - - Copyright (C) Andrew Tridgell 2003 - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -*/ - -/* - this provides the core routines for NDR parsing functions - - see http://www.opengroup.org/onlinepubs/9629399/chap14.htm for details - of NDR encoding rules -*/ - -#include "includes.h" - -#define NDR_BASE_MARSHALL_SIZE 1024 - -/* - initialise a ndr parse structure from a data blob -*/ -struct ndr_pull *ndr_pull_init_blob(DATA_BLOB *blob, TALLOC_CTX *mem_ctx) -{ - struct ndr_pull *ndr; - - ndr = talloc(mem_ctx, sizeof(*ndr)); - if (!ndr) return NULL; - - ndr->flags = 0; - ndr->data = blob->data; - ndr->data_size = blob->length; - ndr->offset = 0; - ndr->mem_ctx = mem_ctx; - - return ndr; -} - - -/* limit the remaining size of the current ndr parse structure to the - given size, starting at the given offset - - this is used when a ndr packet has an explicit size on the wire, and we - need to make sure that we don't use more data than is indicated - - the 'ofs' parameter indicates how many bytes back from the current - offset in the buffer the 'size' number of bytes starts -*/ -NTSTATUS ndr_pull_limit_size(struct ndr_pull *ndr, uint32 size, uint32 ofs) -{ - uint32 new_size; - new_size = ndr->offset + size - ofs; - - if (new_size > ndr->data_size) { - return NT_STATUS_BUFFER_TOO_SMALL; - } - ndr->data_size = new_size; - - return NT_STATUS_OK; -} - - -/* - advance by 'size' bytes -*/ -NTSTATUS ndr_pull_advance(struct ndr_pull *ndr, uint32 size) -{ - ndr->offset += size; - if (ndr->offset > ndr->data_size) { - return NT_STATUS_BUFFER_TOO_SMALL; - } - return NT_STATUS_OK; -} - -/* - set the parse offset to 'ofs' -*/ -NTSTATUS ndr_pull_set_offset(struct ndr_pull *ndr, uint32 ofs) -{ - ndr->offset = ofs; - if (ndr->offset > ndr->data_size) { - return NT_STATUS_BUFFER_TOO_SMALL; - } - return NT_STATUS_OK; -} - -/* save the offset/size of the current ndr state */ -void ndr_pull_save(struct ndr_pull *ndr, struct ndr_pull_save *save) -{ - save->offset = ndr->offset; - save->data_size = ndr->data_size; -} - -/* restore the size/offset of a ndr structure */ -void ndr_pull_restore(struct ndr_pull *ndr, struct ndr_pull_save *save) -{ - ndr->offset = save->offset; - ndr->data_size = save->data_size; -} - - - - -/* create a ndr_push structure, ready for some marshalling */ -struct ndr_push *ndr_push_init(void) -{ - struct ndr_push *ndr; - TALLOC_CTX *mem_ctx = talloc_init("ndr_push_init"); - if (!mem_ctx) return NULL; - - ndr = talloc(mem_ctx, sizeof(*ndr)); - if (!ndr) { - talloc_destroy(mem_ctx); - return NULL; - } - - ndr->mem_ctx = mem_ctx; - ndr->flags = 0; - ndr->alloc_size = NDR_BASE_MARSHALL_SIZE; - ndr->data = talloc(ndr->mem_ctx, ndr->alloc_size); - if (!ndr->data) { - ndr_push_free(ndr); - return NULL; - } - ndr->offset = 0; - - return ndr; -} - -/* free a ndr_push structure */ -void ndr_push_free(struct ndr_push *ndr) -{ - talloc_destroy(ndr->mem_ctx); -} - - -/* return a DATA_BLOB structure for the current ndr_push marshalled data */ -DATA_BLOB ndr_push_blob(struct ndr_push *ndr) -{ - DATA_BLOB blob; - blob.data = ndr->data; - blob.length = ndr->offset; - return blob; -} - - -/* - expand the available space in the buffer to 'size' -*/ -NTSTATUS ndr_push_expand(struct ndr_push *ndr, uint32 size) -{ - if (ndr->alloc_size >= size) { - return NT_STATUS_OK; - } - - ndr->alloc_size = size; - ndr->data = talloc_realloc(ndr->mem_ctx, ndr->data, ndr->alloc_size); - if (!ndr->data) { - return NT_STATUS_NO_MEMORY; - } - - return NT_STATUS_OK; -} - -/* - set the push offset to 'ofs' -*/ -NTSTATUS ndr_push_set_offset(struct ndr_push *ndr, uint32 ofs) -{ - NDR_CHECK(ndr_push_expand(ndr, ofs)); - ndr->offset = ofs; - return NT_STATUS_OK; -} |