diff options
author | Stefan Metzmacher <metze@samba.org> | 2004-11-02 13:46:39 +0000 |
---|---|---|
committer | Gerald (Jerry) Carter <jerry@samba.org> | 2007-10-10 13:05:21 -0500 |
commit | a2fd2488c79902dfe1de764bea4f619ec6107fed (patch) | |
tree | b0018bafa465de3b55acfd4db4bc9143ebce16c4 /source4/librpc/ndr/ndr_basic.c | |
parent | 34c9263ed0ffc591e8313981085791b660ccfe26 (diff) | |
download | samba-a2fd2488c79902dfe1de764bea4f619ec6107fed.tar.gz samba-a2fd2488c79902dfe1de764bea4f619ec6107fed.tar.bz2 samba-a2fd2488c79902dfe1de764bea4f619ec6107fed.zip |
r3484: - add support for conformant string arrays at the end of a struct
- add support for strings where the length excludes the NULLTERM
metze
(This used to be commit 8251d8b3e5af351972aa41aed63f7a7d2640910e)
Diffstat (limited to 'source4/librpc/ndr/ndr_basic.c')
-rw-r--r-- | source4/librpc/ndr/ndr_basic.c | 55 |
1 files changed, 50 insertions, 5 deletions
diff --git a/source4/librpc/ndr/ndr_basic.c b/source4/librpc/ndr/ndr_basic.c index 95d8c28e75..84c4ab9ddc 100644 --- a/source4/librpc/ndr/ndr_basic.c +++ b/source4/librpc/ndr/ndr_basic.c @@ -522,6 +522,9 @@ NTSTATUS ndr_pull_string(struct ndr_pull *ndr, int ndr_flags, const char **s) flags &= ~LIBNDR_FLAG_STR_ASCII; } + flags &= ~LIBNDR_FLAG_STR_CONFORMANT; + flags &= ~LIBNDR_FLAG_STR_CHARLEN; + switch (flags & LIBNDR_STRING_FLAGS) { case LIBNDR_FLAG_STR_LEN4|LIBNDR_FLAG_STR_SIZE4: case LIBNDR_FLAG_STR_LEN4|LIBNDR_FLAG_STR_SIZE4|LIBNDR_FLAG_STR_NOTERM: @@ -740,6 +743,7 @@ NTSTATUS ndr_push_string(struct ndr_push *ndr, int ndr_flags, const char *s) int chset = CH_UTF16; unsigned flags = ndr->flags; unsigned byte_mul = 2; + unsigned c_len_term = 1; if (!(ndr_flags & NDR_SCALARS)) { return NT_STATUS_OK; @@ -758,11 +762,18 @@ NTSTATUS ndr_push_string(struct ndr_push *ndr, int ndr_flags, const char *s) flags &= ~LIBNDR_FLAG_STR_ASCII; } + flags &= ~LIBNDR_FLAG_STR_CONFORMANT; + + if (flags & LIBNDR_FLAG_STR_CHARLEN) { + c_len_term = 0; + flags &= ~LIBNDR_FLAG_STR_CHARLEN; + } + switch (flags & LIBNDR_STRING_FLAGS) { case LIBNDR_FLAG_STR_LEN4|LIBNDR_FLAG_STR_SIZE4: - NDR_CHECK(ndr_push_uint32(ndr, c_len+1)); + NDR_CHECK(ndr_push_uint32(ndr, c_len+c_len_term)); NDR_CHECK(ndr_push_uint32(ndr, 0)); - NDR_CHECK(ndr_push_uint32(ndr, c_len+1)); + NDR_CHECK(ndr_push_uint32(ndr, c_len+c_len_term)); NDR_PUSH_NEED_BYTES(ndr, byte_mul*(c_len+1)); ret = convert_string(CH_UNIX, chset, s, s_len+1, @@ -792,7 +803,7 @@ NTSTATUS ndr_push_string(struct ndr_push *ndr, int ndr_flags, const char *s) case LIBNDR_FLAG_STR_LEN4: NDR_CHECK(ndr_push_uint32(ndr, 0)); - NDR_CHECK(ndr_push_uint32(ndr, c_len + 1)); + NDR_CHECK(ndr_push_uint32(ndr, c_len + c_len_term)); NDR_PUSH_NEED_BYTES(ndr, byte_mul*(c_len+1)); ret = convert_string(CH_UNIX, chset, s, s_len + 1, @@ -805,7 +816,7 @@ NTSTATUS ndr_push_string(struct ndr_push *ndr, int ndr_flags, const char *s) break; case LIBNDR_FLAG_STR_SIZE4: - NDR_CHECK(ndr_push_uint32(ndr, c_len + 1)); + NDR_CHECK(ndr_push_uint32(ndr, c_len + c_len_term)); NDR_PUSH_NEED_BYTES(ndr, byte_mul*(c_len+1)); ret = convert_string(CH_UNIX, chset, s, s_len + 1, @@ -818,7 +829,7 @@ NTSTATUS ndr_push_string(struct ndr_push *ndr, int ndr_flags, const char *s) break; case LIBNDR_FLAG_STR_SIZE2: - NDR_CHECK(ndr_push_uint16(ndr, c_len + 1)); + NDR_CHECK(ndr_push_uint16(ndr, c_len + c_len_term)); NDR_PUSH_NEED_BYTES(ndr, byte_mul*(c_len+1)); ret = convert_string(CH_UNIX, chset, s, s_len + 1, @@ -876,6 +887,40 @@ NTSTATUS ndr_push_string(struct ndr_push *ndr, int ndr_flags, const char *s) } /* + push a general string onto the wire +*/ +size_t ndr_string_array_size(struct ndr_push *ndr, const char *s) +{ + size_t c_len; + unsigned flags = ndr->flags; + unsigned byte_mul = 2; + unsigned c_len_term = 1; + + if (flags & LIBNDR_FLAG_STR_FIXLEN32) { + return 32; + } + + c_len = s?strlen_m(s):0; + + if (flags & LIBNDR_FLAG_STR_ASCII) { + byte_mul = 1; + } + + if (flags & LIBNDR_FLAG_STR_NOTERM) { + c_len_term = 0; + } + + c_len = c_len + c_len_term; + + if (flags & LIBNDR_FLAG_STR_BYTESIZE) { + c_len = c_len * byte_mul; + } + + return c_len; +} + + +/* push a NTTIME */ NTSTATUS ndr_push_NTTIME(struct ndr_push *ndr, NTTIME t) |