ndr: add ndr_pull_charset_to_null()
authorDavid Disseldorp <ddiss@suse.de>
Sat, 14 Jan 2012 00:32:59 +0000 (16:32 -0800)
committerKarolin Seeger <kseeger@samba.org>
Mon, 16 Jan 2012 19:47:39 +0000 (20:47 +0100)
The same as ndr_pull_charset(), however only perform character
conversion on bytes prior to and including the null terminator.

Signed-off-by: Jeremy Allison <jra@samba.org>
librpc/ndr/libndr.h
librpc/ndr/ndr_string.c

index 8c59bb9bb0693fc5ea60da924a91459cdc5a1cce..f4b7db9ae3f43352aaa3c015fc183d12d60d29ab 100644 (file)
@@ -568,6 +568,7 @@ size_t ndr_size_string_array(const char **a, uint32_t count, int flags);
 uint32_t ndr_string_length(const void *_var, uint32_t element_size);
 enum ndr_err_code ndr_check_string_terminator(struct ndr_pull *ndr, uint32_t count, uint32_t element_size);
 enum ndr_err_code ndr_pull_charset(struct ndr_pull *ndr, int ndr_flags, const char **var, uint32_t length, uint8_t byte_mul, charset_t chset);
+enum ndr_err_code ndr_pull_charset_to_null(struct ndr_pull *ndr, int ndr_flags, const char **var, uint32_t length, uint8_t byte_mul, charset_t chset);
 enum ndr_err_code ndr_push_charset(struct ndr_push *ndr, int ndr_flags, const char *var, uint32_t length, uint8_t byte_mul, charset_t chset);
 
 /* GUIDs */
index d750e2c15a0c6d66c4e1b682697b32609fe53b18..b917d65b199efc275d4af27c903d93ed5d0306ef 100644 (file)
@@ -694,6 +694,38 @@ _PUBLIC_ enum ndr_err_code ndr_pull_charset(struct ndr_pull *ndr, int ndr_flags,
        return NDR_ERR_SUCCESS;
 }
 
+_PUBLIC_ enum ndr_err_code ndr_pull_charset_to_null(struct ndr_pull *ndr, int ndr_flags, const char **var, uint32_t length, uint8_t byte_mul, charset_t chset)
+{
+       size_t converted_size;
+       uint32_t str_len;
+
+       if (length == 0) {
+               *var = talloc_strdup(ndr->current_mem_ctx, "");
+               return NDR_ERR_SUCCESS;
+       }
+
+       if (NDR_BE(ndr) && chset == CH_UTF16) {
+               chset = CH_UTF16BE;
+       }
+
+       NDR_PULL_NEED_BYTES(ndr, length*byte_mul);
+
+       str_len = ndr_string_length(ndr->data+ndr->offset, byte_mul);
+       str_len = MIN(str_len, length); /* overrun protection */
+
+       if (!convert_string_talloc(ndr->current_mem_ctx, chset, CH_UNIX,
+                                  ndr->data+ndr->offset, str_len*byte_mul,
+                                  discard_const_p(void *, var),
+                                  &converted_size, false))
+       {
+               return ndr_pull_error(ndr, NDR_ERR_CHARCNV,
+                                     "Bad character conversion");
+       }
+       NDR_CHECK(ndr_pull_advance(ndr, length*byte_mul));
+
+       return NDR_ERR_SUCCESS;
+}
+
 _PUBLIC_ enum ndr_err_code ndr_push_charset(struct ndr_push *ndr, int ndr_flags, const char *var, uint32_t length, uint8_t byte_mul, charset_t chset)
 {
        ssize_t ret, required;