lib/util_unistr.c:
authorJean-François Micouleau <jfm@samba.org>
Fri, 15 Dec 2000 09:31:56 +0000 (09:31 +0000)
committerJean-François Micouleau <jfm@samba.org>
Fri, 15 Dec 2000 09:31:56 +0000 (09:31 +0000)
        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)

source3/include/proto.h
source3/lib/util_unistr.c
source3/rpc_parse/parse_misc.c
source3/rpc_parse/parse_prs.c
source3/rpc_parse/parse_samr.c
source3/rpc_server/srv_lsa.c
source3/rpc_server/srv_spoolss_nt.c

index 8b4fcb173d81593646f78f7683ead79c0245e0fb..79c742e0a8f5ade8f1ebbb2f8bda89e1b25526ce 100644 (file)
@@ -17,6 +17,9 @@ void cmd_tar(void);
 int process_tar(void);
 int tar_parseargs(int argc, char *argv[], char *Optarg, int Optind);
 
+/*The following definitions come from  groupdb/mapping.c  */
+
+
 /*The following definitions come from  lib/access.c  */
 
 BOOL allow_access(char *deny_list,char *allow_list,
@@ -2472,6 +2475,7 @@ BOOL prs_uint32(char *name, prs_struct *ps, int depth, uint32 *data32);
 BOOL prs_uint8s(BOOL charmode, char *name, prs_struct *ps, int depth, uint8 *data8s, int len);
 BOOL prs_uint16s(BOOL charmode, char *name, prs_struct *ps, int depth, uint16 *data16s, int len);
 BOOL prs_uint32s(BOOL charmode, char *name, prs_struct *ps, int depth, uint32 *data32s, int len);
+BOOL prs_buffer5(BOOL charmode, char *name, prs_struct *ps, int depth, BUFFER5 *str);
 BOOL prs_buffer2(BOOL charmode, char *name, prs_struct *ps, int depth, BUFFER2 *str);
 BOOL prs_string2(BOOL charmode, char *name, prs_struct *ps, int depth, STRING2 *str);
 BOOL prs_unistr2(BOOL charmode, char *name, prs_struct *ps, int depth, UNISTR2 *str);
index 74ecc841d007d46a57a4db89ed670d44ddbfd571..5e86d5db0b1cc7a4d1bf8d903429ea76874addb7 100644 (file)
@@ -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;
 }
 
 
index 859a8007719c83becca84a1a5f36ffd9774aca70..0a2f49d4ddc5c01f539a4f57d1940987e3f947d3 100644 (file)
@@ -647,17 +647,14 @@ BOOL smb_io_buffer5(char *desc, BUFFER5 *buf5, prs_struct *ps, int depth)
 
        if (buf5 == NULL) return False;
 
-       prs_align(ps);
-       prs_uint32("buf_len", ps, depth, &(buf5->buf_len));
+       if(!prs_align(ps))
+               return False;
+       if(!prs_uint32("buf_len", ps, depth, &buf5->buf_len))
+               return False;
 
-       /* reading: alloc the buffer first */
-       if ( UNMARSHALLING(ps) ) {
-               buf5->buffer=(uint16 *)prs_alloc_mem(ps, sizeof(uint16)*buf5->buf_len );
-               if (buf5->buffer == NULL)
-                       return False;
-       }
-       
-       prs_uint16s(True, "buffer", ps, depth, buf5->buffer, buf5->buf_len);
+
+       if(!prs_buffer5(True, "buffer" , ps, depth, buf5))
+               return False;
 
        return True;
 }
index e800c202907e7a800512226c38e89b1e5da90ba5..5621a2c21034ac421ad085606020b2bfe050bca6 100644 (file)
@@ -562,6 +562,47 @@ BOOL prs_uint32s(BOOL charmode, char *name, prs_struct *ps, int depth, uint32 *d
        return True;
 }
 
