summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGerald Carter <jerry@samba.org>2000-08-04 12:42:19 +0000
committerGerald Carter <jerry@samba.org>2000-08-04 12:42:19 +0000
commit394795e28b00eb95759938770cd24ee7c75ed39d (patch)
tree7a1f8e5b5df2b88259a06248df4b14b6cc9a1884
parent553579bf6fd7c9dfecddddc1f6272b523bce69d9 (diff)
downloadsamba-394795e28b00eb95759938770cd24ee7c75ed39d.tar.gz
samba-394795e28b00eb95759938770cd24ee7c75ed39d.tar.bz2
samba-394795e28b00eb95759938770cd24ee7c75ed39d.zip
After talking with Jeremy and JF (and staring at packet traces between
NT <-> NT), I've come to realize that UNISTR2 strings should be NULL terminated. jerry (This used to be commit c8f9e54beafcb0c0668f1510e7693dbf22485aa8)
-rw-r--r--source3/include/rpc_misc.h4
-rw-r--r--source3/rpc_parse/parse_misc.c54
2 files changed, 55 insertions, 3 deletions
diff --git a/source3/include/rpc_misc.h b/source3/include/rpc_misc.h
index 6e585e7a0e..6fb2d63ed4 100644
--- a/source3/include/rpc_misc.h
+++ b/source3/include/rpc_misc.h
@@ -171,7 +171,9 @@ typedef struct unistr2_info
uint32 uni_max_len;
uint32 undoc;
uint32 uni_str_len;
- /* unicode characters. ***MUST*** be little-endian. **NOT** necessarily null-terminated */
+ /* unicode characters. ***MUST*** be little-endian.
+ **must** be null-terminated and the uni_str_len should include
+ the NULL character */
uint16 *buffer;
} UNISTR2;
diff --git a/source3/rpc_parse/parse_misc.c b/source3/rpc_parse/parse_misc.c
index 276e66a113..c0b700c908 100644
--- a/source3/rpc_parse/parse_misc.c
+++ b/source3/rpc_parse/parse_misc.c
@@ -852,14 +852,14 @@ void init_unistr2(UNISTR2 *str, const char *buf, size_t len)
str->undoc = 0;
str->uni_str_len = (uint32)len;
- if (!parse_misc_talloc)
+ if (!parse_misc_talloc)
parse_misc_talloc = talloc_init();
if (len < MAX_UNISTRLEN)
len = MAX_UNISTRLEN;
len *= sizeof(uint16);
- str->buffer = (uint16 *)talloc(parse_misc_talloc, len);
+ str->buffer = (uint16 *)talloc(parse_misc_talloc, len);
if (str->buffer == NULL)
smb_panic("init_unistr2: malloc fail\n");
@@ -868,6 +868,56 @@ void init_unistr2(UNISTR2 *str, const char *buf, size_t len)
}
/*******************************************************************
+ Inits a UNISTR2 structure from a UNISTR
+********************************************************************/
+void init_unistr2_from_unistr (UNISTR2 *to, UNISTR *from)
+{
+
+ BOOL found;
+ uint32 i = 0;
+
+ if ((to == NULL) || (from == NULL) || (from->buffer == NULL))
+ return;
+
+ ZERO_STRUCTP (to);
+
+ /* get the length; UNISTR **are** NULL terminated */
+ found = False;
+ while (!found)
+ {
+ if ((from->buffer)[i]=='\0' && (from->buffer)[(2*i)+1]=='\0')
+ found = True;
+ else
+ i++;
+ }
+ i++;
+
+ if (!found)
+ {
+ DEBUG(0,("init_unistr2_from_unistr: non-null terminiated UNISTR!\n"));
+ return;
+ }
+
+ /* set up string lengths. */
+ to->uni_max_len = i;
+ to->undoc = 0;
+ to->uni_str_len = i;
+
+ if (!parse_misc_talloc)
+ parse_misc_talloc = talloc_init();
+
+ to->buffer = (uint16 *)talloc(parse_misc_talloc, sizeof(uint16)*(to->uni_str_len));
+ if (to->buffer == NULL)
+ smb_panic("init_unistr2_from_unistr: malloc fail\n");
+
+ for (i=0; i < to->uni_str_len; i++)
+ to->buffer[i] = from->buffer[i];
+
+ return;
+}
+
+
+/*******************************************************************
Reads or writes a UNISTR2 structure.
XXXX NOTE: UNISTR2 structures need NOT be null-terminated.
the uni_str_len member tells you how long the string is;