2 * Unix SMB/CIFS implementation.
3 * RPC Pipe client / server routines
4 * Copyright (C) Andrew Tridgell 1992-1997,
5 * Copyright (C) Luke Kenneth Casson Leighton 1996-1997,
6 * Copyright (C) Paul Ashton 1997.
7 * Copyright (C) Gerald (Jerry) Carter 2005
9 * This program is free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License as published by
11 * the Free Software Foundation; either version 2 of the License, or
12 * (at your option) any later version.
14 * This program is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 * GNU General Public License for more details.
19 * You should have received a copy of the GNU General Public License
20 * along with this program; if not, write to the Free Software
21 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
27 #define DBGC_CLASS DBGC_RPC_PARSE
29 /****************************************************************************
30 A temporary TALLOC context for things like unistrs, that is valid for
31 the life of a complete RPC call.
32 ****************************************************************************/
34 static TALLOC_CTX *current_rpc_talloc = NULL;
36 static TALLOC_CTX *get_current_rpc_talloc(void)
38 return current_rpc_talloc;
41 void set_current_rpc_talloc( TALLOC_CTX *ctx)
43 current_rpc_talloc = ctx;
46 static TALLOC_CTX *main_loop_talloc = NULL;
48 /*******************************************************************
49 free up temporary memory - called from the main loop
50 ********************************************************************/
52 void main_loop_TALLOC_FREE(void)
54 if (!main_loop_talloc)
56 talloc_destroy(main_loop_talloc);
57 main_loop_talloc = NULL;
60 /*******************************************************************
61 Get a talloc context that is freed in the main loop...
62 ********************************************************************/
64 TALLOC_CTX *main_loop_talloc_get(void)
66 if (!main_loop_talloc) {
67 main_loop_talloc = talloc_init("main loop talloc (mainly parse_misc)");
68 if (!main_loop_talloc)
69 smb_panic("main_loop_talloc: malloc fail\n");
72 return main_loop_talloc;
75 /*******************************************************************
76 Try and get a talloc context. Get the rpc one if possible, else
77 get the main loop one. The main loop one is more dangerous as it
78 goes away between packets, the rpc one will stay around for as long
79 as a current RPC lasts.
80 ********************************************************************/
82 TALLOC_CTX *get_talloc_ctx(void)
84 TALLOC_CTX *tc = get_current_rpc_talloc();
88 return main_loop_talloc_get();
91 /*******************************************************************
92 Reads or writes a UTIME type.
93 ********************************************************************/
95 static BOOL smb_io_utime(const char *desc, UTIME *t, prs_struct *ps, int depth)
100 prs_debug(ps, depth, desc, "smb_io_utime");
106 if(!prs_uint32 ("time", ps, depth, &t->time))
112 /*******************************************************************
113 Reads or writes an NTTIME structure.
114 ********************************************************************/
116 BOOL smb_io_time(const char *desc, NTTIME *nttime, prs_struct *ps, int depth)
122 prs_debug(ps, depth, desc, "smb_io_time");
128 if (MARSHALLING(ps)) {
129 low = *nttime & 0xFFFFFFFF;
130 high = *nttime >> 32;
133 if(!prs_uint32("low ", ps, depth, &low)) /* low part */
135 if(!prs_uint32("high", ps, depth, &high)) /* high part */
138 if (UNMARSHALLING(ps)) {
139 *nttime = (((uint64_t)high << 32) + low);
145 /*******************************************************************
146 Reads or writes an NTTIME structure.
147 ********************************************************************/
149 BOOL smb_io_nttime(const char *desc, prs_struct *ps, int depth, NTTIME *nttime)
151 return smb_io_time( desc, nttime, ps, depth );
154 /*******************************************************************
155 Reads or writes a DOM_SID structure.
156 ********************************************************************/
158 BOOL smb_io_dom_sid(const char *desc, DOM_SID *sid, prs_struct *ps, int depth)
165 prs_debug(ps, depth, desc, "smb_io_dom_sid");
168 if(!prs_uint8 ("sid_rev_num", ps, depth, &sid->sid_rev_num))
171 if(!prs_uint8 ("num_auths ", ps, depth, &sid->num_auths))
174 for (i = 0; i < 6; i++)
177 slprintf(tmp, sizeof(tmp) - 1, "id_auth[%d] ", i);
178 if(!prs_uint8 (tmp, ps, depth, &sid->id_auth[i]))
182 /* oops! XXXX should really issue a warning here... */
183 if (sid->num_auths > MAXSUBAUTHS)
184 sid->num_auths = MAXSUBAUTHS;
186 if(!prs_uint32s(False, "sub_auths ", ps, depth, sid->sub_auths, sid->num_auths))
192 /*******************************************************************
193 Inits a DOM_SID2 structure.
194 ********************************************************************/
196 void init_dom_sid2(DOM_SID2 *sid2, const DOM_SID *sid)
199 sid2->num_auths = sid2->sid.num_auths;
202 /*******************************************************************
203 Reads or writes a DOM_SID2 structure.
204 ********************************************************************/
206 BOOL smb_io_dom_sid2_p(const char *desc, prs_struct *ps, int depth, DOM_SID2 **sid2)
210 /* caputure the pointer value to stream */
212 data_p = *sid2 ? 0xf000baaa : 0;
214 if ( !prs_uint32("dom_sid2_p", ps, depth, &data_p ))
217 /* we're done if there is no data */
222 if (UNMARSHALLING(ps)) {
223 if ( !(*sid2 = PRS_ALLOC_MEM(ps, DOM_SID2, 1)) )
229 /*******************************************************************
230 Reads or writes a DOM_SID2 structure.
231 ********************************************************************/
233 BOOL smb_io_dom_sid2(const char *desc, DOM_SID2 *sid, prs_struct *ps, int depth)
238 prs_debug(ps, depth, desc, "smb_io_dom_sid2");
244 if(!prs_uint32("num_auths", ps, depth, &sid->num_auths))
247 if(!smb_io_dom_sid("sid", &sid->sid, ps, depth))
253 /*******************************************************************
254 Reads or writes a struct GUID
255 ********************************************************************/
257 BOOL smb_io_uuid(const char *desc, struct GUID *uuid,
258 prs_struct *ps, int depth)
263 prs_debug(ps, depth, desc, "smb_io_uuid");
266 if(!prs_uint32 ("data ", ps, depth, &uuid->time_low))
268 if(!prs_uint16 ("data ", ps, depth, &uuid->time_mid))
270 if(!prs_uint16 ("data ", ps, depth, &uuid->time_hi_and_version))
273 if(!prs_uint8s (False, "data ", ps, depth, uuid->clock_seq, sizeof(uuid->clock_seq)))
275 if(!prs_uint8s (False, "data ", ps, depth, uuid->node, sizeof(uuid->node)))
281 /*******************************************************************
282 creates a STRHDR structure.
283 ********************************************************************/
285 void init_str_hdr(STRHDR *hdr, int max_len, int len, uint32 buffer)
287 hdr->str_max_len = max_len;
288 hdr->str_str_len = len;
289 hdr->buffer = buffer;
292 /*******************************************************************
293 Reads or writes a STRHDR structure.
294 ********************************************************************/
296 BOOL smb_io_strhdr(const char *desc, STRHDR *hdr, prs_struct *ps, int depth)
301 prs_debug(ps, depth, desc, "smb_io_strhdr");
306 if(!prs_uint16("str_str_len", ps, depth, &hdr->str_str_len))
308 if(!prs_uint16("str_max_len", ps, depth, &hdr->str_max_len))
310 if(!prs_uint32("buffer ", ps, depth, &hdr->buffer))
316 /*******************************************************************
317 Inits a UNIHDR structure.
318 ********************************************************************/
320 void init_uni_hdr(UNIHDR *hdr, UNISTR2 *str2)
322 hdr->uni_str_len = 2 * (str2->uni_str_len);
323 hdr->uni_max_len = 2 * (str2->uni_max_len);
324 hdr->buffer = (str2->uni_str_len != 0) ? 1 : 0;
327 /*******************************************************************
328 Reads or writes a UNIHDR structure.
329 ********************************************************************/
331 BOOL smb_io_unihdr(const char *desc, UNIHDR *hdr, prs_struct *ps, int depth)
336 prs_debug(ps, depth, desc, "smb_io_unihdr");
342 if(!prs_uint16("uni_str_len", ps, depth, &hdr->uni_str_len))
344 if(!prs_uint16("uni_max_len", ps, depth, &hdr->uni_max_len))
346 if(!prs_uint32("buffer ", ps, depth, &hdr->buffer))
352 /*******************************************************************
353 Inits a BUFHDR structure.
354 ********************************************************************/
356 void init_buf_hdr(BUFHDR *hdr, int max_len, int len)
358 hdr->buf_max_len = max_len;
362 /*******************************************************************
363 prs_uint16 wrapper. Call this and it sets up a pointer to where the
364 uint16 should be stored, or gets the size if reading.
365 ********************************************************************/
367 BOOL smb_io_hdrbuf_pre(const char *desc, BUFHDR *hdr, prs_struct *ps, int depth, uint32 *offset)
369 (*offset) = prs_offset(ps);
374 if(!smb_io_hdrbuf(desc, hdr, ps, depth))
381 if(!prs_set_offset(ps, prs_offset(ps) + (sizeof(uint32) * 2)))
388 /*******************************************************************
389 smb_io_hdrbuf wrapper. Call this and it retrospectively stores the size.
390 Does nothing on reading, as that is already handled by ...._pre()
391 ********************************************************************/
393 BOOL smb_io_hdrbuf_post(const char *desc, BUFHDR *hdr, prs_struct *ps, int depth,
394 uint32 ptr_hdrbuf, uint32 max_len, uint32 len)
397 /* writing: go back and do a retrospective job. i hate this */
399 uint32 old_offset = prs_offset(ps);
401 init_buf_hdr(hdr, max_len, len);
402 if(!prs_set_offset(ps, ptr_hdrbuf))
404 if(!smb_io_hdrbuf(desc, hdr, ps, depth))
407 if(!prs_set_offset(ps, old_offset))
414 /*******************************************************************
415 Reads or writes a BUFHDR structure.
416 ********************************************************************/
418 BOOL smb_io_hdrbuf(const char *desc, BUFHDR *hdr, prs_struct *ps, int depth)
423 prs_debug(ps, depth, desc, "smb_io_hdrbuf");
429 if(!prs_uint32("buf_max_len", ps, depth, &hdr->buf_max_len))
431 if(!prs_uint32("buf_len ", ps, depth, &hdr->buf_len))
437 /*******************************************************************
438 Inits a UNISTR structure.
439 ********************************************************************/
441 void init_unistr(UNISTR *str, const char *buf)
450 len = strlen(buf) + 1;
453 str->buffer = TALLOC_ZERO_ARRAY(get_talloc_ctx(), uint16, len);
454 if (str->buffer == NULL)
455 smb_panic("init_unistr: malloc fail\n");
457 rpcstr_push(str->buffer, buf, len*sizeof(uint16), STR_TERMINATE);
463 /*******************************************************************
464 reads or writes a UNISTR structure.
465 XXXX NOTE: UNISTR structures NEED to be null-terminated.
466 ********************************************************************/
468 BOOL smb_io_unistr(const char *desc, UNISTR *uni, prs_struct *ps, int depth)
473 prs_debug(ps, depth, desc, "smb_io_unistr");
476 if(!prs_unistr("unistr", ps, depth, uni))
482 /*******************************************************************
483 Allocate the RPC_DATA_BLOB memory.
484 ********************************************************************/
486 size_t create_rpc_blob(RPC_DATA_BLOB *str, size_t len)
488 str->buffer = (uint8 *)TALLOC_ZERO(get_talloc_ctx(), len);
489 if (str->buffer == NULL)
490 smb_panic("create_rpc_blob: talloc fail\n");
494 /*******************************************************************
495 Inits a RPC_DATA_BLOB structure from a uint32
496 ********************************************************************/
498 void init_rpc_blob_uint32(RPC_DATA_BLOB *str, uint32 val)
502 /* set up string lengths. */
503 str->buf_len = create_rpc_blob(str, sizeof(uint32));
504 SIVAL(str->buffer, 0, val);
507 /*******************************************************************
508 Inits a RPC_DATA_BLOB structure.
509 ********************************************************************/
511 void init_rpc_blob_str(RPC_DATA_BLOB *str, const char *buf, int len)
515 /* set up string lengths. */
516 str->buf_len = create_rpc_blob(str, len*2);
517 rpcstr_push(str->buffer, buf, (size_t)str->buf_len, STR_TERMINATE);
521 /*******************************************************************
522 Inits a RPC_DATA_BLOB structure from a hex string.
523 ********************************************************************/
525 void init_rpc_blob_hex(RPC_DATA_BLOB *str, const char *buf)
528 str->buf_len = create_rpc_blob(str, strlen(buf));
529 str->buf_len = strhex_to_str((char *)str->buffer, str->buf_len, buf);
532 /*******************************************************************
533 Inits a RPC_DATA_BLOB structure.
534 ********************************************************************/
536 void init_rpc_blob_bytes(RPC_DATA_BLOB *str, uint8 *buf, size_t len)
540 /* max buffer size (allocated size) */
542 len = create_rpc_blob(str, len);
543 memcpy(str->buffer, buf, len);
548 /*******************************************************************
549 reads or writes a BUFFER5 structure.
550 the buf_len member tells you how large the buffer is.
551 ********************************************************************/
552 BOOL smb_io_buffer5(const char *desc, BUFFER5 *buf5, prs_struct *ps, int depth)
554 prs_debug(ps, depth, desc, "smb_io_buffer5");
557 if (buf5 == NULL) return False;
561 if(!prs_uint32("buf_len", ps, depth, &buf5->buf_len))
565 if(!prs_buffer5(True, "buffer" , ps, depth, buf5))
572 /*******************************************************************
573 Inits a REGVAL_BUFFER structure.
574 ********************************************************************/
576 void init_regval_buffer(REGVAL_BUFFER *str, const uint8 *buf, size_t len)
580 /* max buffer size (allocated size) */
581 str->buf_max_len = len;
583 str->buf_len = buf != NULL ? len : 0;
586 SMB_ASSERT(str->buf_max_len >= str->buf_len);
587 str->buffer = (uint16 *)TALLOC_ZERO(get_talloc_ctx(),
589 if (str->buffer == NULL)
590 smb_panic("init_regval_buffer: talloc fail\n");
591 memcpy(str->buffer, buf, str->buf_len);
595 /*******************************************************************
596 Reads or writes a REGVAL_BUFFER structure.
597 the uni_max_len member tells you how large the buffer is.
598 the uni_str_len member tells you how much of the buffer is really used.
599 ********************************************************************/
601 BOOL smb_io_regval_buffer(const char *desc, prs_struct *ps, int depth, REGVAL_BUFFER *buf2)
604 prs_debug(ps, depth, desc, "smb_io_regval_buffer");
610 if(!prs_uint32("buf_max_len", ps, depth, &buf2->buf_max_len))
612 if(!prs_uint32("offset ", ps, depth, &buf2->offset))
614 if(!prs_uint32("buf_len ", ps, depth, &buf2->buf_len))
617 /* buffer advanced by indicated length of string
618 NOT by searching for null-termination */
620 if(!prs_regval_buffer(True, "buffer ", ps, depth, buf2))
626 /*******************************************************************
627 creates a UNISTR2 structure: sets up the buffer, too
628 ********************************************************************/
630 void init_buf_unistr2(UNISTR2 *str, uint32 *ptr, const char *buf)
634 init_unistr2(str, buf, UNI_STR_TERMINATE);
637 init_unistr2(str, NULL, UNI_FLAGS_NONE);
642 /*******************************************************************
643 Copies a UNISTR2 structure.
644 ********************************************************************/
646 void copy_unistr2(UNISTR2 *str, const UNISTR2 *from)
648 if (from->buffer == NULL) {
653 SMB_ASSERT(from->uni_max_len >= from->uni_str_len);
655 str->uni_max_len = from->uni_max_len;
656 str->offset = from->offset;
657 str->uni_str_len = from->uni_str_len;
659 /* the string buffer is allocated to the maximum size
660 (the the length of the source string) to prevent
661 reallocation of memory. */
662 if (str->buffer == NULL) {
663 if (str->uni_max_len) {
664 str->buffer = (uint16 *)TALLOC_ZERO_ARRAY(get_talloc_ctx(), uint16, str->uni_max_len);
665 if ((str->buffer == NULL)) {
666 smb_panic("copy_unistr2: talloc fail\n");
669 /* copy the string */
670 memcpy(str->buffer, from->buffer, str->uni_max_len*sizeof(uint16));
677 /*******************************************************************
678 Creates a STRING2 structure.
679 ********************************************************************/
681 void init_string2(STRING2 *str, const char *buf, size_t max_len, size_t str_len)
683 /* set up string lengths. */
684 SMB_ASSERT(max_len >= str_len);
686 /* Ensure buf is valid if str_len was set. Coverity check. */
687 if (str_len && !buf) {
691 str->str_max_len = max_len;
693 str->str_str_len = str_len;
695 /* store the string */
697 str->buffer = (uint8 *)TALLOC_ZERO(get_talloc_ctx(),
699 if (str->buffer == NULL)
700 smb_panic("init_string2: malloc fail\n");
701 memcpy(str->buffer, buf, str_len);
705 /*******************************************************************
706 Reads or writes a STRING2 structure.
707 XXXX NOTE: STRING2 structures need NOT be null-terminated.
708 the str_str_len member tells you how long the string is;
709 the str_max_len member tells you how large the buffer is.
710 ********************************************************************/
712 BOOL smb_io_string2(const char *desc, STRING2 *str2, uint32 buffer, prs_struct *ps, int depth)
719 prs_debug(ps, depth, desc, "smb_io_string2");
725 if(!prs_uint32("str_max_len", ps, depth, &str2->str_max_len))
727 if(!prs_uint32("offset ", ps, depth, &str2->offset))
729 if(!prs_uint32("str_str_len", ps, depth, &str2->str_str_len))
732 /* buffer advanced by indicated length of string
733 NOT by searching for null-termination */
734 if(!prs_string2(True, "buffer ", ps, depth, str2))
739 prs_debug(ps, depth, desc, "smb_io_string2 - NULL");
741 memset((char *)str2, '\0', sizeof(*str2));
748 /*******************************************************************
749 Inits a UNISTR2 structure.
750 ********************************************************************/
752 void init_unistr2(UNISTR2 *str, const char *buf, enum unistr2_term_codes flags)
755 uint32 num_chars = 0;
758 /* We always null terminate the copy. */
759 len = strlen(buf) + 1;
760 if ( flags == UNI_STR_DBLTERMINATE )
764 if (buf == NULL || len == 0) {
765 /* no buffer -- nothing to do */
766 str->uni_max_len = 0;
768 str->uni_str_len = 0;
774 str->buffer = TALLOC_ZERO_ARRAY(get_talloc_ctx(), uint16, len);
775 if (str->buffer == NULL) {
776 smb_panic("init_unistr2: malloc fail\n");
780 /* Ensure len is the length in *bytes* */
781 len *= sizeof(uint16);
784 * The UNISTR2 must be initialized !!!
788 rpcstr_push((char *)str->buffer, buf, len, STR_TERMINATE);
789 num_chars = strlen_w(str->buffer);
790 if (flags == UNI_STR_TERMINATE || flags == UNI_MAXLEN_TERMINATE) {
793 if ( flags == UNI_STR_DBLTERMINATE )
797 str->uni_max_len = num_chars;
799 str->uni_str_len = num_chars;
800 if ( num_chars && ((flags == UNI_MAXLEN_TERMINATE) || (flags == UNI_BROKEN_NON_NULL)) )
804 /*******************************************************************
805 Inits a UNISTR4 structure.
806 ********************************************************************/
808 void init_unistr4(UNISTR4 *uni4, const char *buf, enum unistr2_term_codes flags)
810 uni4->string = TALLOC_P( get_talloc_ctx(), UNISTR2 );
812 smb_panic("init_unistr4: talloc fail\n");
815 init_unistr2( uni4->string, buf, flags );
817 uni4->length = 2 * (uni4->string->uni_str_len);
818 uni4->size = 2 * (uni4->string->uni_max_len);
821 void init_unistr4_w( TALLOC_CTX *ctx, UNISTR4 *uni4, const smb_ucs2_t *buf )
823 uni4->string = TALLOC_P( ctx, UNISTR2 );
825 smb_panic("init_unistr4_w: talloc fail\n");
828 init_unistr2_w( ctx, uni4->string, buf );
830 uni4->length = 2 * (uni4->string->uni_str_len);
831 uni4->size = 2 * (uni4->string->uni_max_len);
835 * Inits a UNISTR2 structure.
836 * @param ctx talloc context to allocate string on
837 * @param str pointer to string to create
838 * @param buf UCS2 null-terminated buffer to init from
841 void init_unistr2_w(TALLOC_CTX *ctx, UNISTR2 *str, const smb_ucs2_t *buf)
843 uint32 len = buf ? strlen_w(buf) : 0;
847 /* set up string lengths. */
848 str->uni_max_len = len;
850 str->uni_str_len = len;
853 str->buffer = TALLOC_ZERO_ARRAY(ctx, uint16, len + 1);
854 if (str->buffer == NULL) {
855 smb_panic("init_unistr2_w: talloc fail\n");
863 * don't move this test above ! The UNISTR2 must be initialized !!!
869 /* Yes, this is a strncpy( foo, bar, strlen(bar)) - but as
870 long as the buffer above is talloc()ed correctly then this
871 is the correct thing to do */
873 strncpy_w(str->buffer, buf, len + 1);
877 /*******************************************************************
878 Inits a UNISTR2 structure from a UNISTR
879 ********************************************************************/
881 void init_unistr2_from_unistr(UNISTR2 *to, const UNISTR *from)
885 /* the destination UNISTR2 should never be NULL.
886 if it is it is a programming error */
888 /* if the source UNISTR is NULL, then zero out
889 the destination string and return */
891 if ((from == NULL) || (from->buffer == NULL))
894 /* get the length; UNISTR must be NULL terminated */
896 while ((from->buffer)[i]!='\0')
898 i++; /* one more to catch the terminating NULL */
899 /* is this necessary -- jerry? I need to think */
901 /* set up string lengths; uni_max_len is set to i+1
902 because we need to account for the final NULL termination */
907 /* allocate the space and copy the string buffer */
909 to->buffer = TALLOC_ZERO_ARRAY(get_talloc_ctx(), uint16, i);
910 if (to->buffer == NULL)
911 smb_panic("init_unistr2_from_unistr: malloc fail\n");
912 memcpy(to->buffer, from->buffer, i*sizeof(uint16));
919 /*******************************************************************
920 Inits a UNISTR2 structure from a DATA_BLOB.
921 The length of the data_blob must count the bytes of the buffer.
922 Copies the blob data.
923 ********************************************************************/
925 void init_unistr2_from_datablob(UNISTR2 *str, DATA_BLOB *blob)
927 /* Allocs the unistring */
928 init_unistr2(str, NULL, UNI_FLAGS_NONE);
930 /* Sets the values */
931 str->uni_str_len = blob->length / sizeof(uint16);
932 str->uni_max_len = str->uni_str_len;
935 str->buffer = (uint16 *) memdup(blob->data, blob->length);
939 if ((str->buffer == NULL) && (blob->length > 0)) {
940 smb_panic("init_unistr2_from_datablob: malloc fail\n");
944 /*******************************************************************
945 UNISTR2* are a little different in that the pointer and the UNISTR2
946 are not necessarily read/written back to back. So we break it up
947 into 2 separate functions.
948 See SPOOL_USER_1 in include/rpc_spoolss.h for an example.
949 ********************************************************************/
951 BOOL prs_io_unistr2_p(const char *desc, prs_struct *ps, int depth, UNISTR2 **uni2)
955 /* caputure the pointer value to stream */
957 data_p = *uni2 ? 0xf000baaa : 0;
959 if ( !prs_uint32("ptr", ps, depth, &data_p ))
962 /* we're done if there is no data */
967 if (UNMARSHALLING(ps)) {
968 if ( !(*uni2 = PRS_ALLOC_MEM(ps, UNISTR2, 1)) )
975 /*******************************************************************
976 now read/write the actual UNISTR2. Memory for the UNISTR2 (but
977 not UNISTR2.buffer) has been allocated previously by prs_unistr2_p()
978 ********************************************************************/
980 BOOL prs_io_unistr2(const char *desc, prs_struct *ps, int depth, UNISTR2 *uni2 )
982 /* just return true if there is no pointer to deal with.
983 the memory must have been previously allocated on unmarshalling
984 by prs_unistr2_p() */
989 /* just pass off to smb_io_unstr2() passing the uni2 address as
990 the pointer (like you would expect) */
992 return smb_io_unistr2( desc, uni2, uni2 ? 1 : 0, ps, depth );
995 /*******************************************************************
996 Reads or writes a UNISTR2 structure.
997 XXXX NOTE: UNISTR2 structures need NOT be null-terminated.
998 the uni_str_len member tells you how long the string is;
999 the uni_max_len member tells you how large the buffer is.
1000 ********************************************************************/
1002 BOOL smb_io_unistr2(const char *desc, UNISTR2 *uni2, uint32 buffer, prs_struct *ps, int depth)
1009 prs_debug(ps, depth, desc, "smb_io_unistr2");
1015 if(!prs_uint32("uni_max_len", ps, depth, &uni2->uni_max_len))
1017 if(!prs_uint32("offset ", ps, depth, &uni2->offset))
1019 if(!prs_uint32("uni_str_len", ps, depth, &uni2->uni_str_len))
1022 /* buffer advanced by indicated length of string
1023 NOT by searching for null-termination */
1024 if(!prs_unistr2(True, "buffer ", ps, depth, uni2))
1029 prs_debug(ps, depth, desc, "smb_io_unistr2 - NULL");
1031 memset((char *)uni2, '\0', sizeof(*uni2));
1038 /*******************************************************************
1039 now read/write UNISTR4
1040 ********************************************************************/
1042 BOOL prs_unistr4(const char *desc, prs_struct *ps, int depth, UNISTR4 *uni4)
1045 prs_debug(ps, depth, desc, "prs_unistr4");
1048 if ( !prs_uint16("length", ps, depth, &uni4->length ))
1050 if ( !prs_uint16("size", ps, depth, &uni4->size ))
1055 if ( !prs_pointer( desc, ps, depth, &ptr, sizeof(UNISTR2), (PRS_POINTER_CAST)prs_io_unistr2 ) )
1058 uni4->string = (UNISTR2 *)ptr;
1063 /*******************************************************************
1064 now read/write UNISTR4 header
1065 ********************************************************************/
1067 BOOL prs_unistr4_hdr(const char *desc, prs_struct *ps, int depth, UNISTR4 *uni4)
1069 prs_debug(ps, depth, desc, "prs_unistr4_hdr");
1072 if ( !prs_uint16("length", ps, depth, &uni4->length) )
1074 if ( !prs_uint16("size", ps, depth, &uni4->size) )
1076 if ( !prs_io_unistr2_p(desc, ps, depth, &uni4->string) )
1082 /*******************************************************************
1083 now read/write UNISTR4 string
1084 ********************************************************************/
1086 BOOL prs_unistr4_str(const char *desc, prs_struct *ps, int depth, UNISTR4 *uni4)
1088 prs_debug(ps, depth, desc, "prs_unistr4_str");
1091 if ( !prs_io_unistr2(desc, ps, depth, uni4->string) )
1097 /*******************************************************************
1098 Reads or writes a UNISTR4_ARRAY structure.
1099 ********************************************************************/
1101 BOOL prs_unistr4_array(const char *desc, prs_struct *ps, int depth, UNISTR4_ARRAY *array )
1105 prs_debug(ps, depth, desc, "prs_unistr4_array");
1108 if(!prs_uint32("count", ps, depth, &array->count))
1111 if (UNMARSHALLING(ps)) {
1113 if ( !(array->strings = TALLOC_ZERO_ARRAY( get_talloc_ctx(), UNISTR4, array->count)) )
1116 array->strings = NULL;
1120 /* write the headers and then the actual string buffer */
1122 for ( i=0; i<array->count; i++ ) {
1123 if ( !prs_unistr4_hdr( "string", ps, depth, &array->strings[i]) )
1127 for (i=0;i<array->count;i++) {
1128 if ( !prs_unistr4_str("string", ps, depth, &array->strings[i]) )
1135 /********************************************************************
1136 initialise a UNISTR_ARRAY from a char**
1137 ********************************************************************/
1139 BOOL init_unistr4_array( UNISTR4_ARRAY *array, uint32 count, const char **strings )
1143 array->count = count;
1145 /* allocate memory for the array of UNISTR4 objects */
1148 if ( !(array->strings = TALLOC_ZERO_ARRAY(get_talloc_ctx(), UNISTR4, count )) )
1151 array->strings = NULL;
1154 for ( i=0; i<count; i++ )
1155 init_unistr4( &array->strings[i], strings[i], UNI_STR_TERMINATE );
1160 BOOL smb_io_lockout_string_hdr(const char *desc, HDR_LOCKOUT_STRING *hdr_account_lockout, prs_struct *ps, int depth)
1162 prs_debug(ps, depth, desc, "smb_io_lockout_string_hdr");
1168 if(!prs_uint16("size", ps, depth, &hdr_account_lockout->size))
1170 if(!prs_uint16("length", ps, depth, &hdr_account_lockout->length))
1172 if(!prs_uint32("buffer", ps, depth, &hdr_account_lockout->buffer))
1178 BOOL smb_io_account_lockout_str(const char *desc, LOCKOUT_STRING *account_lockout, uint32 buffer, prs_struct *ps, int depth)
1180 prs_debug(ps, depth, desc, "smb_io_account_lockout_string");
1183 if(!prs_uint32("array_size", ps, depth, &account_lockout->array_size))
1186 if(!prs_uint32("offset", ps, depth, &account_lockout->offset))
1188 if(!prs_uint32("length", ps, depth, &account_lockout->length))
1191 if (!prs_uint64("lockout_duration", ps, depth, &account_lockout->lockout_duration))
1193 if (!prs_uint64("reset_count", ps, depth, &account_lockout->reset_count))
1195 if (!prs_uint32("bad_attempt_lockout", ps, depth, &account_lockout->bad_attempt_lockout))
1197 if (!prs_uint32("dummy", ps, depth, &account_lockout->dummy))
1200 if(!prs_uint16s (False, "bindata", ps, depth, &account_lockout->bindata, length))
1207 /*******************************************************************
1208 Inits a DOM_RID structure.
1209 ********************************************************************/
1211 void init_dom_rid(DOM_RID *prid, uint32 rid, uint16 type, uint32 idx)
1215 prid->rid_idx = idx;
1218 /*******************************************************************
1219 Reads or writes a DOM_RID structure.
1220 ********************************************************************/
1222 BOOL smb_io_dom_rid(const char *desc, DOM_RID *rid, prs_struct *ps, int depth)
1227 prs_debug(ps, depth, desc, "smb_io_dom_rid");
1233 if(!prs_uint16("type ", ps, depth, &rid->type))
1237 if(!prs_uint32("rid ", ps, depth, &rid->rid))
1239 if(!prs_uint32("rid_idx", ps, depth, &rid->rid_idx))
1245 /*******************************************************************
1246 Reads or writes a DOM_RID2 structure.
1247 ********************************************************************/
1249 BOOL smb_io_dom_rid2(const char *desc, DOM_RID2 *rid, prs_struct *ps, int depth)
1254 prs_debug(ps, depth, desc, "smb_io_dom_rid2");
1260 if(!prs_uint16("type ", ps, depth, &rid->type))
1264 if(!prs_uint32("rid ", ps, depth, &rid->rid))
1266 if(!prs_uint32("rid_idx", ps, depth, &rid->rid_idx))
1268 if(!prs_uint32("unknown", ps, depth, &rid->unknown))
1275 /*******************************************************************
1276 creates a DOM_RID3 structure.
1277 ********************************************************************/
1279 void init_dom_rid3(DOM_RID3 *rid3, uint32 rid, uint8 type)
1283 rid3->ptr_type = 0x1; /* non-zero, basically. */
1288 /*******************************************************************
1289 reads or writes a DOM_RID3 structure.
1290 ********************************************************************/
1292 BOOL smb_io_dom_rid3(const char *desc, DOM_RID3 *rid3, prs_struct *ps, int depth)
1297 prs_debug(ps, depth, desc, "smb_io_dom_rid3");
1303 if(!prs_uint32("rid ", ps, depth, &rid3->rid))
1305 if(!prs_uint32("type1 ", ps, depth, &rid3->type1))
1307 if(!prs_uint32("ptr_type", ps, depth, &rid3->ptr_type))
1309 if(!prs_uint32("type2 ", ps, depth, &rid3->type2))
1311 if(!prs_uint32("unk ", ps, depth, &rid3->unk))
1317 /*******************************************************************
1318 Inits a DOM_RID4 structure.
1319 ********************************************************************/
1321 void init_dom_rid4(DOM_RID4 *rid4, uint16 unknown, uint16 attr, uint32 rid)
1323 rid4->unknown = unknown;
1328 /*******************************************************************
1329 Inits a DOM_CLNT_SRV structure.
1330 ********************************************************************/
1332 static void init_clnt_srv(DOM_CLNT_SRV *logcln, const char *logon_srv, const char *comp_name)
1334 DEBUG(5,("init_clnt_srv: %d\n", __LINE__));
1336 if (logon_srv != NULL) {
1337 logcln->undoc_buffer = 1;
1338 init_unistr2(&logcln->uni_logon_srv, logon_srv, UNI_STR_TERMINATE);
1340 logcln->undoc_buffer = 0;
1343 if (comp_name != NULL) {
1344 logcln->undoc_buffer2 = 1;
1345 init_unistr2(&logcln->uni_comp_name, comp_name, UNI_STR_TERMINATE);
1347 logcln->undoc_buffer2 = 0;
1351 /*******************************************************************
1352 Inits or writes a DOM_CLNT_SRV structure.
1353 ********************************************************************/
1355 BOOL smb_io_clnt_srv(const char *desc, DOM_CLNT_SRV *logcln, prs_struct *ps, int depth)
1360 prs_debug(ps, depth, desc, "smb_io_clnt_srv");
1366 if(!prs_uint32("undoc_buffer ", ps, depth, &logcln->undoc_buffer))
1369 if (logcln->undoc_buffer != 0) {
1370 if(!smb_io_unistr2("unistr2", &logcln->uni_logon_srv, logcln->undoc_buffer, ps, depth))
1377 if(!prs_uint32("undoc_buffer2", ps, depth, &logcln->undoc_buffer2))
1380 if (logcln->undoc_buffer2 != 0) {
1381 if(!smb_io_unistr2("unistr2", &logcln->uni_comp_name, logcln->undoc_buffer2, ps, depth))
1388 /*******************************************************************
1389 Inits a DOM_LOG_INFO structure.
1390 ********************************************************************/
1392 void init_log_info(DOM_LOG_INFO *loginfo, const char *logon_srv, const char *acct_name,
1393 uint16 sec_chan, const char *comp_name)
1395 DEBUG(5,("make_log_info %d\n", __LINE__));
1397 loginfo->undoc_buffer = 1;
1399 init_unistr2(&loginfo->uni_logon_srv, logon_srv, UNI_STR_TERMINATE);
1400 init_unistr2(&loginfo->uni_acct_name, acct_name, UNI_STR_TERMINATE);
1402 loginfo->sec_chan = sec_chan;
1404 init_unistr2(&loginfo->uni_comp_name, comp_name, UNI_STR_TERMINATE);
1407 /*******************************************************************
1408 Reads or writes a DOM_LOG_INFO structure.
1409 ********************************************************************/
1411 BOOL smb_io_log_info(const char *desc, DOM_LOG_INFO *loginfo, prs_struct *ps, int depth)
1413 if (loginfo == NULL)
1416 prs_debug(ps, depth, desc, "smb_io_log_info");
1422 if(!prs_uint32("undoc_buffer", ps, depth, &loginfo->undoc_buffer))
1425 if(!smb_io_unistr2("unistr2", &loginfo->uni_logon_srv, True, ps, depth))
1427 if(!smb_io_unistr2("unistr2", &loginfo->uni_acct_name, True, ps, depth))
1430 if(!prs_uint16("sec_chan", ps, depth, &loginfo->sec_chan))
1433 if(!smb_io_unistr2("unistr2", &loginfo->uni_comp_name, True, ps, depth))
1439 /*******************************************************************
1440 Reads or writes a DOM_CHAL structure.
1441 ********************************************************************/
1443 BOOL smb_io_chal(const char *desc, DOM_CHAL *chal, prs_struct *ps, int depth)
1448 prs_debug(ps, depth, desc, "smb_io_chal");
1451 if(!prs_uint8s (False, "data", ps, depth, chal->data, 8))
1457 /*******************************************************************
1458 Reads or writes a DOM_CRED structure.
1459 ********************************************************************/
1461 BOOL smb_io_cred(const char *desc, DOM_CRED *cred, prs_struct *ps, int depth)
1466 prs_debug(ps, depth, desc, "smb_io_cred");
1472 if(!smb_io_chal ("", &cred->challenge, ps, depth))
1475 if(!smb_io_utime("", &cred->timestamp, ps, depth))
1481 /*******************************************************************
1482 Inits a DOM_CLNT_INFO2 structure.
1483 ********************************************************************/
1485 void init_clnt_info2(DOM_CLNT_INFO2 *clnt,
1486 const char *logon_srv, const char *comp_name,
1487 const DOM_CRED *clnt_cred)
1489 DEBUG(5,("make_clnt_info: %d\n", __LINE__));
1491 init_clnt_srv(&clnt->login, logon_srv, comp_name);
1493 if (clnt_cred != NULL) {
1495 memcpy(&clnt->cred, clnt_cred, sizeof(clnt->cred));
1501 /*******************************************************************
1502 Reads or writes a DOM_CLNT_INFO2 structure.
1503 ********************************************************************/
1505 BOOL smb_io_clnt_info2(const char *desc, DOM_CLNT_INFO2 *clnt, prs_struct *ps, int depth)
1510 prs_debug(ps, depth, desc, "smb_io_clnt_info2");
1516 if(!smb_io_clnt_srv("", &clnt->login, ps, depth))
1522 if(!prs_uint32("ptr_cred", ps, depth, &clnt->ptr_cred))
1524 if(!smb_io_cred("", &clnt->cred, ps, depth))
1530 /*******************************************************************
1531 Inits a DOM_CLNT_INFO structure.
1532 ********************************************************************/
1534 void init_clnt_info(DOM_CLNT_INFO *clnt,
1535 const char *logon_srv, const char *acct_name,
1536 uint16 sec_chan, const char *comp_name,
1537 const DOM_CRED *cred)
1539 DEBUG(5,("make_clnt_info\n"));
1541 init_log_info(&clnt->login, logon_srv, acct_name, sec_chan, comp_name);
1542 memcpy(&clnt->cred, cred, sizeof(clnt->cred));
1545 /*******************************************************************
1546 Reads or writes a DOM_CLNT_INFO structure.
1547 ********************************************************************/
1549 BOOL smb_io_clnt_info(const char *desc, DOM_CLNT_INFO *clnt, prs_struct *ps, int depth)
1554 prs_debug(ps, depth, desc, "smb_io_clnt_info");
1560 if(!smb_io_log_info("", &clnt->login, ps, depth))
1562 if(!smb_io_cred("", &clnt->cred, ps, depth))
1568 /*******************************************************************
1569 Inits a DOM_LOGON_ID structure.
1570 ********************************************************************/
1572 void init_logon_id(DOM_LOGON_ID *logonid, uint32 log_id_low, uint32 log_id_high)
1574 DEBUG(5,("make_logon_id: %d\n", __LINE__));
1576 logonid->low = log_id_low;
1577 logonid->high = log_id_high;
1580 /*******************************************************************
1581 Reads or writes a DOM_LOGON_ID structure.
1582 ********************************************************************/
1584 BOOL smb_io_logon_id(const char *desc, DOM_LOGON_ID *logonid, prs_struct *ps, int depth)
1586 if (logonid == NULL)
1589 prs_debug(ps, depth, desc, "smb_io_logon_id");
1595 if(!prs_uint32("low ", ps, depth, &logonid->low ))
1597 if(!prs_uint32("high", ps, depth, &logonid->high))
1603 /*******************************************************************
1604 Inits an OWF_INFO structure.
1605 ********************************************************************/
1607 void init_owf_info(OWF_INFO *hash, const uint8 data[16])
1609 DEBUG(5,("init_owf_info: %d\n", __LINE__));
1612 memcpy(hash->data, data, sizeof(hash->data));
1614 memset((char *)hash->data, '\0', sizeof(hash->data));
1617 /*******************************************************************
1618 Reads or writes an OWF_INFO structure.
1619 ********************************************************************/
1621 BOOL smb_io_owf_info(const char *desc, OWF_INFO *hash, prs_struct *ps, int depth)
1626 prs_debug(ps, depth, desc, "smb_io_owf_info");
1632 if(!prs_uint8s (False, "data", ps, depth, hash->data, 16))
1638 /*******************************************************************
1639 Reads or writes a DOM_GID structure.
1640 ********************************************************************/
1642 BOOL smb_io_gid(const char *desc, DOM_GID *gid, prs_struct *ps, int depth)
1647 prs_debug(ps, depth, desc, "smb_io_gid");
1653 if(!prs_uint32("g_rid", ps, depth, &gid->g_rid))
1655 if(!prs_uint32("attr ", ps, depth, &gid->attr))
1661 /*******************************************************************
1662 Reads or writes an POLICY_HND structure.
1663 ********************************************************************/
1665 BOOL smb_io_pol_hnd(const char *desc, POLICY_HND *pol, prs_struct *ps, int depth)
1670 prs_debug(ps, depth, desc, "smb_io_pol_hnd");
1676 if(UNMARSHALLING(ps))
1679 if (!prs_uint32("handle_type", ps, depth, &pol->handle_type))
1681 if (!smb_io_uuid("uuid", (struct GUID*)&pol->uuid, ps, depth))
1687 /*******************************************************************
1689 ********************************************************************/
1691 void init_unistr3(UNISTR3 *str, const char *buf)
1695 str->str.buffer = NULL;
1699 str->uni_str_len = strlen(buf) + 1;
1701 if (str->uni_str_len) {
1702 str->str.buffer = TALLOC_ZERO_ARRAY(get_talloc_ctx(), uint16, str->uni_str_len);
1703 if (str->str.buffer == NULL)
1704 smb_panic("init_unistr3: malloc fail\n");
1706 rpcstr_push((char *)str->str.buffer, buf, str->uni_str_len * sizeof(uint16), STR_TERMINATE);
1708 str->str.buffer = NULL;
1712 /*******************************************************************
1713 Reads or writes a UNISTR3 structure.
1714 ********************************************************************/
1716 BOOL smb_io_unistr3(const char *desc, UNISTR3 *name, prs_struct *ps, int depth)
1721 prs_debug(ps, depth, desc, "smb_io_unistr3");
1727 if(!prs_uint32("uni_str_len", ps, depth, &name->uni_str_len))
1730 /* we're done if there is no string */
1732 if ( name->uni_str_len == 0 )
1735 /* don't know if len is specified by uni_str_len member... */
1736 /* assume unicode string is unicode-null-terminated, instead */
1738 if(!prs_unistr3(True, "unistr", name, ps, depth))
1744 /*******************************************************************
1745 Stream a uint64_struct
1746 ********************************************************************/
1747 BOOL prs_uint64(const char *name, prs_struct *ps, int depth, uint64 *data64)
1749 if (UNMARSHALLING(ps)) {
1752 if (!prs_uint32(name, ps, depth+1, &low))
1755 if (!prs_uint32(name, ps, depth+1, &high))
1758 *data64 = ((uint64_t)high << 32) + low;
1762 uint32 high = (*data64) >> 32, low = (*data64) & 0xFFFFFFFF;
1763 return prs_uint32(name, ps, depth+1, &low) &&
1764 prs_uint32(name, ps, depth+1, &high);
1768 /*******************************************************************
1769 reads or writes a BUFHDR2 structure.
1770 ********************************************************************/
1771 BOOL smb_io_bufhdr2(const char *desc, BUFHDR2 *hdr, prs_struct *ps, int depth)
1773 prs_debug(ps, depth, desc, "smb_io_bufhdr2");
1777 prs_uint32("info_level", ps, depth, &(hdr->info_level));
1778 prs_uint32("length ", ps, depth, &(hdr->length ));
1779 prs_uint32("buffer ", ps, depth, &(hdr->buffer ));
1784 /*******************************************************************
1785 reads or writes a BUFHDR4 structure.
1786 ********************************************************************/
1787 BOOL smb_io_bufhdr4(const char *desc, BUFHDR4 *hdr, prs_struct *ps, int depth)
1789 prs_debug(ps, depth, desc, "smb_io_bufhdr4");
1793 prs_uint32("size", ps, depth, &hdr->size);
1794 prs_uint32("buffer", ps, depth, &hdr->buffer);
1799 /*******************************************************************
1800 reads or writes a RPC_DATA_BLOB structure.
1801 ********************************************************************/
1803 BOOL smb_io_rpc_blob(const char *desc, RPC_DATA_BLOB *blob, prs_struct *ps, int depth)
1805 prs_debug(ps, depth, desc, "smb_io_rpc_blob");
1809 if ( !prs_uint32("buf_len", ps, depth, &blob->buf_len) )
1812 if ( blob->buf_len == 0 )
1815 if (UNMARSHALLING(ps)) {
1816 blob->buffer = PRS_ALLOC_MEM(ps, uint8, blob->buf_len);
1817 if (!blob->buffer) {
1822 if ( !prs_uint8s(True, "buffer", ps, depth, blob->buffer, blob->buf_len) )
1828 /*******************************************************************
1829 creates a UNIHDR structure.
1830 ********************************************************************/
1832 BOOL make_uni_hdr(UNIHDR *hdr, int len)
1838 hdr->uni_str_len = 2 * len;
1839 hdr->uni_max_len = 2 * len;
1840 hdr->buffer = len != 0 ? 1 : 0;
1845 /*******************************************************************
1846 creates a BUFHDR2 structure.
1847 ********************************************************************/
1848 BOOL make_bufhdr2(BUFHDR2 *hdr, uint32 info_level, uint32 length, uint32 buffer)
1850 hdr->info_level = info_level;
1851 hdr->length = length;
1852 hdr->buffer = buffer;
1857 /*******************************************************************
1858 return the length of a UNISTR string.
1859 ********************************************************************/
1861 uint32 str_len_uni(UNISTR *source)
1865 if (!source->buffer)
1868 while (source->buffer[i])