+/******************************************************************
+ Stream an array of unicode string, length/buffer specified separately,
+ in uint16 chars. We use DBG_RW_PCVAL, not DBG_RW_PSVAL here
+ as the unicode string is already in little-endian format.
+ ********************************************************************/
+
+BOOL prs_buffer5(BOOL charmode, char *name, prs_struct *ps, int depth, BUFFER5 *str)
+{
+       char *p;
+       char *q = prs_mem_get(ps, str->buf_len * sizeof(uint16));
+       if (q == NULL)
+               return False;
+
+       if (UNMARSHALLING(ps)) {
+               str->buffer = (uint16 *)prs_alloc_mem(ps,str->buf_len * sizeof(uint16));
+               if (str->buffer == NULL)
+                       return False;
+               memset(str->buffer, '\0', str->buf_len * sizeof(uint16));
+       }
+
+       /* If the string is empty, we don't have anything to stream */
+       if (str->buf_len==0)
+               return True;
+
+       p = (char *)str->buffer;
+
+       /* If we're using big-endian, reverse to get little-endian. */
+       if(ps->bigendian_data) {
+               DBG_RW_PSVAL(charmode, name, depth, ps->data_offset, 
+                            ps->io, ps->bigendian_data, q, p, 
+                            str->buf_len)
+       } else {
+               DBG_RW_PCVAL(charmode, name, depth, ps->data_offset, 
+                            ps->io, q, p, str->buf_len * sizeof(uint16))
+       }
+       
+       ps->data_offset += (str->buf_len * sizeof(uint16));
+
+       return True;
+}
+
 /******************************************************************
  Stream a "not" unicode string, length/buffer specified separately,
  in byte chars. String is in little-endian format.
index c36ca06aae358aab7438b61746d4a4f18b309a9d..aa08606a576cfcf5a92851d1914e73ff9635c5cb 100644 (file)
@@ -3890,22 +3890,25 @@ BOOL samr_io_r_chgpasswd_user(char *desc, SAMR_R_CHGPASSWD_USER *r_u, prs_struct
  **********************************************************************/
 BOOL samr_io_q_lookup_domain(char* desc, SAMR_Q_LOOKUP_DOMAIN* q_u, prs_struct *ps, int depth)
 {
-  if (q_u == NULL)
-    return False;
+       if (q_u == NULL)
+               return False;
 
-  prs_debug(ps, depth, desc, "samr_io_q_lookup_domain");
-  depth++;
+       prs_debug(ps, depth, desc, "samr_io_q_lookup_domain");
+       depth++;
+
+       if(!prs_align(ps))
+               return False;
 
-  prs_align(ps);
+       if(!smb_io_pol_hnd("connect_pol", &q_u->connect_pol, ps, depth))
+               return False;
 
-  smb_io_pol_hnd("connect_pol", &(q_u->connect_pol), ps, depth);
+       if(!smb_io_unihdr("hdr_domain", &q_u->hdr_domain, ps, depth))
+               return False;
 
-  smb_io_unihdr("hdr_domain", &(q_u->hdr_domain), ps, depth);
-  smb_io_unistr2("uni_domain", &(q_u->uni_domain),
-                q_u->hdr_domain.buffer, ps, depth);
-  prs_align(ps);
+       if(!smb_io_unistr2("uni_domain", &q_u->uni_domain, q_u->hdr_domain.buffer, ps, depth))
+               return False;
 
-  return True;
+       return True;
 } 
 
 /*******************************************************************
index aea7294ffe08c80acf934d2d2b00888043aed1b2..5fc40d692cd68e3c8ebd0b7d4ecb3beb2dec83b8 100644 (file)
@@ -88,7 +88,7 @@ Init dom_query
 
 static void init_dom_query(DOM_QUERY *d_q, char *dom_name, DOM_SID *dom_sid)
 {
-       int domlen = (dom_name != NULL) ? strlen(dom_name) : 0;
+       int domlen = (dom_name != NULL) ? strlen(dom_name)+1 : 0;
 
        d_q->uni_dom_max_len = domlen * 2;
        d_q->uni_dom_str_len = domlen * 2;
index c2054143b75012b7ef0fcfa312ab9b48fb7f74c0..a4f5e257f156b1ea5ea6083d80abf7b854bb001e 100644 (file)
@@ -2021,7 +2021,7 @@ static DEVICEMODE *construct_dev_mode(int snum)
 
        DEBUGADD(8,("loading DEVICEMODE\n"));
 
-       safe_strcpy(adevice, printer->info_2->printername, sizeof(adevice));
+       snprintf(adevice, sizeof(adevice), printer->info_2->printername);
        init_unistr(&devmode->devicename, adevice);
 
        snprintf(aform, sizeof(aform), ntdevmode->formname);