summaryrefslogtreecommitdiff
path: root/source3/lib/util_unistr.c
diff options
context:
space:
mode:
authorJean-François Micouleau <jfm@samba.org>2000-12-15 09:31:56 +0000
committerJean-François Micouleau <jfm@samba.org>2000-12-15 09:31:56 +0000
commit89af6fd745a6f49668bae5b5c2d239d3671fb299 (patch)
tree2e6577a480a90d0aec83b39d94b1b68669dc4718 /source3/lib/util_unistr.c
parenta18ade3fe0e823ceb83de2078f8f7e23e6c4fcf2 (diff)
downloadsamba-89af6fd745a6f49668bae5b5c2d239d3671fb299.tar.gz
samba-89af6fd745a6f49668bae5b5c2d239d3671fb299.tar.bz2
samba-89af6fd745a6f49668bae5b5c2d239d3671fb299.zip
lib/util_unistr.c:
rewrote unistr2_to_ascii() to correct a bug seen on SGI boxes. rpc_parse/parse_misc.c: rpc_parse/parse_prs.c: rewrote of BUFFER5 handling to NOT byteswap when it was already in network byte order. rpc_parse/parse_samr.c: cleanup of samr_io_q_lookup_domain(), remove the over-parsing by 2 bytes. rpc_server/srv_lsa.c: UNISTR2 strings need to be NULL terminated to pleased W2K. rpc_server/srv_spoolss_nt.c: use snprintf instead of safe_strcpy as we want the string truncated at 32 chars. That should fix SUN and SGI box not able to act as printserver and the problem with joining from a W2K wks. J.F. (This used to be commit 69fe739303b105f2c488f266f13977da1b6b201d)
Diffstat (limited to 'source3/lib/util_unistr.c')
-rw-r--r--source3/lib/util_unistr.c43
1 files changed, 21 insertions, 22 deletions
diff --git a/source3/lib/util_unistr.c b/source3/lib/util_unistr.c
index 74ecc841d0..5e86d5db0b 100644
--- a/source3/lib/util_unistr.c
+++ b/source3/lib/util_unistr.c
@@ -282,38 +282,37 @@ void unistr_to_ascii(char *dest, const uint16 *src, int len)
void unistr2_to_ascii(char *dest, const UNISTR2 *str, size_t maxlen)
{
- char *destend;
- const uint16 *src;
+ char *p;
+ uint16 *src;
size_t len;
- register uint16 c;
+ int i;
+
+ if (str == NULL) {
+ *dest='\0';
+ return;
+ }
src = str->buffer;
len = MIN(str->uni_str_len, maxlen);
- destend = dest + len;
- while (dest < destend)
- {
- uint16 ucs2_val;
- uint16 cp_val;
+ if (len == 0) {
+ *dest='\0';
+ return;
+ }
+
+ for (p = dest; *src && p-dest < len; src++) {
+ uint16 ucs2_val = SVAL(src,0);
+ uint16 cp_val = ucs2_to_doscp[ucs2_val];
- c = *src;
- if (c == 0)
- {
- break;
- }
-
- ucs2_val = SVAL(src++,0);
- cp_val = ucs2_to_doscp[ucs2_val];
-
if (cp_val < 256)
- *(dest++) = (char)cp_val;
+ *p++ = (char)cp_val;
else {
- *dest= (cp_val >> 8) & 0xff;
- *(dest++) = (cp_val & 0xff);
+ *p = (cp_val >> 8) & 0xff;
+ *p++ = (cp_val & 0xff);
}
}
-
- *dest = 0;
+
+ *p = 0;
}