diff options
author | Andrew Bartlett <abartlet@samba.org> | 2001-07-10 17:02:02 +0000 |
---|---|---|
committer | Andrew Bartlett <abartlet@samba.org> | 2001-07-10 17:02:02 +0000 |
commit | e4b6f641e8590b385672e12f4a2829c69e2d33aa (patch) | |
tree | 076872ef154e69c2aa61685d4a6a9dbd0c623822 /source3/rpc_parse/parse_misc.c | |
parent | 973a78c2db1e15fc0a88b15d8857a8d7cf46a140 (diff) | |
download | samba-e4b6f641e8590b385672e12f4a2829c69e2d33aa.tar.gz samba-e4b6f641e8590b385672e12f4a2829c69e2d33aa.tar.bz2 samba-e4b6f641e8590b385672e12f4a2829c69e2d33aa.zip |
This fixes security=domain, which has been broke since the big charset
changeover. For my own sainity I have created a new function to fill out both
the header and buffer for a string in an RPC struct. This DOES NOT take a
length argument, only the actual string to be placed.
The RPC code is currently littered with code that does init_uni_hdr() followed
immidiatly by init_unistr2(), and often the length argument is wrong. (It was
for the code I changed, even before the charset stuff). Another bug where we
made strings AT LEAST MAX_UNICODE_LEN long hid this bug.
This works for loopback connections to Samba, and can't be any more broke than
it was before :-). (We had double and revese conversions, fun...).
In particular this makes us multibyte complient.
In any case, if there are no objections I will slowly convert other bits of
code to the same system.
(This used to be commit cf1d1cd9d6362f6e32ed9c2f6d2f6f25c47705ad)
Diffstat (limited to 'source3/rpc_parse/parse_misc.c')
-rw-r--r-- | source3/rpc_parse/parse_misc.c | 54 |
1 files changed, 54 insertions, 0 deletions
diff --git a/source3/rpc_parse/parse_misc.c b/source3/rpc_parse/parse_misc.c index 857f964e31..d4754f5e9a 100644 --- a/source3/rpc_parse/parse_misc.c +++ b/source3/rpc_parse/parse_misc.c @@ -5,6 +5,7 @@ * Copyright (C) Andrew Tridgell 1992-1997, * Copyright (C) Luke Kenneth Casson Leighton 1996-1997, * Copyright (C) Paul Ashton 1997. + * Copyright (C) Andrew Bartlett 2001. * * 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 @@ -921,6 +922,59 @@ void init_unistr2(UNISTR2 *str, const char *buf, size_t len) } /******************************************************************* + Inits a UNIHDR and UNISTR2 structure at one time. +********************************************************************/ + +void init_unistr2_and_hdr(UNISTR2 *str, UNIHDR *hdr, const char *buf ) +{ + size_t convbuf_len_bytes, len_bytes; + int len; + + uint16 *conversion_buffer; + + if (buf == NULL) { + str->buffer = NULL; + hdr->uni_str_len = 0; + hdr->uni_max_len = 0; + hdr->buffer = 0; + return; + } + + convbuf_len_bytes = (sizeof(uint16)*(strlen(buf) + 1)); + /* Our strings cannot expand from internal to unicode by more + than a factor of 2 */ + + conversion_buffer = malloc(convbuf_len_bytes); + if (conversion_buffer == NULL) + smb_panic("init_unistr: malloc fail\n"); + + /* Check this */ + + len_bytes = rpcstr_push(conversion_buffer, buf, convbuf_len_bytes, STR_TERMINATE); + + len = len_bytes/sizeof(uint16); + + if (len > MAX_UNISTRLEN) { + len = MAX_UNISTRLEN; + } + + str->buffer = (uint16 *)talloc_zero(get_talloc_ctx(), len*sizeof(uint16)); + if (str->buffer == NULL) + smb_panic("init_unistr: talloc fail\n"); + + hdr->uni_str_len = len; + hdr->uni_max_len = len; + + hdr->buffer = 1; + + str->uni_str_len = len; + str->uni_max_len = len; + memcpy(str->buffer, conversion_buffer, len*sizeof(uint16)); + + free(conversion_buffer); +} + +/******************************************************************* Inits a UNISTR2 structure from a UNISTR ********************************************************************/ void init_unistr2_from_unistr (UNISTR2 *to, UNISTR *from) |