Fix for #480. Change the interface for init_unistr2 to not take a length
authorJeremy Allison <jra@samba.org>
Thu, 25 Sep 2003 21:26:16 +0000 (21:26 +0000)
committerJeremy Allison <jra@samba.org>
Thu, 25 Sep 2003 21:26:16 +0000 (21:26 +0000)
but a flags field. We were assuming that 2*strlen(mb_string) == length of ucs2-le string.
This is not the case. Count it after conversion.
Jeremy.
(This used to be commit f82c273a42f930c7152cfab84394781744815e0e)

22 files changed:
source3/include/rpc_lsa.h
source3/include/rpc_misc.h
source3/lib/util_unistr.c
source3/python/py_spoolss_forms.c
source3/python/py_spoolss_forms_conv.c
source3/registry/reg_printing.c
source3/rpc_client/cli_srvsvc.c
source3/rpc_parse/parse_dfs.c
source3/rpc_parse/parse_ds.c
source3/rpc_parse/parse_lsa.c
source3/rpc_parse/parse_misc.c
source3/rpc_parse/parse_net.c
source3/rpc_parse/parse_reg.c
source3/rpc_parse/parse_samr.c
source3/rpc_parse/parse_spoolss.c
source3/rpc_parse/parse_srv.c
source3/rpc_server/srv_dfs_nt.c
source3/rpc_server/srv_lsa_ds_nt.c
source3/rpc_server/srv_lsa_nt.c
source3/rpc_server/srv_samr_nt.c
source3/rpc_server/srv_spoolss_nt.c
source3/rpcclient/cmd_spoolss.c

index fa49d76c88588c0d2a48581356edc64ed9d23b1c..93bc08a0ce05088fc3fa5b81dc8229430d960875 100644 (file)
@@ -728,5 +728,3 @@ typedef struct lsa_r_removeprivs
 
 
 #endif /* _RPC_LSA_H */
-
-
index f9dd15c36bfbbb50d3a0eb99f5df77fdc99120a9..aaaad55c20c751fbffa4a30d11ff22890dd91af2 100644 (file)
@@ -148,7 +148,7 @@ typedef struct bufhdr_info
 typedef struct buffer2_info
 {
        uint32 buf_max_len;
-       uint32 undoc;
+       uint32 offset;
        uint32 buf_len;
        /* unicode characters. ***MUST*** be little-endian. **NOT** necessarily null-terminated */
        uint16 *buffer;
@@ -173,7 +173,7 @@ typedef struct buffer5_info
 typedef struct unistr2_info
 {
        uint32 uni_max_len;
-       uint32 undoc;
+       uint32 offset;
        uint32 uni_str_len;
        /* unicode characters. ***MUST*** be little-endian. 
                **must** be null-terminated and the uni_str_len should include
@@ -185,7 +185,7 @@ typedef struct unistr2_info
 typedef struct string2_info
 {
        uint32 str_max_len;
-       uint32 undoc;
+       uint32 offset;
        uint32 str_str_len;
        uint8  *buffer; /* uint8 characters. **NOT** necessarily null-terminated */
 } STRING2;
@@ -403,5 +403,5 @@ typedef struct buffer4_info
 }
 BUFFER4;
 
-
+enum unistr2_term_codes { UNI_FLAGS_NONE = 0, UNI_STR_TERMINATE = 1, UNI_MAXLEN_TERMINATE = 2 };
 #endif /* _RPC_MISC_H */
index e7c200218e231b6b46f7a44d2791c1c9c151838d..e90a824395c1481fe29423c1a80bcaab2952b40f 100644 (file)
@@ -819,22 +819,25 @@ UNISTR2* ucs2_to_unistr2(TALLOC_CTX *ctx, UNISTR2* dst, smb_ucs2_t* src)
 {
        size_t len;
 
-       if (!src) return NULL;
+       if (!src)
+               return NULL;
        len = strlen_w(src);
        
        /* allocate UNISTR2 destination if not given */
        if (!dst) {
                dst = (UNISTR2*) talloc(ctx, sizeof(UNISTR2));
-               if (!dst) return NULL;
+               if (!dst)
+                       return NULL;
        }
        if (!dst->buffer) {
                dst->buffer = (uint16*) talloc(ctx, sizeof(uint16) * (len + 1));
-               if (!dst->buffer) return NULL;
+               if (!dst->buffer)
+                       return NULL;
        }
        
        /* set UNISTR2 parameters */
        dst->uni_max_len = len + 1;
-       dst->undoc = 0;
+       dst->offset = 0;
        dst->uni_str_len = len;
        
        /* copy the actual unicode string */
@@ -842,4 +845,3 @@ UNISTR2* ucs2_to_unistr2(TALLOC_CTX *ctx, UNISTR2* dst, smb_ucs2_t* src)
        
        return dst;
 }
-
index ef9ed94533a52ffb04d128a5cc779fdf60c55bd0..66a6540e074b21bb76acb75bf9311801be6585ad 100644 (file)
@@ -59,7 +59,7 @@ PyObject *spoolss_hnd_addform(PyObject *self, PyObject *args, PyObject *kw)
                PyObject *obj = PyDict_GetItemString(info, "name");
                char *form_name = PyString_AsString(obj);
 
-               init_unistr2(&form.name, form_name, strlen(form_name) + 1);
+               init_unistr2(&form.name, form_name, UNI_STR_TERMINATE);
                break;
        }
        default:
index 095a318fd243bd27f86d06638562e1bd709e7921..ede729cad33fc35d5f550069326a8c51db8d50e8 100644 (file)
@@ -81,7 +81,7 @@ BOOL py_to_FORM(FORM *form, PyObject *dict)
        obj = PyDict_GetItemString(dict, "name");
        name = PyString_AsString(obj);
 
-       init_unistr2(&form->name, name, strlen(name) + 1);
+       init_unistr2(&form->name, name, UNI_STR_TERMINATE);
        
        result = True;
 
index 50ac81dcbb2042a0222a6bc5c9456e842c1119c1..e50a5f4d4fd1fc92ae818afe7c1cab733d86af94 100644 (file)
@@ -288,34 +288,32 @@ static int print_subpath_values_environments( char *key, REGVAL_CTR *val )
        info3 = driver_ctr.info_3;
        
        filename = dos_basename( info3->driverpath );
-       init_unistr2( &data, filename, strlen(filename)+1 ); 
+       init_unistr2( &data, filename, UNI_STR_TERMINATE);
        regval_ctr_addvalue( val, "Driver",             REG_SZ,       (char*)data.buffer, data.uni_str_len*sizeof(uint16) );
        
        filename = dos_basename( info3->configfile );
-       init_unistr2( &data, filename, strlen(filename)+1 );
+       init_unistr2( &data, filename, UNI_STR_TERMINATE);
        regval_ctr_addvalue( val, "Configuration File", REG_SZ,       (char*)data.buffer, data.uni_str_len*sizeof(uint16) );
        
        filename = dos_basename( info3->datafile );
-       init_unistr2( &data, filename, strlen(filename)+1 );
+       init_unistr2( &data, filename, UNI_STR_TERMINATE);
        regval_ctr_addvalue( val, "Data File",          REG_SZ,       (char*)data.buffer, data.uni_str_len*sizeof(uint16) );
        
        filename = dos_basename( info3->helpfile );
-       init_unistr2( &data, filename, strlen(filename)+1 );
+       init_unistr2( &data, filename, UNI_STR_TERMINATE);
        regval_ctr_addvalue( val, "Help File",          REG_SZ,       (char*)data.buffer, data.uni_str_len*sizeof(uint16) );
        
-       init_unistr2( &data, info3->defaultdatatype, strlen(info3->defaultdatatype)+1 );
+       init_unistr2( &data, info3->defaultdatatype, UNI_STR_TERMINATE);
        regval_ctr_addvalue( val, "Data Type",          REG_SZ,       (char*)data.buffer, data.uni_str_len*sizeof(uint16) );
        
        regval_ctr_addvalue( val, "Version",            REG_DWORD,    (char*)&info3->cversion, sizeof(info3->cversion) );
        
-       if ( info3->dependentfiles )
-       {
+       if ( info3->dependentfiles ) {
                /* place the list of dependent files in a single 
                   character buffer, separating each file name by
                   a NULL */
                   
-               for ( i=0; strcmp(info3->dependentfiles[i], ""); i++ )
-               {
+               for ( i=0; strcmp(info3->dependentfiles[i], ""); i++ ) {
                        /* strip the path to only the file's base name */
                
                        filename = dos_basename( info3->dependentfiles[i] );
@@ -327,7 +325,7 @@ static int print_subpath_values_environments( char *key, REGVAL_CTR *val )
                                break;
                        buffer = buffer2;
                        
-                       init_unistr2( &data, filename, length+1 );
+                       init_unistr2( &data, filename, UNI_STR_TERMINATE);
                        memcpy( buffer+buffer_size, (char*)data.buffer, data.uni_str_len*sizeof(uint16) );
                
                        buffer_size += (length + 1)*sizeof(uint16);
@@ -339,8 +337,7 @@ static int print_subpath_values_environments( char *key, REGVAL_CTR *val )
                if ( !buffer2 ) {
                        SAFE_FREE( buffer );
                        buffer_size = 0;
-               }
-               else {
+               } else {
                        buffer = buffer2;
                        buffer[buffer_size++] = '\0';
                        buffer[buffer_size++] = '\0';
@@ -573,25 +570,25 @@ static int print_subpath_values_printers( char *key, REGVAL_CTR *val )
                regval_ctr_addvalue( val, "cjobs",            REG_DWORD, (char*)&info2->cjobs,            sizeof(info2->cjobs) );
                regval_ctr_addvalue( val, "AveragePPM",       REG_DWORD, (char*)&info2->averageppm,       sizeof(info2->averageppm) );
 
-               init_unistr2( &data, info2->printername, strlen(info2->printername)+1 );
+               init_unistr2( &data, info2->printername, UNI_STR_TERMINATE);
                regval_ctr_addvalue( val, "Name",             REG_SZ, (char*)data.buffer, data.uni_str_len*sizeof(uint16) );
-               init_unistr2( &data, info2->location, strlen(info2->location)+1 );
+               init_unistr2( &data, info2->location, UNI_STR_TERMINATE);
                regval_ctr_addvalue( val, "Location",         REG_SZ, (char*)data.buffer, data.uni_str_len*sizeof(uint16) );
-               init_unistr2( &data, info2->comment, strlen(info2->comment)+1 );
+               init_unistr2( &data, info2->comment, UNI_STR_TERMINATE);
                regval_ctr_addvalue( val, "Comment",          REG_SZ, (char*)data.buffer, data.uni_str_len*sizeof(uint16) );
-               init_unistr2( &data, info2->parameters, strlen(info2->parameters)+1 );
+               init_unistr2( &data, info2->parameters, UNI_STR_TERMINATE);
                regval_ctr_addvalue( val, "Parameters",       REG_SZ, (char*)data.buffer, data.uni_str_len*sizeof(uint16) );
-               init_unistr2( &data, info2->portname, strlen(info2->portname)+1 );
+               init_unistr2( &data, info2->portname, UNI_STR_TERMINATE);
                regval_ctr_addvalue( val, "Port",             REG_SZ, (char*)data.buffer, data.uni_str_len*sizeof(uint16) );
-               init_unistr2( &data, info2->servername, strlen(info2->servername)+1 );
+               init_unistr2( &data, info2->servername, UNI_STR_TERMINATE);
                regval_ctr_addvalue( val, "Server",           REG_SZ, (char*)data.buffer, data.uni_str_len*sizeof(uint16) );
-               init_unistr2( &data, info2->sharename, strlen(info2->sharename)+1 );
+               init_unistr2( &data, info2->sharename, UNI_STR_TERMINATE);
                regval_ctr_addvalue( val, "Share",            REG_SZ, (char*)data.buffer, data.uni_str_len*sizeof(uint16) );
-               init_unistr2( &data, info2->drivername, strlen(info2->drivername)+1 );
+               init_unistr2( &data, info2->drivername, UNI_STR_TERMINATE);
                regval_ctr_addvalue( val, "Driver",           REG_SZ, (char*)data.buffer, data.uni_str_len*sizeof(uint16) );
-               init_unistr2( &data, info2->sepfile, strlen(info2->sepfile)+1 );
+               init_unistr2( &data, info2->sepfile, UNI_STR_TERMINATE);
                regval_ctr_addvalue( val, "Separator File",   REG_SZ, (char*)data.buffer, data.uni_str_len*sizeof(uint16) );
-               init_unistr2( &data, "winprint", strlen("winprint")+1 );
+               init_unistr2( &data, "winprint", UNI_STR_TERMINATE);
                regval_ctr_addvalue( val, "Print Processor",  REG_SZ, (char*)data.buffer, data.uni_str_len*sizeof(uint16) );
                
                
index 27349b7295783207ebb084c4c796b822fb95fc9f..555703cf4d8ae4a680924dbe1228b99d92ffe974 100644 (file)
@@ -138,11 +138,11 @@ WERROR cli_srvsvc_net_share_enum(struct cli_state *cli, TALLOC_CTX *mem_ctx,
 
                        s = unistr2_tdup(mem_ctx, &r.ctr.share.info1[i].info_1_str.uni_netname);
                        if (s)
-                               init_unistr2(&info1->info_1_str.uni_netname, s, strlen(s) + 1);
+                               init_unistr2(&info1->info_1_str.uni_netname, s, UNI_STR_TERMINATE);
                
                        s = unistr2_tdup(mem_ctx, &r.ctr.share.info1[i].info_1_str.uni_remark);
                        if (s)
-                               init_unistr2(&info1->info_1_str.uni_remark, s, strlen(s) + 1);
+                               init_unistr2(&info1->info_1_str.uni_remark, s, UNI_STR_TERMINATE);
 
                }               
 
@@ -166,19 +166,19 @@ WERROR cli_srvsvc_net_share_enum(struct cli_state *cli, TALLOC_CTX *mem_ctx,
 
                        s = unistr2_tdup(mem_ctx, &r.ctr.share.info2[i].info_2_str.uni_netname);
                        if (s)
-                               init_unistr2(&info2->info_2_str.uni_netname, s, strlen(s) + 1);
+                               init_unistr2(&info2->info_2_str.uni_netname, s, UNI_STR_TERMINATE);
 
                        s = unistr2_tdup(mem_ctx, &r.ctr.share.info2[i].info_2_str.uni_remark);
                        if (s)
-                               init_unistr2(&info2->info_2_str.uni_remark, s, strlen(s) + 1);
+                               init_unistr2(&info2->info_2_str.uni_remark, s, UNI_STR_TERMINATE);
 
                        s = unistr2_tdup(mem_ctx, &r.ctr.share.info2[i].info_2_str.uni_path);
                        if (s)
-                               init_unistr2(&info2->info_2_str.uni_path, s, strlen(s) + 1);
+                               init_unistr2(&info2->info_2_str.uni_path, s, UNI_STR_TERMINATE);
 
                        s = unistr2_tdup(mem_ctx, &r.ctr.share.info2[i].info_2_str.uni_passwd);
                        if (s)
-                               init_unistr2(&info2->info_2_str.uni_passwd, s, strlen(s) + 1);
+                               init_unistr2(&info2->info_2_str.uni_passwd, s, UNI_STR_TERMINATE);
                }
                break;
        }
@@ -385,11 +385,11 @@ WERROR cli_srvsvc_net_file_enum(struct cli_state *cli, TALLOC_CTX *mem_ctx,
 
                        s = unistr2_tdup(mem_ctx, &r.ctr.file.info3[i].info_3_str.uni_path_name);
                        if (s)
-                               init_unistr2(&info3->info_3_str.uni_path_name, s, strlen(s) + 1);
+                               init_unistr2(&info3->info_3_str.uni_path_name, s, UNI_STR_TERMINATE);
                
                        s = unistr2_tdup(mem_ctx, &r.ctr.file.info3[i].info_3_str.uni_user_name);
                        if (s)
-                               init_unistr2(&info3->info_3_str.uni_user_name, s, strlen(s) + 1);
+                               init_unistr2(&info3->info_3_str.uni_user_name, s, UNI_STR_TERMINATE);
 
                }               
 
index 6f13500359f58d99f41f9cd8ec41c5599e28acc4..0d0ce557b2283f761d9cedf3163fd206af163d35 100644 (file)
@@ -80,9 +80,9 @@ BOOL init_dfs_q_dfs_remove(DFS_Q_DFS_REMOVE *q_d, const char *entrypath,
                           const char *servername, const char *sharename)
 {
        DEBUG(5,("init_dfs_q_dfs_remove\n"));
-       init_unistr2(&q_d->DfsEntryPath, entrypath,  strlen(entrypath)+1);
-       init_unistr2(&q_d->ServerName,   servername, strlen(servername)+1);
-       init_unistr2(&q_d->ShareName,    sharename,  strlen(sharename)+1);
+       init_unistr2(&q_d->DfsEntryPath, entrypath, UNI_STR_TERMINATE);
+       init_unistr2(&q_d->ServerName, servername, UNI_STR_TERMINATE);
+       init_unistr2(&q_d->ShareName, sharename, UNI_STR_TERMINATE);
        q_d->ptr_ServerName = q_d->ptr_ShareName = 1;
        return True;
 }
@@ -155,11 +155,11 @@ BOOL init_dfs_q_dfs_add(DFS_Q_DFS_ADD *q_d, const char *entrypath,
 {
        DEBUG(5,("init_dfs_q_dfs_add\n"));
        q_d->ptr_DfsEntryPath = q_d->ptr_ServerName = q_d->ptr_ShareName = 1;
-       init_unistr2(&q_d->DfsEntryPath, entrypath,  strlen(entrypath)+1);
-       init_unistr2(&q_d->ServerName,   servername, strlen(servername)+1);
-       init_unistr2(&q_d->ShareName,    sharename,  strlen(sharename)+1);
+       init_unistr2(&q_d->DfsEntryPath, entrypath, UNI_STR_TERMINATE);
+       init_unistr2(&q_d->ServerName, servername, UNI_STR_TERMINATE);
+       init_unistr2(&q_d->ShareName, sharename, UNI_STR_TERMINATE);
        if(comment != NULL) {
-               init_unistr2(&q_d->Comment,      comment,    strlen(comment)+1);
+               init_unistr2(&q_d->Comment, comment,UNI_STR_TERMINATE);
                q_d->ptr_Comment = 1;
        } else {
                q_d->ptr_Comment = 0;
@@ -237,9 +237,9 @@ BOOL init_dfs_q_dfs_get_info(DFS_Q_DFS_GET_INFO *q_d, const char *entrypath,
                             uint32 info_level)
 {
        DEBUG(5,("init_dfs_q2_get_info\n"));
-       init_unistr2(&q_d->uni_path, entrypath,  strlen(entrypath)+1);
-       init_unistr2(&q_d->uni_server,   servername, strlen(servername)+1);
-       init_unistr2(&q_d->uni_share,    sharename,  strlen(sharename)+1);
+       init_unistr2(&q_d->uni_path, entrypath, UNI_STR_TERMINATE);
+       init_unistr2(&q_d->uni_server, servername, UNI_STR_TERMINATE);
+       init_unistr2(&q_d->uni_share, sharename, UNI_STR_TERMINATE);
        q_d->level = info_level;
        q_d->ptr_server = q_d->ptr_share = 1;
        return True;
index f954806036b45b64fad7da871beaeceb7ab9e297..26dcdb34b8b957344c03aa766ba4ec08271e8b32 100644 (file)
@@ -138,8 +138,6 @@ BOOL ds_io_r_getprimdominfo( const char *desc, prs_struct *ps, int depth, DS_R_G
 BOOL init_q_ds_enum_domain_trusts( DS_Q_ENUM_DOM_TRUSTS *q, const char *server, 
                                  uint32 flags )
 {
-       int len;
-
        q->flags = flags;
        
        if ( server && *server )
@@ -147,9 +145,7 @@ BOOL init_q_ds_enum_domain_trusts( DS_Q_ENUM_DOM_TRUSTS *q, const char *server,
        else
                q->server_ptr = 0;
 
-       len = q->server_ptr ? strlen(server)+1 : 0;
-
-       init_unistr2( &q->server, server, len );
+       init_unistr2( &q->server, server, UNI_STR_TERMINATE);
                
        return True;
 }
index 07b0da7e9c2835bfce1636bff996ede5e7052576..3a5b232dc311550798ddfd423193fc6b15b0ba01 100644 (file)
@@ -36,14 +36,9 @@ static BOOL lsa_io_trans_names(const char *desc, LSA_TRANS_NAME_ENUM *trn, prs_s
 void init_lsa_trans_name(LSA_TRANS_NAME *trn, UNISTR2 *uni_name,
                         uint16 sid_name_use, const char *name, uint32 idx)
 {
-       int len_name = strlen(name);
-
-       if(len_name == 0)
-               len_name = 1;
-
        trn->sid_name_use = sid_name_use;
-       init_uni_hdr(&trn->hdr_name, len_name);
-       init_unistr2(uni_name, name, len_name);
+       init_unistr2(uni_name, name, UNI_FLAGS_NONE);
+       init_uni_hdr(&trn->hdr_name, uni_name);
        trn->domain_idx = idx;
 }
 
@@ -346,8 +341,7 @@ void init_q_open_pol2(LSA_Q_OPEN_POL2 *r_q, const char *server_name,
 
        r_q->des_access = desired_access;
 
-       init_unistr2(&r_q->uni_server_name, server_name, 
-                    strlen(server_name) + 1);
+       init_unistr2(&r_q->uni_server_name, server_name, UNI_STR_TERMINATE);
 
        init_lsa_obj_attr(&r_q->attr, attributes, qos);
 }
@@ -566,10 +560,10 @@ void init_r_enum_trust_dom(TALLOC_CTX *ctx, LSA_R_ENUM_TRUST_DOM *r_e, uint32 en
                        /* don't know what actually is this for */
                        r_e->ptr_enum_domains = 1;
                        
-                       init_uni_hdr2(&r_e->hdr_domain_name[i], strlen_w((td[i])->name));
                        init_dom_sid2(&r_e->domain_sid[i], &(td[i])->sid);
                        
                        init_unistr2_w(ctx, &r_e->uni_domain_name[i], (td[i])->name);
+                       init_uni_hdr2(&r_e->hdr_domain_name[i], &r_e->uni_domain_name[i]);
                        
                };
        }
@@ -1087,11 +1081,8 @@ void init_q_lookup_names(TALLOC_CTX *mem_ctx, LSA_Q_LOOKUP_NAMES *q_l,
        }
 
        for (i = 0; i < num_names; i++) {
-               int len;
-               len = strlen(names[i]);
-
-               init_uni_hdr(&q_l->hdr_name[i], len);
-               init_unistr2(&q_l->uni_name[i], names[i], len);
+               init_unistr2(&q_l->uni_name[i], names[i], UNI_FLAGS_NONE);
+               init_uni_hdr(&q_l->hdr_name[i], &q_l->uni_name[i]);
        }
 }
 
@@ -1436,15 +1427,10 @@ BOOL lsa_io_r_enum_privs(const char *desc, LSA_R_ENUM_PRIVS *r_q, prs_struct *ps
 
 void init_lsa_priv_get_dispname(LSA_Q_PRIV_GET_DISPNAME *trn, POLICY_HND *hnd, const char *name, uint16 lang_id, uint16 lang_id_sys)
 {
-       int len_name = strlen(name);
-
-       if(len_name == 0)
-               len_name = 1;
-
        memcpy(&trn->pol, hnd, sizeof(trn->pol));
 
-       init_uni_hdr(&trn->hdr_name, len_name);
-       init_unistr2(&trn->name, name, len_name);
+       init_unistr2(&trn->name, name, UNI_FLAGS_NONE);
+       init_uni_hdr(&trn->hdr_name, &trn->name);
        trn->lang_id = lang_id;
        trn->lang_id_sys = lang_id_sys;
 }
@@ -1954,14 +1940,9 @@ BOOL lsa_io_r_setsystemaccount(const char *desc, LSA_R_SETSYSTEMACCOUNT  *r_c, p
 
 void init_lsa_q_lookupprivvalue(LSA_Q_LOOKUPPRIVVALUE *trn, POLICY_HND *hnd, const char *name)
 {
-       int len_name = strlen(name);
        memcpy(&trn->pol, hnd, sizeof(trn->pol));
-
-       if(len_name == 0)
-               len_name = 1;
-
-       init_uni_hdr(&trn->hdr_right, len_name);
-       init_unistr2(&trn->uni2_right, name, len_name);
+       init_unistr2(&trn->uni2_right, name, UNI_FLAGS_NONE);
+       init_uni_hdr(&trn->hdr_right, &trn->uni2_right);
 }
 
 /*******************************************************************
index 17a96fff80c596da3516ff313f196a5d0052d52c..e18253553201283df973fa64b0699df58b5d57bd 100644 (file)
@@ -361,11 +361,11 @@ BOOL smb_io_strhdr(const char *desc,  STRHDR *hdr, prs_struct *ps, int depth)
  Inits a UNIHDR structure.
 ********************************************************************/
 
-void init_uni_hdr(UNIHDR *hdr, int len)
+void init_uni_hdr(UNIHDR *hdr, UNISTR2 *str2)
 {
-       hdr->uni_str_len = 2 * len;
-       hdr->uni_max_len = 2 * len;
-       hdr->buffer      = len != 0 ? 1 : 0;
+       hdr->uni_str_len = 2 * (str2->uni_str_len);
+       hdr->uni_max_len = 2 * (str2->uni_max_len);
+       hdr->buffer = (str2->uni_str_len != 0) ? 1 : 0;
 }
 
 /*******************************************************************
@@ -482,10 +482,10 @@ BOOL smb_io_hdrbuf(const char *desc, BUFHDR *hdr, prs_struct *ps, int depth)
 creates a UNIHDR2 structure.
 ********************************************************************/
 
-void init_uni_hdr2(UNIHDR2 *hdr, int len)
+void init_uni_hdr2(UNIHDR2 *hdr, UNISTR2 *str2)
 {
-       init_uni_hdr(&hdr->unihdr, len);
-       hdr->buffer = (len > 0) ? 1 : 0;
+       init_uni_hdr(&hdr->unihdr, str2);
+       hdr->buffer = (str2->uni_str_len > 0) ? 1 : 0;
 }
 
 /*******************************************************************
@@ -703,7 +703,7 @@ void init_buffer2(BUFFER2 *str, const uint8 *buf, size_t len)
 
        /* max buffer size (allocated size) */
        str->buf_max_len = len;
-       str->undoc       = 0;
+       str->offset = 0;
        str->buf_len = buf != NULL ? len : 0;
 
        if (buf != NULL) {
@@ -737,7 +737,7 @@ BOOL smb_io_buffer2(const char *desc, BUFFER2 *buf2, uint32 buffer, prs_struct *
                
                if(!prs_uint32("uni_max_len", ps, depth, &buf2->buf_max_len))
                        return False;
-               if(!prs_uint32("undoc      ", ps, depth, &buf2->undoc))
+               if(!prs_uint32("offset     ", ps, depth, &buf2->offset))
                        return False;
                if(!prs_uint32("buf_len    ", ps, depth, &buf2->buf_len))
                        return False;
@@ -765,14 +765,11 @@ creates a UNISTR2 structure: sets up the buffer, too
 void init_buf_unistr2(UNISTR2 *str, uint32 *ptr, const char *buf)
 {
        if (buf != NULL) {
-
                *ptr = 1;
-               init_unistr2(str, buf, strlen(buf)+1);
-
+               init_unistr2(str, buf, UNI_STR_TERMINATE);
        } else {
-
                *ptr = 0;
-               init_unistr2(str, "", 0);
+               init_unistr2(str, NULL, UNI_FLAGS_NONE);
 
        }
 }
@@ -783,10 +780,8 @@ void init_buf_unistr2(UNISTR2 *str, uint32 *ptr, const char *buf)
 
 void copy_unistr2(UNISTR2 *str, const UNISTR2 *from)
 {
-
-       /* set up string lengths. add one if string is not null-terminated */
        str->uni_max_len = from->uni_max_len;
-       str->undoc       = from->undoc;
+       str->offset      = from->offset;
        str->uni_str_len = from->uni_str_len;
 
        if (from->buffer == NULL)
@@ -803,8 +798,7 @@ void copy_unistr2(UNISTR2 *str, const UNISTR2 *from)
                len *= sizeof(uint16);
 
                str->buffer = (uint16 *)talloc_zero(get_talloc_ctx(), len);
-               if ((str->buffer == NULL) && (len > 0 ))
-               {
+               if ((str->buffer == NULL) && (len > 0 )) {
                        smb_panic("copy_unistr2: talloc fail\n");
                        return;
                }
@@ -824,7 +818,7 @@ void init_string2(STRING2 *str, const char *buf, int max_len, int str_len)
 
        /* set up string lengths. */
        str->str_max_len = max_len;
-       str->undoc       = 0;
+       str->offset = 0;
        str->str_str_len = str_len;
 
        /* store the string */
@@ -835,7 +829,7 @@ void init_string2(STRING2 *str, const char *buf, int max_len, int str_len)
                if (str->buffer == NULL)
                        smb_panic("init_string2: malloc fail\n");
                memcpy(str->buffer, buf, str_len);
-  }
+       }
 }
 
 /*******************************************************************
@@ -860,7 +854,7 @@ BOOL smb_io_string2(const char *desc, STRING2 *str2, uint32 buffer, prs_struct *
                
                if(!prs_uint32("str_max_len", ps, depth, &str2->str_max_len))
                        return False;
-               if(!prs_uint32("undoc      ", ps, depth, &str2->undoc))
+               if(!prs_uint32("offset     ", ps, depth, &str2->offset))
                        return False;
                if(!prs_uint32("str_str_len", ps, depth, &str2->str_str_len))
                        return False;
@@ -885,34 +879,43 @@ BOOL smb_io_string2(const char *desc, STRING2 *str2, uint32 buffer, prs_struct *
  Inits a UNISTR2 structure.
 ********************************************************************/
 
-void init_unistr2(UNISTR2 *str, const char *buf, size_t len)
+void init_unistr2(UNISTR2 *str, const char *buf, enum unistr2_term_codes flags)
 {
-       ZERO_STRUCTP(str);
+       size_t len = 0;
+       uint32 num_chars = 0;
 
-       /* set up string lengths. */
-       str->uni_max_len = (uint32)len;
-       str->undoc       = 0;
-       str->uni_str_len = (uint32)len;
+       if (buf) {
+               /* We always null terminate the copy. */
+               len = strlen(buf) + 1;
+       }
 
        if (len < MAX_UNISTRLEN)
                len = MAX_UNISTRLEN;
        len *= sizeof(uint16);
 
        str->buffer = (uint16 *)talloc_zero(get_talloc_ctx(), len);
-       if ((str->buffer == NULL) && (len > 0))
-       {
+       if ((str->buffer == NULL) && (len > 0)) {
                smb_panic("init_unistr2: malloc fail\n");
                return;
        }
 
        /*
-        * don't move this test above ! The UNISTR2 must be initialized !!!
+        * The UNISTR2 must be initialized !!!
         * jfm, 7/7/2001.
         */
-       if (buf==NULL)
-               return;
+       if (buf) {
+               rpcstr_push((char *)str->buffer, buf, len, STR_TERMINATE);
+               num_chars = strlen_w(str->buffer);
+               if (flags == STR_TERMINATE || flags == UNI_MAXLEN_TERMINATE) {
+                       num_chars++;
+               }
+       }
 
-       rpcstr_push((char *)str->buffer, buf, len, STR_TERMINATE);
+       str->uni_max_len = num_chars;
+       str->offset = 0;
+       str->uni_str_len = num_chars;
+       if (num_chars && (flags == UNI_MAXLEN_TERMINATE))
+               str->uni_max_len++;
 }
 
 /** 
@@ -932,7 +935,7 @@ void init_unistr2_w(TALLOC_CTX *ctx, UNISTR2 *str, const smb_ucs2_t *buf)
 
        /* set up string lengths. */
        str->uni_max_len = len;
-       str->undoc       = 0;
+       str->offset = 0;
        str->uni_str_len = len;
 
        if (max_len < MAX_UNISTRLEN)
@@ -941,8 +944,7 @@ void init_unistr2_w(TALLOC_CTX *ctx, UNISTR2 *str, const smb_ucs2_t *buf)
        alloc_len = (max_len + 1) * sizeof(uint16);
 
        str->buffer = (uint16 *)talloc_zero(ctx, alloc_len);
-       if ((str->buffer == NULL) && (alloc_len > 0))
-       {
+       if ((str->buffer == NULL) && (alloc_len > 0)) {
                smb_panic("init_unistr2_w: malloc fail\n");
                return;
        }
@@ -963,9 +965,9 @@ void init_unistr2_w(TALLOC_CTX *ctx, UNISTR2 *str, const smb_ucs2_t *buf)
 /*******************************************************************
  Inits a UNISTR2 structure from a UNISTR
 ********************************************************************/
-void init_unistr2_from_unistr (UNISTR2 *to, const UNISTR *from)
-{
 
+void init_unistr2_from_unistr(UNISTR2 *to, const UNISTR *from)
+{
        uint32 i;
 
        /* the destination UNISTR2 should never be NULL.
@@ -987,7 +989,7 @@ void init_unistr2_from_unistr (UNISTR2 *to, const UNISTR *from)
        /* set up string lengths; uni_max_len is set to i+1
            because we need to account for the final NULL termination */
        to->uni_max_len = i;
-       to->undoc       = 0;
+       to->offset = 0;
        to->uni_str_len = i;
 
        /* allocate the space and copy the string buffer */
@@ -995,11 +997,9 @@ void init_unistr2_from_unistr (UNISTR2 *to, const UNISTR *from)
        if (to->buffer == NULL)
                smb_panic("init_unistr2_from_unistr: malloc fail\n");
        memcpy(to->buffer, from->buffer, to->uni_max_len*sizeof(uint16));
-               
        return;
 }
 
-
 /*******************************************************************
  Reads or writes a UNISTR2 structure.
  XXXX NOTE: UNISTR2 structures need NOT be null-terminated.
@@ -1022,7 +1022,7 @@ BOOL smb_io_unistr2(const char *desc, UNISTR2 *uni2, uint32 buffer, prs_struct *
                
                if(!prs_uint32("uni_max_len", ps, depth, &uni2->uni_max_len))
                        return False;
-               if(!prs_uint32("undoc      ", ps, depth, &uni2->undoc))
+               if(!prs_uint32("offset     ", ps, depth, &uni2->offset))
                        return False;
                if(!prs_uint32("uni_str_len", ps, depth, &uni2->uni_str_len))
                        return False;
@@ -1064,7 +1064,7 @@ BOOL init_unistr2_array(UNISTR2_ARRAY *array,
        }
 
        for (i=0;i<count;i++) {
-               init_unistr2(&array->strings[i].string, strings[i], strlen(strings[i]));
+               init_unistr2(&array->strings[i].string, strings[i], UNI_FLAGS_NONE);
                array->strings[i].size = array->strings[i].string.uni_max_len*2;
                array->strings[i].length = array->strings[i].size;
                array->strings[i].ref_id = 1;
@@ -1223,14 +1223,14 @@ static void init_clnt_srv(DOM_CLNT_SRV *logcln, const char *logon_srv, const cha
 
        if (logon_srv != NULL) {
                logcln->undoc_buffer = 1;
-               init_unistr2(&logcln->uni_logon_srv, logon_srv, strlen(logon_srv)+1);
+               init_unistr2(&logcln->uni_logon_srv, logon_srv, UNI_STR_TERMINATE);
        } else {
                logcln->undoc_buffer = 0;
        }
 
        if (comp_name != NULL) {
                logcln->undoc_buffer2 = 1;
-               init_unistr2(&logcln->uni_comp_name, comp_name, strlen(comp_name)+1);
+               init_unistr2(&logcln->uni_comp_name, comp_name, UNI_STR_TERMINATE);
        } else {
                logcln->undoc_buffer2 = 0;
        }
@@ -1284,12 +1284,12 @@ void init_log_info(DOM_LOG_INFO *loginfo, const char *logon_srv, const char *acc
 
        loginfo->undoc_buffer = 1;
 
-       init_unistr2(&loginfo->uni_logon_srv, logon_srv, strlen(logon_srv)+1);
-       init_unistr2(&loginfo->uni_acct_name, acct_name, strlen(acct_name)+1);
+       init_unistr2(&loginfo->uni_logon_srv, logon_srv, UNI_STR_TERMINATE);
+       init_unistr2(&loginfo->uni_acct_name, acct_name, UNI_STR_TERMINATE);
 
        loginfo->sec_chan = sec_chan;
 
-       init_unistr2(&loginfo->uni_comp_name, comp_name, strlen(comp_name)+1);
+       init_unistr2(&loginfo->uni_comp_name, comp_name, UNI_STR_TERMINATE);
 }
 
 /*******************************************************************
index dd319df5a0fcfe8fb72414055c4611d43df992f8..3b096e088ab2aa19dbd62bbf4178d14e94970645 100644 (file)
@@ -136,16 +136,15 @@ static BOOL net_io_netinfo_1(const char *desc, NETLOGON_INFO_1 *info, prs_struct
 static void init_netinfo_2(NETLOGON_INFO_2 *info, uint32 flags, uint32 pdc_status,
                                uint32 tc_status, const char *trusted_dc_name)
 {
-       int len_dc_name = strlen(trusted_dc_name);
        info->flags      = flags;
        info->pdc_status = pdc_status;
        info->ptr_trusted_dc_name = 1;
        info->tc_status  = tc_status;
 
        if (trusted_dc_name != NULL)
-               init_unistr2(&info->uni_trusted_dc_name, trusted_dc_name, len_dc_name+1);
+               init_unistr2(&info->uni_trusted_dc_name, trusted_dc_name, UNI_STR_TERMINATE);
        else
-               init_unistr2(&info->uni_trusted_dc_name, "", 1);
+               init_unistr2(&info->uni_trusted_dc_name, "", UNI_STR_TERMINATE);
 }
 
 /*******************************************************************
@@ -230,7 +229,7 @@ void init_net_q_logon_ctrl2(NET_Q_LOGON_CTRL2 *q_l, const char *srv_name,
        q_l->query_level = query_level;
        q_l->switch_value  = 0x01;
 
-       init_unistr2(&q_l->uni_server_name, srv_name, strlen(srv_name) + 1);
+       init_unistr2(&q_l->uni_server_name, srv_name, UNI_STR_TERMINATE);
 }
 
 /*******************************************************************
@@ -360,7 +359,7 @@ void init_net_q_logon_ctrl(NET_Q_LOGON_CTRL *q_l, const char *srv_name,
        q_l->function_code = 0x01; /* ??? */
        q_l->query_level = query_level;
 
-       init_unistr2(&q_l->uni_server_name, srv_name, strlen(srv_name) + 1);
+       init_unistr2(&q_l->uni_server_name, srv_name, UNI_STR_TERMINATE);
 }
 
 /*******************************************************************
@@ -447,9 +446,9 @@ void init_r_trust_dom(NET_R_TRUST_DOM_LIST *r_t,
                fstring domain_name;
                fstrcpy(domain_name, dom_name);
                strupper_m(domain_name);
-               init_unistr2(&r_t->uni_trust_dom_name[i], domain_name, strlen(domain_name)+1);
+               init_unistr2(&r_t->uni_trust_dom_name[i], domain_name, UNI_STR_TERMINATE);
                /* the use of UNISTR2 here is non-standard. */
-               r_t->uni_trust_dom_name[i].undoc = 0x1;
+               r_t->uni_trust_dom_name[i].offset = 0x1;
        }
        
        r_t->status = NT_STATUS_OK;
@@ -539,8 +538,8 @@ void init_q_req_chal(NET_Q_REQ_CHAL *q_c,
 
        q_c->undoc_buffer = 1; /* don't know what this buffer is */
 
-       init_unistr2(&q_c->uni_logon_srv, logon_srv , strlen(logon_srv )+1);
-       init_unistr2(&q_c->uni_logon_clnt, logon_clnt, strlen(logon_clnt)+1);
+       init_unistr2(&q_c->uni_logon_srv, logon_srv , UNI_STR_TERMINATE);
+       init_unistr2(&q_c->uni_logon_clnt, logon_clnt, UNI_STR_TERMINATE);
 
        memcpy(q_c->clnt_chal.data, clnt_chal->data, sizeof(clnt_chal->data));
 
@@ -910,10 +909,6 @@ void init_id_info1(NET_ID_INFO_1 *id, const char *domain_name,
                                const char *sess_key,
                                unsigned char lm_cypher[16], unsigned char nt_cypher[16])
 {
-       int len_domain_name = strlen(domain_name);
-       int len_user_name   = strlen(user_name  );
-       int len_wksta_name  = strlen(wksta_name );
-
        unsigned char lm_owf[16];
        unsigned char nt_owf[16];
 
@@ -921,13 +916,9 @@ void init_id_info1(NET_ID_INFO_1 *id, const char *domain_name,
 
        id->ptr_id_info1 = 1;
 
-       init_uni_hdr(&id->hdr_domain_name, len_domain_name);
-
        id->param_ctrl = param_ctrl;
        init_logon_id(&id->logon_id, log_id_low, log_id_high);
 
-       init_uni_hdr(&id->hdr_user_name, len_user_name);
-       init_uni_hdr(&id->hdr_wksta_name, len_wksta_name);
 
        if (lm_cypher && nt_cypher) {
                unsigned char key[16];
@@ -962,9 +953,12 @@ void init_id_info1(NET_ID_INFO_1 *id, const char *domain_name,
        init_owf_info(&id->lm_owf, lm_cypher);
        init_owf_info(&id->nt_owf, nt_cypher);
 
-       init_unistr2(&id->uni_domain_name, domain_name, len_domain_name);
-       init_unistr2(&id->uni_user_name, user_name, len_user_name);
-       init_unistr2(&id->uni_wksta_name, wksta_name, len_wksta_name);
+       init_unistr2(&id->uni_domain_name, domain_name, UNI_FLAGS_NONE);
+       init_uni_hdr(&id->hdr_domain_name, &id->uni_domain_name);
+       init_unistr2(&id->uni_user_name, user_name, UNI_FLAGS_NONE);
+       init_uni_hdr(&id->hdr_user_name, &id->uni_user_name);
+       init_unistr2(&id->uni_wksta_name, wksta_name, UNI_FLAGS_NONE);
+       init_uni_hdr(&id->hdr_wksta_name, &id->uni_wksta_name);
 }
 
 /*******************************************************************
@@ -1041,9 +1035,6 @@ void init_id_info2(NET_ID_INFO_2 * id, const char *domain_name,
                   const uchar * lm_chal_resp, size_t lm_chal_resp_len,
                   const uchar * nt_chal_resp, size_t nt_chal_resp_len)
 {
-       size_t len_domain_name = strlen(domain_name);
-       size_t len_user_name   = strlen(user_name  );
-       size_t len_wksta_name  = strlen(wksta_name );
        unsigned char lm_owf[24];
        unsigned char nt_owf[128];
 
@@ -1051,14 +1042,10 @@ void init_id_info2(NET_ID_INFO_2 * id, const char *domain_name,
 
        id->ptr_id_info2 = 1;
 
-       init_uni_hdr(&id->hdr_domain_name, len_domain_name);
 
        id->param_ctrl = param_ctrl;
        init_logon_id(&id->logon_id, log_id_low, log_id_high);
 
-       init_uni_hdr(&id->hdr_user_name, len_user_name);
-       init_uni_hdr(&id->hdr_wksta_name, len_wksta_name);
-
        if (nt_chal_resp) {
                /* oops.  can only send what-ever-it-is direct */
                memcpy(nt_owf, nt_chal_resp, MIN(sizeof(nt_owf), nt_chal_resp_len));
@@ -1074,9 +1061,12 @@ void init_id_info2(NET_ID_INFO_2 * id, const char *domain_name,
        init_str_hdr(&id->hdr_nt_chal_resp, nt_chal_resp_len, nt_chal_resp_len, (nt_chal_resp != NULL) ? 1 : 0);
        init_str_hdr(&id->hdr_lm_chal_resp, lm_chal_resp_len, lm_chal_resp_len, (lm_chal_resp != NULL) ? 1 : 0);
 
-       init_unistr2(&id->uni_domain_name, domain_name, len_domain_name);
-       init_unistr2(&id->uni_user_name, user_name, len_user_name);
-       init_unistr2(&id->uni_wksta_name, wksta_name, len_wksta_name);
+       init_unistr2(&id->uni_domain_name, domain_name, UNI_FLAGS_NONE);
+       init_uni_hdr(&id->hdr_domain_name, &id->uni_domain_name);
+       init_unistr2(&id->uni_user_name, user_name, UNI_FLAGS_NONE);
+       init_uni_hdr(&id->hdr_user_name, &id->uni_user_name);
+       init_unistr2(&id->uni_wksta_name, wksta_name, UNI_FLAGS_NONE);
+       init_uni_hdr(&id->hdr_wksta_name, &id->uni_wksta_name);
 
        init_string2(&id->nt_chal_resp, (const char *)nt_chal_resp, nt_chal_resp_len, nt_chal_resp_len);
        init_string2(&id->lm_chal_resp, (const char *)lm_chal_resp, lm_chal_resp_len, lm_chal_resp_len);
@@ -1288,26 +1278,10 @@ void init_net_user_info3(TALLOC_CTX *ctx, NET_USER_INFO_3 *usr,
                        pass_last_set_time, pass_can_change_time,
                        pass_must_change_time;
 
-       int             len_user_name, len_full_name, len_home_dir,
-                       len_dir_drive, len_logon_script, len_profile_path;
-                       
-       int len_logon_srv    = strlen(logon_srv);
-       int len_logon_dom    = strlen(logon_dom);
-
-       len_user_name    = strlen(user_name    );
-       len_full_name    = strlen(full_name   );
-       len_home_dir     = strlen(home_dir    );
-       len_dir_drive    = strlen(dir_drive   );
-       len_logon_script = strlen(logon_script);
-       len_profile_path = strlen(profile_path);
-
-
        ZERO_STRUCTP(usr);
 
        usr->ptr_user_info = 1; /* yes, we're bothering to put USER_INFO data here */
 
-       
-
        /* Create NTTIME structs */
        unix_to_nt_time (&logon_time,            unix_logon_time);
        unix_to_nt_time (&logoff_time,           unix_logoff_time);
@@ -1323,13 +1297,6 @@ void init_net_user_info3(TALLOC_CTX *ctx, NET_USER_INFO_3 *usr,
        usr->pass_can_change_time  = pass_can_change_time;
        usr->pass_must_change_time = pass_must_change_time;
 
-       init_uni_hdr(&usr->hdr_user_name, len_user_name);
-       init_uni_hdr(&usr->hdr_full_name, len_full_name);
-       init_uni_hdr(&usr->hdr_logon_script, len_logon_script);
-       init_uni_hdr(&usr->hdr_profile_path, len_profile_path);
-       init_uni_hdr(&usr->hdr_home_dir, len_home_dir);
-       init_uni_hdr(&usr->hdr_dir_drive, len_dir_drive);
-
        usr->logon_count = logon_count;
        usr->bad_pw_count = bad_pw_count;
 
@@ -1345,9 +1312,6 @@ void init_net_user_info3(TALLOC_CTX *ctx, NET_USER_INFO_3 *usr,
        else
                memset((char *)usr->user_sess_key, '\0', sizeof(usr->user_sess_key));
 
-       init_uni_hdr(&usr->hdr_logon_srv, len_logon_srv);
-       init_uni_hdr(&usr->hdr_logon_dom, len_logon_dom);
-
        usr->buffer_dom_id = dom_sid ? 1 : 0; /* yes, we're bothering to put a domain SID in */
 
        memset((char *)usr->padding, '\0', sizeof(usr->padding));
@@ -1357,12 +1321,18 @@ void init_net_user_info3(TALLOC_CTX *ctx, NET_USER_INFO_3 *usr,
        usr->num_other_sids = num_other_sids;
        usr->buffer_other_sids = (num_other_sids != 0) ? 1 : 0; 
        
-       init_unistr2(&usr->uni_user_name, user_name, len_user_name);
-       init_unistr2(&usr->uni_full_name, full_name, len_full_name);
-       init_unistr2(&usr->uni_logon_script, logon_script, len_logon_script);
-       init_unistr2(&usr->uni_profile_path, profile_path, len_profile_path);
-       init_unistr2(&usr->uni_home_dir, home_dir, len_home_dir);
-       init_unistr2(&usr->uni_dir_drive, dir_drive, len_dir_drive);
+       init_unistr2(&usr->uni_user_name, user_name, UNI_FLAGS_NONE);
+       init_uni_hdr(&usr->hdr_user_name, &usr->uni_user_name);
+       init_unistr2(&usr->uni_full_name, full_name, UNI_FLAGS_NONE);
+       init_uni_hdr(&usr->hdr_full_name, &usr->uni_full_name);
+       init_unistr2(&usr->uni_logon_script, logon_script, UNI_FLAGS_NONE);
+       init_uni_hdr(&usr->hdr_logon_script, &usr->uni_logon_script);
+       init_unistr2(&usr->uni_profile_path, profile_path, UNI_FLAGS_NONE);
+       init_uni_hdr(&usr->hdr_profile_path, &usr->uni_profile_path);
+       init_unistr2(&usr->uni_home_dir, home_dir, UNI_FLAGS_NONE);
+       init_uni_hdr(&usr->hdr_home_dir, &usr->uni_home_dir);
+       init_unistr2(&usr->uni_dir_drive, dir_drive, UNI_FLAGS_NONE);
+       init_uni_hdr(&usr->hdr_dir_drive, &usr->uni_dir_drive);
 
        usr->num_groups2 = num_groups;
 
@@ -1373,8 +1343,10 @@ void init_net_user_info3(TALLOC_CTX *ctx, NET_USER_INFO_3 *usr,
        for (i = 0; i < num_groups; i++) 
                usr->gids[i] = gids[i]; 
                
-       init_unistr2(&usr->uni_logon_srv, logon_srv, len_logon_srv);
-       init_unistr2(&usr->uni_logon_dom, logon_dom, len_logon_dom);
+       init_unistr2(&usr->uni_logon_srv, logon_srv, UNI_FLAGS_NONE);
+       init_uni_hdr(&usr->hdr_logon_srv, &usr->uni_logon_srv);
+       init_unistr2(&usr->uni_logon_dom, logon_dom, UNI_FLAGS_NONE);
+       init_uni_hdr(&usr->hdr_logon_dom, &usr->uni_logon_dom);
 
        init_dom_sid2(&usr->dom_sid, dom_sid);
        /* "other" sids are set up above */
@@ -1670,8 +1642,8 @@ BOOL init_net_q_sam_sync(NET_Q_SAM_SYNC * q_s, const char *srv_name,
 {
        DEBUG(5, ("init_q_sam_sync\n"));
 
-       init_unistr2(&q_s->uni_srv_name, srv_name, strlen(srv_name) + 1);
-       init_unistr2(&q_s->uni_cli_name, cli_name, strlen(cli_name) + 1);
+       init_unistr2(&q_s->uni_srv_name, srv_name, UNI_STR_TERMINATE);
+       init_unistr2(&q_s->uni_cli_name, cli_name, UNI_STR_TERMINATE);
 
         if (cli_creds)
                 memcpy(&q_s->cli_creds, cli_creds, sizeof(q_s->cli_creds));
@@ -2858,8 +2830,8 @@ BOOL init_net_q_sam_deltas(NET_Q_SAM_DELTAS *q_s, const char *srv_name,
 {
        DEBUG(5, ("init_net_q_sam_deltas\n"));
 
-       init_unistr2(&q_s->uni_srv_name, srv_name, strlen(srv_name) + 1);
-       init_unistr2(&q_s->uni_cli_name, cli_name, strlen(cli_name) + 1);
+       init_unistr2(&q_s->uni_srv_name, srv_name, UNI_STR_TERMINATE);
+       init_unistr2(&q_s->uni_cli_name, cli_name, UNI_STR_TERMINATE);
 
        memcpy(&q_s->cli_creds, cli_creds, sizeof(q_s->cli_creds));
        memset(&q_s->ret_creds, 0, sizeof(q_s->ret_creds));
index bbf6e6a8e3de9cd5c9e20278951f19ffea0f70e9..69c0dfc75486a9d367a4e5fe238db0c14a5b737e 100644 (file)
@@ -281,18 +281,15 @@ void init_reg_q_create_key(REG_Q_CREATE_KEY *q_c, POLICY_HND *hnd,
                                char *name, char *class, SEC_ACCESS *sam_access,
                                SEC_DESC_BUF *sec_buf)
 {
-       int len_name  = name  != NULL ? strlen(name ) + 1: 0;
-       int len_class = class != NULL ? strlen(class) + 1: 0;
-
        ZERO_STRUCTP(q_c);
 
        memcpy(&q_c->pnt_pol, hnd, sizeof(q_c->pnt_pol));
 
-       init_uni_hdr(&q_c->hdr_name, len_name);
-       init_unistr2(&q_c->uni_name, name, len_name);
+       init_unistr2(&q_c->uni_name, name, UNI_STR_TERMINATE);
+       init_uni_hdr(&q_c->hdr_name, &q_c->uni_name);
 
-       init_uni_hdr(&q_c->hdr_class, len_class);
-       init_unistr2(&q_c->uni_class, class, len_class);
+       init_unistr2(&q_c->uni_class, class, UNI_STR_TERMINATE);
+       init_uni_hdr(&q_c->hdr_class, &q_c->uni_class);
 
        q_c->reserved = 0x00000000;
        memcpy(&q_c->sam_access, sam_access, sizeof(q_c->sam_access));
@@ -397,13 +394,12 @@ BOOL reg_io_r_create_key(const char *desc,  REG_R_CREATE_KEY *r_r, prs_struct *p
 void init_reg_q_delete_val(REG_Q_DELETE_VALUE *q_c, POLICY_HND *hnd,
                                char *name)
 {
-       int len_name  = name  != NULL ? strlen(name ) + 1: 0;
        ZERO_STRUCTP(q_c);
 
        memcpy(&q_c->pnt_pol, hnd, sizeof(q_c->pnt_pol));
 
-       init_uni_hdr(&q_c->hdr_name, len_name);
-       init_unistr2(&q_c->uni_name, name, len_name);
+       init_unistr2(&q_c->uni_name, name, UNI_STR_TERMINATE);
+       init_uni_hdr(&q_c->hdr_name, &q_c->uni_name);
 }
 
 /*******************************************************************
@@ -463,13 +459,12 @@ BOOL reg_io_r_delete_val(const char *desc,  REG_R_DELETE_VALUE *r_r, prs_struct
 void init_reg_q_delete_key(REG_Q_DELETE_KEY *q_c, POLICY_HND *hnd,
                                char *name)
 {
-       int len_name  = name  != NULL ? strlen(name ) + 1: 0;
        ZERO_STRUCTP(q_c);
 
        memcpy(&q_c->pnt_pol, hnd, sizeof(q_c->pnt_pol));
 
-       init_uni_hdr(&q_c->hdr_name, len_name);
-       init_unistr2(&q_c->uni_name, name, len_name);
+       init_unistr2(&q_c->uni_name, name, UNI_STR_TERMINATE);
+       init_uni_hdr(&q_c->hdr_name, &q_c->uni_name);
 }
 
 /*******************************************************************
@@ -525,14 +520,12 @@ BOOL reg_io_r_delete_key(const char *desc,  REG_R_DELETE_KEY *r_r, prs_struct *p
  Inits a structure.
 ********************************************************************/
 
-void init_reg_q_query_key(REG_Q_QUERY_KEY *q_o, POLICY_HND *hnd,
-                               uint32 max_class_len)
+void init_reg_q_query_key(REG_Q_QUERY_KEY *q_o, POLICY_HND *hnd, UNISTR2 *uni2)
 {
        ZERO_STRUCTP(q_o);
 
        memcpy(&q_o->pol, hnd, sizeof(q_o->pol));
-       init_uni_hdr(&q_o->hdr_class, max_class_len);
-       q_o->uni_class.uni_max_len = max_class_len;
+       init_uni_hdr(&q_o->hdr_class, uni2);
 }
 
 /*******************************************************************
@@ -1010,15 +1003,13 @@ makes a structure.
 
 BOOL init_reg_q_info(REG_Q_INFO *q_i, POLICY_HND *pol, char* val_name)
 {
-        int len_type = val_name != NULL ? strlen(val_name) + 1 : 0;
-
         if (q_i == NULL)
                 return False;
 
         q_i->pol = *pol;
 
-        init_uni_hdr(&(q_i->hdr_type), len_type);
-        init_unistr2(&(q_i->uni_type), val_name, len_type);
+        init_unistr2(&q_i->uni_type, val_name, UNI_STR_TERMINATE);
+        init_uni_hdr(&q_i->hdr_type, &q_i->uni_type);
 
         q_i->ptr_reserved = 1;
         q_i->ptr_buf = 1;
@@ -1230,7 +1221,7 @@ makes a structure.
 ********************************************************************/
 
 void init_reg_q_enum_val(REG_Q_ENUM_VALUE *q_i, POLICY_HND *pol,
-                               uint32 val_idx, uint32 max_val_len,
+                               uint32 val_idx, UNISTR2 *uni2,
                                uint32 max_buf_len)
 {
        ZERO_STRUCTP(q_i);
@@ -1238,8 +1229,7 @@ void init_reg_q_enum_val(REG_Q_ENUM_VALUE *q_i, POLICY_HND *pol,
        memcpy(&q_i->pol, pol, sizeof(q_i->pol));
 
        q_i->val_index = val_idx;
-       init_uni_hdr(&q_i->hdr_name, max_val_len);
-       q_i->uni_name.uni_max_len = max_val_len;
+       init_uni_hdr(&q_i->hdr_name, uni2);
        
        q_i->ptr_type = 1;
        q_i->type = 0x0;
@@ -1270,8 +1260,8 @@ void init_reg_r_enum_val(REG_R_ENUM_VALUE *r_u, REGISTRY_VALUE *val )
 
        DEBUG(10,("init_reg_r_enum_val: Valuename => [%s]\n", val->valuename));
        
-       init_uni_hdr( &r_u->hdr_name, strlen(val->valuename)+1 );
-       init_unistr2( &r_u->uni_name, val->valuename, strlen(val->valuename)+1 );
+       init_unistr2( &r_u->uni_name, val->valuename, UNI_STR_TERMINATE);
+       init_uni_hdr( &r_u->hdr_name, &r_u->uni_name);
                
        /* type */
        
@@ -1418,14 +1408,12 @@ void init_reg_q_create_val(REG_Q_CREATE_VALUE *q_i, POLICY_HND *pol,
                                char *val_name, uint32 type,
                                BUFFER3 *val)
 {
-       int val_len = strlen(val_name) + 1;
-
        ZERO_STRUCTP(q_i);
 
        memcpy(&q_i->pol, pol, sizeof(q_i->pol));
 
-       init_uni_hdr(&q_i->hdr_name, val_len);
-       init_unistr2(&q_i->uni_name, val_name, val_len);
+       init_unistr2(&q_i->uni_name, val_name, UNI_STR_TERMINATE);
+       init_uni_hdr(&q_i->hdr_name, &q_i->uni_name);
        
        q_i->type      = type;
        q_i->buf_value = val;
@@ -1650,12 +1638,10 @@ makes a structure.
 void init_reg_q_open_entry(REG_Q_OPEN_ENTRY *r_q, POLICY_HND *pol,
                                char *key_name, uint32 access_desired)
 {
-       int len_name = strlen(key_name)+1;
-
        memcpy(&r_q->pol, pol, sizeof(r_q->pol));
 
-       init_uni_hdr(&r_q->hdr_name, len_name);
-       init_unistr2(&r_q->uni_name, key_name, len_name);
+       init_unistr2(&r_q->uni_name, key_name, UNI_STR_TERMINATE);
+       init_uni_hdr(&r_q->hdr_name, &r_q->uni_name);
 
        r_q->unknown_0 = 0x00000000;
        r_q->access_desired = access_desired;
@@ -1736,29 +1722,27 @@ BOOL reg_io_r_open_entry(const char *desc,  REG_R_OPEN_ENTRY *r_r, prs_struct *p
 /*******************************************************************
 Inits a structure.
 ********************************************************************/
+
 void init_reg_q_shutdown(REG_Q_SHUTDOWN * q_s, const char *msg,
                        uint32 timeout, BOOL do_reboot, BOOL force)
 {
-       int msg_len;
-       msg_len = strlen(msg);
-
        q_s->ptr_0 = 1;
        q_s->ptr_1 = 1;
        q_s->ptr_2 = 1;
 
-       init_uni_hdr(&(q_s->hdr_msg), msg_len);
-       init_unistr2(&(q_s->uni_msg), msg, msg_len);
+       init_unistr2(&q_s->uni_msg, msg, UNI_FLAGS_NONE);
+       init_uni_hdr(&q_s->hdr_msg, &q_s->uni_msg);
 
        q_s->timeout = timeout;
 
        q_s->reboot = do_reboot ? 1 : 0;
        q_s->force = force ? 1 : 0;
-
 }
 
 /*******************************************************************
 reads or writes a structure.
 ********************************************************************/
+
 BOOL reg_io_q_shutdown(const char *desc, REG_Q_SHUTDOWN * q_s, prs_struct *ps,
                       int depth)
 {
index 420a7277651bd959c99aeb5f0e4287bb01223313..939b652a1e3ba8a91b51411c52de64175fa8336e 100644 (file)
@@ -93,14 +93,12 @@ inits a SAMR_Q_LOOKUP_DOMAIN structure.
 void init_samr_q_lookup_domain(SAMR_Q_LOOKUP_DOMAIN * q_u,
                               POLICY_HND *pol, char *dom_name)
 {
-       int len_name = strlen(dom_name);
-
        DEBUG(5, ("init_samr_q_lookup_domain\n"));
 
        q_u->connect_pol = *pol;
 
-       init_uni_hdr(&q_u->hdr_domain, len_name);
-       init_unistr2(&q_u->uni_domain, dom_name, len_name);
+       init_unistr2(&q_u->uni_domain, dom_name, UNI_FLAGS_NONE);
+       init_uni_hdr(&q_u->hdr_domain, &q_u->uni_domain);
 }
 
 /*******************************************************************
@@ -630,13 +628,11 @@ static BOOL sam_io_unk_info12(const char *desc, SAM_UNK_INFO_12 * u_12,
 /*******************************************************************
 inits a structure.
 ********************************************************************/
+
 void init_unk_info5(SAM_UNK_INFO_5 * u_5,const char *server)
 {
-       int len_server = strlen(server);
-
-       init_uni_hdr(&u_5->hdr_server, len_server);
-
-       init_unistr2(&u_5->uni_server, server, len_server);
+       init_unistr2(&u_5->uni_server, server, UNI_FLAGS_NONE);
+       init_uni_hdr(&u_5->hdr_server, &u_5->uni_server);
 }
 
 /*******************************************************************
@@ -664,20 +660,16 @@ static BOOL sam_io_unk_info5(const char *desc, SAM_UNK_INFO_5 * u_5,
 /*******************************************************************
 inits a structure.
 ********************************************************************/
+
 void init_unk_info2(SAM_UNK_INFO_2 * u_2,
                        const char *domain, const char *server,
                        uint32 seq_num, uint32 num_users, uint32 num_groups, uint32 num_alias)
 {
-       int len_domain = strlen(domain);
-       int len_server = strlen(server);
-
        u_2->unknown_0 = 0x00000000;
        u_2->unknown_1 = 0x80000000;
        u_2->unknown_2 = 0x00000000;
 
        u_2->ptr_0 = 1;
-       init_uni_hdr(&u_2->hdr_domain, len_domain);
-       init_uni_hdr(&u_2->hdr_server, len_server);
 
        u_2->seq_num = seq_num;
        u_2->unknown_3 = 0x00000000;
@@ -691,8 +683,10 @@ void init_unk_info2(SAM_UNK_INFO_2 * u_2,
 
        memset(u_2->padding, 0, sizeof(u_2->padding));  /* 12 bytes zeros */
 
-       init_unistr2(&u_2->uni_domain, domain, len_domain);
-       init_unistr2(&u_2->uni_server, server, len_server);
+       init_unistr2(&u_2->uni_domain, domain, UNI_FLAGS_NONE);
+       init_uni_hdr(&u_2->hdr_domain, &u_2->uni_domain);
+       init_unistr2(&u_2->uni_server, server, UNI_FLAGS_NONE);
+       init_uni_hdr(&u_2->hdr_server, &u_2->uni_server);
 }
 
 /*******************************************************************
@@ -984,9 +978,9 @@ static BOOL sam_io_sam_str1(const char *desc, SAM_STR1 * sam, uint32 acct_buf,
 inits a SAM_ENTRY1 structure.
 ********************************************************************/
 
-static void init_sam_entry1(SAM_ENTRY1 * sam, uint32 user_idx,
-                           uint32 len_sam_name, uint32 len_sam_full,
-                           uint32 len_sam_desc, uint32 rid_user,
+static void init_sam_entry1(SAM_ENTRY1 *sam, uint32 user_idx,
+                           UNISTR2 *sam_name, UNISTR2 *sam_full,
+                           UNISTR2 *sam_desc, uint32 rid_user,
                            uint16 acb_info)
 {
        DEBUG(5, ("init_sam_entry1\n"));
@@ -997,9 +991,9 @@ static void init_sam_entry1(SAM_ENTRY1 * sam, uint32 user_idx,
        sam->rid_user = rid_user;
        sam->acb_info = acb_info;
 
-       init_uni_hdr(&sam->hdr_acct_name, len_sam_name);
-       init_uni_hdr(&sam->hdr_user_name, len_sam_full);
-       init_uni_hdr(&sam->hdr_user_desc, len_sam_desc);
+       init_uni_hdr(&sam->hdr_acct_name, sam_name);
+       init_uni_hdr(&sam->hdr_user_name, sam_full);
+       init_uni_hdr(&sam->hdr_user_desc, sam_desc);
 }
 
 /*******************************************************************
@@ -1067,7 +1061,7 @@ static BOOL sam_io_sam_str2(const char *desc, SAM_STR2 * sam, uint32 acct_buf,
 inits a SAM_ENTRY2 structure.
 ********************************************************************/
 static void init_sam_entry2(SAM_ENTRY2 * sam, uint32 user_idx,
-                           uint32 len_sam_name, uint32 len_sam_desc,
+                           UNISTR2 *sam_name, UNISTR2 *sam_desc,
                            uint32 rid_user, uint16 acb_info)
 {
        DEBUG(5, ("init_sam_entry2\n"));
@@ -1076,8 +1070,8 @@ static void init_sam_entry2(SAM_ENTRY2 * sam, uint32 user_idx,
        sam->rid_user = rid_user;
        sam->acb_info = acb_info;
 
-       init_uni_hdr(&sam->hdr_srv_name, len_sam_name);
-       init_uni_hdr(&sam->hdr_srv_desc, len_sam_desc);
+       init_uni_hdr(&sam->hdr_srv_name, sam_name);
+       init_uni_hdr(&sam->hdr_srv_desc, sam_desc);
 }
 
 /*******************************************************************
@@ -1144,7 +1138,7 @@ inits a SAM_ENTRY3 structure.
 ********************************************************************/
 
 static void init_sam_entry3(SAM_ENTRY3 * sam, uint32 grp_idx,
-                           uint32 len_grp_name, uint32 len_grp_desc,
+                           UNISTR2 *grp_name, UNISTR2 *grp_desc,
                            uint32 rid_grp)
 {
        DEBUG(5, ("init_sam_entry3\n"));
@@ -1153,8 +1147,8 @@ static void init_sam_entry3(SAM_ENTRY3 * sam, uint32 grp_idx,
        sam->rid_grp = rid_grp;
        sam->attr = 0x07;       /* group rid attributes - gets ignored by nt 4.0 */
 
-       init_uni_hdr(&sam->hdr_grp_name, len_grp_name);
-       init_uni_hdr(&sam->hdr_grp_desc, len_grp_desc);
+       init_uni_hdr(&sam->hdr_grp_name, grp_name);
+       init_uni_hdr(&sam->hdr_grp_desc, grp_desc);
 }
 
 /*******************************************************************
@@ -1268,12 +1262,12 @@ static BOOL sam_io_sam_entry5(const char *desc, SAM_ENTRY5 * sam,
 inits a SAM_ENTRY structure.
 ********************************************************************/
 
-void init_sam_entry(SAM_ENTRY * sam, uint32 len_sam_name, uint32 rid)
+void init_sam_entry(SAM_ENTRY *sam, UNISTR2 *uni2, uint32 rid)
 {
-       DEBUG(10, ("init_sam_entry: %d %d\n", len_sam_name, rid));
+       DEBUG(10, ("init_sam_entry: %d\n", rid));
 
        sam->rid = rid;
-       init_uni_hdr(&sam->hdr_name, len_sam_name);
+       init_uni_hdr(&sam->hdr_name, uni2);
 }
 
 /*******************************************************************
@@ -1502,7 +1496,6 @@ NTSTATUS init_sam_dispinfo_1(TALLOC_CTX *ctx, SAM_DISPINFO_1 *sam, uint32 num_en
                             uint32 start_idx, SAM_ACCOUNT *disp_user_info,
                             DOM_SID *domain_sid)
 {
-       uint32 len_sam_name, len_sam_full, len_sam_desc;
        uint32 i;
 
        SAM_ACCOUNT *pwd = NULL;
@@ -1560,21 +1553,14 @@ NTSTATUS init_sam_dispinfo_1(TALLOC_CTX *ctx, SAM_DISPINFO_1 *sam, uint32 num_en
                        return NT_STATUS_UNSUCCESSFUL;
                }
                        
-               len_sam_name = strlen(username);
-               len_sam_full = strlen(fullname);
-               len_sam_desc = strlen(acct_desc);
+               init_unistr2(&sam->str[i].uni_acct_name, pdb_get_username(pwd), UNI_FLAGS_NONE);
+               init_unistr2(&sam->str[i].uni_full_name, pdb_get_fullname(pwd), UNI_FLAGS_NONE);
+               init_unistr2(&sam->str[i].uni_acct_desc, pdb_get_acct_desc(pwd), UNI_FLAGS_NONE);
 
                init_sam_entry1(&sam->sam[i], start_idx + i + 1,
-                               len_sam_name, len_sam_full, len_sam_desc,
+                               &sam->str[i].uni_acct_name, &sam->str[i].uni_full_name, &sam->str[i].uni_acct_desc,
                                user_rid, pdb_get_acct_ctrl(pwd));
                
-               ZERO_STRUCTP(&sam->str[i].uni_acct_name);
-               ZERO_STRUCTP(&sam->str[i].uni_full_name);
-               ZERO_STRUCTP(&sam->str[i].uni_acct_desc);
-
-               init_unistr2(&sam->str[i].uni_acct_name, pdb_get_username(pwd),  len_sam_name);
-               init_unistr2(&sam->str[i].uni_full_name, pdb_get_fullname(pwd),  len_sam_full);
-               init_unistr2(&sam->str[i].uni_acct_desc, pdb_get_acct_desc(pwd), len_sam_desc);
        }
 
        return NT_STATUS_OK;
@@ -1637,7 +1623,6 @@ NTSTATUS init_sam_dispinfo_2(TALLOC_CTX *ctx, SAM_DISPINFO_2 *sam, uint32 num_en
                             uint32 start_idx, SAM_ACCOUNT *disp_user_info, 
                             DOM_SID *domain_sid )
 {
-       uint32 len_sam_name, len_sam_desc;
        uint32 i;
 
        SAM_ACCOUNT *pwd = NULL;
@@ -1680,18 +1665,12 @@ NTSTATUS init_sam_dispinfo_2(TALLOC_CTX *ctx, SAM_DISPINFO_2 *sam, uint32 num_en
                        return NT_STATUS_UNSUCCESSFUL;
                }
                        
-               len_sam_name = strlen(username);
-               len_sam_desc = strlen(acct_desc);
-         
+               init_unistr2(&sam->str[i].uni_srv_name, username, UNI_FLAGS_NONE);
+               init_unistr2(&sam->str[i].uni_srv_desc, pdb_get_acct_desc(pwd), UNI_FLAGS_NONE);
+
                init_sam_entry2(&sam->sam[i], start_idx + i + 1,
-                         len_sam_name, len_sam_desc,
+                         &sam->str[i].uni_srv_name, &sam->str[i].uni_srv_desc,
                          user_rid, pdb_get_acct_ctrl(pwd));
-         
-               ZERO_STRUCTP(&sam->str[i].uni_srv_name);
-               ZERO_STRUCTP(&sam->str[i].uni_srv_desc);
-
-               init_unistr2(&sam->str[i].uni_srv_name, username,  len_sam_name);
-               init_unistr2(&sam->str[i].uni_srv_desc, pdb_get_acct_desc(pwd), len_sam_desc);
        }
 
        return NT_STATUS_OK;
@@ -1755,7 +1734,6 @@ inits a SAM_DISPINFO_3 structure.
 NTSTATUS init_sam_dispinfo_3(TALLOC_CTX *ctx, SAM_DISPINFO_3 *sam, uint32 num_entries,
                         uint32 start_idx, DOMAIN_GRP *disp_group_info)
 {
-       uint32 len_sam_name, len_sam_desc;
        uint32 i;
 
        ZERO_STRUCTP(sam);
@@ -1779,13 +1757,11 @@ NTSTATUS init_sam_dispinfo_3(TALLOC_CTX *ctx, SAM_DISPINFO_3 *sam, uint32 num_en
 
                DEBUG(11, ("init_sam_dispinfo_3: entry: %d\n",i));
 
-               len_sam_name = strlen(grp->name);
-               len_sam_desc = strlen(grp->comment);
+               init_unistr2(&sam->str[i].uni_grp_name, grp->name, UNI_FLAGS_NONE);
+               init_unistr2(&sam->str[i].uni_grp_desc, grp->comment, UNI_FLAGS_NONE);
 
-               init_sam_entry3(&sam->sam[i], start_idx + i + 1, len_sam_name, len_sam_desc, grp->rid);
-         
-               init_unistr2(&sam->str[i].uni_grp_name, grp->name, len_sam_name);
-               init_unistr2(&sam->str[i].uni_grp_desc, grp->comment, len_sam_desc);
+               init_sam_entry3(&sam->sam[i], start_idx + i + 1, &sam->str[i].uni_grp_name,
+                               &sam->str[i].uni_grp_desc, grp->rid);
        }
 
        return NT_STATUS_OK;
@@ -2210,20 +2186,15 @@ void init_samr_group_info1(GROUP_INFO1 * gr1,
                           char *acct_name, char *acct_desc,
                           uint32 num_members)
 {
-       int desc_len = acct_desc != NULL ? strlen(acct_desc) : 0;
-       int acct_len = acct_name != NULL ? strlen(acct_name) : 0;
-
        DEBUG(5, ("init_samr_group_info1\n"));
 
-       init_uni_hdr(&gr1->hdr_acct_name, acct_len);
-
        gr1->unknown_1 = 0x3;
        gr1->num_members = num_members;
 
-       init_uni_hdr(&gr1->hdr_acct_desc, desc_len);
-
-       init_unistr2(&gr1->uni_acct_name, acct_name, acct_len);
-       init_unistr2(&gr1->uni_acct_desc, acct_desc, desc_len);
+       init_unistr2(&gr1->uni_acct_name, acct_name, UNI_FLAGS_NONE);
+       init_uni_hdr(&gr1->hdr_acct_name, &gr1->uni_acct_name);
+       init_unistr2(&gr1->uni_acct_desc, acct_desc, UNI_FLAGS_NONE);
+       init_uni_hdr(&gr1->hdr_acct_desc, &gr1->uni_acct_desc);
 }
 
 /*******************************************************************
@@ -2302,12 +2273,10 @@ inits a GROUP_INFO4 structure.
 
 void init_samr_group_info4(GROUP_INFO4 * gr4, char *acct_desc)
 {
-       int acct_len = acct_desc != NULL ? strlen(acct_desc) : 0;
-
        DEBUG(5, ("init_samr_group_info4\n"));
 
-       init_uni_hdr(&gr4->hdr_acct_desc, acct_len);
-       init_unistr2(&gr4->uni_acct_desc, acct_desc, acct_len);
+       init_unistr2(&gr4->uni_acct_desc, acct_desc, UNI_FLAGS_NONE);
+       init_uni_hdr(&gr4->hdr_acct_desc, &gr4->uni_acct_desc);
 }
 
 /*******************************************************************
@@ -2383,14 +2352,12 @@ void init_samr_q_create_dom_group(SAMR_Q_CREATE_DOM_GROUP * q_e,
                                  POLICY_HND *pol, char *acct_desc,
                                  uint32 access_mask)
 {
-       int acct_len = acct_desc != NULL ? strlen(acct_desc) : 0;
-
        DEBUG(5, ("init_samr_q_create_dom_group\n"));
 
        q_e->pol = *pol;
 
-       init_uni_hdr(&q_e->hdr_acct_desc, acct_len);
-       init_unistr2(&q_e->uni_acct_desc, acct_desc, acct_len);
+       init_unistr2(&q_e->uni_acct_desc, acct_desc, UNI_FLAGS_NONE);
+       init_uni_hdr(&q_e->hdr_acct_desc, &q_e->uni_acct_desc);
 
        q_e->access_mask = access_mask;
 }
@@ -3502,18 +3469,15 @@ inits a ALIAS_INFO1 structure.
 
 void init_samr_alias_info1(ALIAS_INFO1 * al1, char *acct_name, uint32 num_member, char *acct_desc)
 {
-       int acct_len_name = acct_name != NULL ? strlen(acct_name) : 0;
-       int acct_len_desc = acct_desc != NULL ? strlen(acct_desc) : 0;
-
        DEBUG(5, ("init_samr_alias_info1\n"));
 
-       init_uni_hdr(&al1->hdr_acct_name, acct_len_name);
-       init_unistr2(&al1->uni_acct_name, acct_name, acct_len_name);
+       init_unistr2(&al1->uni_acct_name, acct_name, UNI_FLAGS_NONE);
+       init_uni_hdr(&al1->hdr_acct_name, &al1->uni_acct_name);
 
        al1->num_member=num_member;
 
-       init_uni_hdr(&al1->hdr_acct_desc, acct_len_desc);
-       init_unistr2(&al1->uni_acct_desc, acct_desc, acct_len_desc);
+       init_unistr2(&al1->uni_acct_desc, acct_desc, UNI_FLAGS_NONE);
+       init_uni_hdr(&al1->hdr_acct_desc, &al1->uni_acct_name);
 }
 
 /*******************************************************************
@@ -3559,12 +3523,10 @@ inits a ALIAS_INFO3 structure.
 
 void init_samr_alias_info3(ALIAS_INFO3 * al3, char *acct_desc)
 {
-       int acct_len = acct_desc != NULL ? strlen(acct_desc) : 0;
-
        DEBUG(5, ("init_samr_alias_info3\n"));
 
-       init_uni_hdr(&al3->hdr_acct_desc, acct_len);
-       init_unistr2(&al3->uni_acct_desc, acct_desc, acct_len);
+       init_unistr2(&al3->uni_acct_desc, acct_desc, UNI_FLAGS_NONE);
+       init_uni_hdr(&al3->hdr_acct_desc, &al3->uni_acct_desc);
 }
 
 /*******************************************************************
@@ -4272,14 +4234,12 @@ inits a SAMR_Q_CREATE_DOM_ALIAS structure.
 void init_samr_q_create_dom_alias(SAMR_Q_CREATE_DOM_ALIAS * q_u,
                                  POLICY_HND *hnd, char *acct_desc)
 {
-       int acct_len = acct_desc != NULL ? strlen(acct_desc) : 0;
-
        DEBUG(5, ("init_samr_q_create_dom_alias\n"));
 
        q_u->dom_pol = *hnd;
 
-       init_uni_hdr(&q_u->hdr_acct_desc, acct_len);
-       init_unistr2(&q_u->uni_acct_desc, acct_desc, acct_len);
+       init_unistr2(&q_u->uni_acct_desc, acct_desc, UNI_FLAGS_NONE);
+       init_uni_hdr(&q_u->hdr_acct_desc, &q_u->uni_acct_desc);
 
        q_u->access_mask = 0x001f000f;
 }
@@ -4675,9 +4635,8 @@ NTSTATUS init_samr_q_lookup_names(TALLOC_CTX *ctx, SAMR_Q_LOOKUP_NAMES * q_u,
                return NT_STATUS_NO_MEMORY;
 
        for (i = 0; i < num_names; i++) {
-               int len_name = name[i] != NULL ? strlen(name[i]) : 0;
-               init_uni_hdr(&q_u->hdr_name[i], len_name);      /* unicode header for user_name */
-               init_unistr2(&q_u->uni_name[i], name[i], len_name);     /* unicode string for machine account */
+               init_unistr2(&q_u->uni_name[i], name[i], UNI_FLAGS_NONE);       /* unicode string for machine account */
+               init_uni_hdr(&q_u->hdr_name[i], &q_u->uni_name[i]);     /* unicode header for user_name */
        }
 
        return NT_STATUS_OK;
@@ -5013,15 +4972,12 @@ void init_samr_q_create_user(SAMR_Q_CREATE_USER * q_u,
                             const char *name,
                             uint32 acb_info, uint32 access_mask)
 {
-       int len_name;
-       len_name = strlen(name);
-
        DEBUG(5, ("samr_init_samr_q_create_user\n"));
 
        q_u->domain_pol = *pol;
 
-       init_uni_hdr(&q_u->hdr_name, len_name);
-       init_unistr2(&q_u->uni_name, name, len_name);
+       init_unistr2(&q_u->uni_name, name, UNI_FLAGS_NONE);
+       init_uni_hdr(&q_u->hdr_name, &q_u->uni_name);
 
        q_u->acb_info = acb_info;
        q_u->access_mask = access_mask;
@@ -5244,16 +5200,11 @@ void init_sam_user_info11(SAM_USER_INFO_11 * usr,
                          char *mach_acct,
                          uint32 rid_user, uint32 rid_group, uint16 acct_ctrl)
 {
-       int len_mach_acct;
-
        DEBUG(5, ("init_sam_user_info11\n"));
 
-       len_mach_acct = strlen(mach_acct);
-
-       memcpy(&(usr->expiry), expiry, sizeof(usr->expiry));    /* expiry time or something? */
+       memcpy(&usr->expiry, expiry, sizeof(usr->expiry));      /* expiry time or something? */
        ZERO_STRUCT(usr->padding_1);    /* 0 - padding 24 bytes */
 
-       init_uni_hdr(&usr->hdr_mach_acct, len_mach_acct);       /* unicode header for machine account */
        usr->padding_2 = 0;     /* 0 - padding 4 bytes */
 
        usr->ptr_1 = 1;         /* pointer */
@@ -5278,7 +5229,8 @@ void init_sam_user_info11(SAM_USER_INFO_11 * usr,
        ZERO_STRUCT(usr->padding_7);    /* 0 - padding 16 bytes */
        usr->padding_8 = 0;     /* 0 - padding 4 bytes */
 
-       init_unistr2(&usr->uni_mach_acct, mach_acct, len_mach_acct);    /* unicode string for machine account */
+       init_unistr2(&usr->uni_mach_acct, mach_acct, UNI_FLAGS_NONE);   /* unicode string for machine account */
+       init_uni_hdr(&usr->hdr_mach_acct, &usr->uni_mach_acct); /* unicode header for machine account */
 }
 
 /*******************************************************************
@@ -5441,17 +5393,6 @@ void init_sam_user_info23W(SAM_USER_INFO_23 * usr, NTTIME * logon_time,  /* all z
                        uint16 logon_count,
                        char newpass[516], uint32 unknown_6)
 {
-       int len_user_name = user_name != NULL ? user_name->uni_str_len : 0;
-       int len_full_name = full_name != NULL ? full_name->uni_str_len : 0;
-       int len_home_dir = home_dir != NULL ? home_dir->uni_str_len : 0;
-       int len_dir_drive = dir_drive != NULL ? dir_drive->uni_str_len : 0;
-       int len_logon_script = log_scr != NULL ? log_scr->uni_str_len : 0;
-       int len_profile_path = prof_path != NULL ? prof_path->uni_str_len : 0;
-       int len_description = desc != NULL ? desc->uni_str_len : 0;
-       int len_workstations = wkstas != NULL ? wkstas->uni_str_len : 0;
-       int len_unknown_str = unk_str != NULL ? unk_str->uni_str_len : 0;
-       int len_munged_dial = mung_dial != NULL ? mung_dial->uni_str_len : 0;
-
        usr->logon_time = *logon_time;  /* all zeros */
        usr->logoff_time = *logoff_time;        /* all zeros */
        usr->kickoff_time = *kickoff_time;      /* all zeros */
@@ -5459,17 +5400,6 @@ void init_sam_user_info23W(SAM_USER_INFO_23 * usr, NTTIME * logon_time,  /* all z
        usr->pass_can_change_time = *pass_can_change_time;      /* all zeros */
        usr->pass_must_change_time = *pass_must_change_time;    /* all zeros */
 
-       init_uni_hdr(&usr->hdr_user_name, len_user_name);       /* NULL */
-       init_uni_hdr(&usr->hdr_full_name, len_full_name);
-       init_uni_hdr(&usr->hdr_home_dir, len_home_dir);
-       init_uni_hdr(&usr->hdr_dir_drive, len_dir_drive);
-       init_uni_hdr(&usr->hdr_logon_script, len_logon_script);
-       init_uni_hdr(&usr->hdr_profile_path, len_profile_path);
-       init_uni_hdr(&usr->hdr_acct_desc, len_description);
-       init_uni_hdr(&usr->hdr_workstations, len_workstations);
-       init_uni_hdr(&usr->hdr_unknown_str, len_unknown_str);
-       init_uni_hdr(&usr->hdr_munged_dial, len_munged_dial);
-
        ZERO_STRUCT(usr->nt_pwd);
        ZERO_STRUCT(usr->lm_pwd);
 
@@ -5496,15 +5426,34 @@ void init_sam_user_info23W(SAM_USER_INFO_23 * usr, NTTIME * logon_time, /* all z
        memcpy(usr->pass, newpass, sizeof(usr->pass));
 
        copy_unistr2(&usr->uni_user_name, user_name);
+       init_uni_hdr(&usr->hdr_user_name, &usr->uni_user_name);
+
        copy_unistr2(&usr->uni_full_name, full_name);
+       init_uni_hdr(&usr->hdr_full_name, &usr->uni_full_name);
+
        copy_unistr2(&usr->uni_home_dir, home_dir);
+       init_uni_hdr(&usr->hdr_home_dir, &usr->uni_home_dir);
+
        copy_unistr2(&usr->uni_dir_drive, dir_drive);
+       init_uni_hdr(&usr->hdr_dir_drive, &usr->uni_dir_drive);
+
        copy_unistr2(&usr->uni_logon_script, log_scr);
+       init_uni_hdr(&usr->hdr_logon_script, &usr->uni_logon_script);
+
        copy_unistr2(&usr->uni_profile_path, prof_path);
+       init_uni_hdr(&usr->hdr_profile_path, &usr->uni_profile_path);
+
        copy_unistr2(&usr->uni_acct_desc, desc);
+       init_uni_hdr(&usr->hdr_acct_desc, &usr->uni_acct_desc);
+
        copy_unistr2(&usr->uni_workstations, wkstas);
+       init_uni_hdr(&usr->hdr_workstations, &usr->uni_workstations);
+
        copy_unistr2(&usr->uni_unknown_str, unk_str);
+       init_uni_hdr(&usr->hdr_unknown_str, &usr->uni_unknown_str);
+
        copy_unistr2(&usr->uni_munged_dial, mung_dial);
+       init_uni_hdr(&usr->hdr_munged_dial, &usr->uni_munged_dial);
 
        usr->unknown_6 = unknown_6;     /* 0x0000 04ec */
        usr->padding4 = 0;
@@ -5536,17 +5485,6 @@ void init_sam_user_info23A(SAM_USER_INFO_23 * usr, NTTIME * logon_time,  /* all z
                           LOGON_HRS * hrs, uint16 bad_password_count, uint16 logon_count,
                           char newpass[516], uint32 unknown_6)
 {
-       int len_user_name = user_name != NULL ? strlen(user_name) : 0;
-       int len_full_name = full_name != NULL ? strlen(full_name) : 0;
-       int len_home_dir = home_dir != NULL ? strlen(home_dir) : 0;
-       int len_dir_drive = dir_drive != NULL ? strlen(dir_drive) : 0;
-       int len_logon_script = log_scr != NULL ? strlen(log_scr) : 0;
-       int len_profile_path = prof_path != NULL ? strlen(prof_path) : 0;
-       int len_description = desc != NULL ? strlen(desc) : 0;
-       int len_workstations = wkstas != NULL ? strlen(wkstas) : 0;
-       int len_unknown_str = unk_str != NULL ? strlen(unk_str) : 0;
-       int len_munged_dial = mung_dial != NULL ? strlen(mung_dial) : 0;
-
        usr->logon_time = *logon_time;  /* all zeros */
        usr->logoff_time = *logoff_time;        /* all zeros */
        usr->kickoff_time = *kickoff_time;      /* all zeros */
@@ -5554,17 +5492,6 @@ void init_sam_user_info23A(SAM_USER_INFO_23 * usr, NTTIME * logon_time,  /* all z
        usr->pass_can_change_time = *pass_can_change_time;      /* all zeros */
        usr->pass_must_change_time = *pass_must_change_time;    /* all zeros */
 
-       init_uni_hdr(&usr->hdr_user_name, len_user_name);       /* NULL */
-       init_uni_hdr(&usr->hdr_full_name, len_full_name);
-       init_uni_hdr(&usr->hdr_home_dir, len_home_dir);
-       init_uni_hdr(&usr->hdr_dir_drive, len_dir_drive);
-       init_uni_hdr(&usr->hdr_logon_script, len_logon_script);
-       init_uni_hdr(&usr->hdr_profile_path, len_profile_path);
-       init_uni_hdr(&usr->hdr_acct_desc, len_description);
-       init_uni_hdr(&usr->hdr_workstations, len_workstations);
-       init_uni_hdr(&usr->hdr_unknown_str, len_unknown_str);
-       init_uni_hdr(&usr->hdr_munged_dial, len_munged_dial);
-
        ZERO_STRUCT(usr->nt_pwd);
        ZERO_STRUCT(usr->lm_pwd);
 
@@ -5590,16 +5517,35 @@ void init_sam_user_info23A(SAM_USER_INFO_23 * usr, NTTIME * logon_time, /* all z
 
        memcpy(usr->pass, newpass, sizeof(usr->pass));
 
-       init_unistr2(&usr->uni_user_name, user_name, len_user_name);    /* NULL */
-       init_unistr2(&usr->uni_full_name, full_name, len_full_name);
-       init_unistr2(&usr->uni_home_dir, home_dir, len_home_dir);
-       init_unistr2(&usr->uni_dir_drive, dir_drive, len_dir_drive);
-       init_unistr2(&usr->uni_logon_script, log_scr, len_logon_script);
-       init_unistr2(&usr->uni_profile_path, prof_path, len_profile_path);
-       init_unistr2(&usr->uni_acct_desc, desc, len_description);
-       init_unistr2(&usr->uni_workstations, wkstas, len_workstations);
-       init_unistr2(&usr->uni_unknown_str, unk_str, len_unknown_str);
-       init_unistr2(&usr->uni_munged_dial, mung_dial, len_munged_dial);
+       init_unistr2(&usr->uni_user_name, user_name, UNI_FLAGS_NONE);
+       init_uni_hdr(&usr->hdr_user_name, &usr->uni_user_name);
+
+       init_unistr2(&usr->uni_full_name, full_name, UNI_FLAGS_NONE);
+       init_uni_hdr(&usr->hdr_full_name, &usr->uni_full_name);
+
+       init_unistr2(&usr->uni_home_dir, home_dir, UNI_FLAGS_NONE);
+       init_uni_hdr(&usr->hdr_home_dir, &usr->uni_home_dir);
+
+       init_unistr2(&usr->uni_dir_drive, dir_drive, UNI_FLAGS_NONE);
+       init_uni_hdr(&usr->hdr_dir_drive, &usr->uni_dir_drive);
+
+       init_unistr2(&usr->uni_logon_script, log_scr, UNI_FLAGS_NONE);
+       init_uni_hdr(&usr->hdr_logon_script, &usr->uni_logon_script);
+
+       init_unistr2(&usr->uni_profile_path, prof_path, UNI_FLAGS_NONE);
+       init_uni_hdr(&usr->hdr_profile_path, &usr->uni_profile_path);
+
+       init_unistr2(&usr->uni_acct_desc, desc, UNI_FLAGS_NONE);
+       init_uni_hdr(&usr->hdr_acct_desc, &usr->uni_acct_desc);
+
+       init_unistr2(&usr->uni_workstations, wkstas, UNI_FLAGS_NONE);
+       init_uni_hdr(&usr->hdr_workstations, &usr->uni_workstations);
+
+       init_unistr2(&usr->uni_unknown_str, unk_str, UNI_FLAGS_NONE);
+       init_uni_hdr(&usr->hdr_unknown_str, &usr->uni_unknown_str);
+
+       init_unistr2(&usr->uni_munged_dial, mung_dial, UNI_FLAGS_NONE);
+       init_uni_hdr(&usr->hdr_munged_dial, &usr->uni_munged_dial);
 
        usr->unknown_6 = unknown_6;     /* 0x0000 04ec */
        usr->padding4 = 0;
@@ -5900,17 +5846,6 @@ void init_sam_user_info21W(SAM_USER_INFO_21 * usr,
                           uint16 logon_count,
                           uint32 unknown_6)
 {
-       int len_user_name = user_name != NULL ? user_name->uni_str_len : 0;
-       int len_full_name = full_name != NULL ? full_name->uni_str_len : 0;
-       int len_home_dir = home_dir != NULL ? home_dir->uni_str_len : 0;
-       int len_dir_drive = dir_drive != NULL ? dir_drive->uni_str_len : 0;
-       int len_logon_script = log_scr != NULL ? log_scr->uni_str_len : 0;
-       int len_profile_path = prof_path != NULL ? prof_path->uni_str_len : 0;
-       int len_description = desc != NULL ? desc->uni_str_len : 0;
-       int len_workstations = wkstas != NULL ? wkstas->uni_str_len : 0;
-       int len_unknown_str = unk_str != NULL ? unk_str->uni_str_len : 0;
-       int len_munged_dial = mung_dial != NULL ? mung_dial->uni_str_len : 0;
-
        usr->logon_time = *logon_time;
        usr->logoff_time = *logoff_time;
        usr->kickoff_time = *kickoff_time;
@@ -5918,17 +5853,6 @@ void init_sam_user_info21W(SAM_USER_INFO_21 * usr,
        usr->pass_can_change_time = *pass_can_change_time;
        usr->pass_must_change_time = *pass_must_change_time;
 
-       init_uni_hdr(&usr->hdr_user_name, len_user_name);
-       init_uni_hdr(&usr->hdr_full_name, len_full_name);
-       init_uni_hdr(&usr->hdr_home_dir, len_home_dir);
-       init_uni_hdr(&usr->hdr_dir_drive, len_dir_drive);
-       init_uni_hdr(&usr->hdr_logon_script, len_logon_script);
-       init_uni_hdr(&usr->hdr_profile_path, len_profile_path);
-       init_uni_hdr(&usr->hdr_acct_desc, len_description);
-       init_uni_hdr(&usr->hdr_workstations, len_workstations);
-       init_uni_hdr(&usr->hdr_unknown_str, len_unknown_str);
-       init_uni_hdr(&usr->hdr_munged_dial, len_munged_dial);
-
        memcpy(usr->lm_pwd, lm_pwd, sizeof(usr->lm_pwd));
        memcpy(usr->nt_pwd, nt_pwd, sizeof(usr->nt_pwd));
 
@@ -5952,15 +5876,34 @@ void init_sam_user_info21W(SAM_USER_INFO_21 * usr,
        ZERO_STRUCT(usr->padding2);
 
        copy_unistr2(&usr->uni_user_name, user_name);
+       init_uni_hdr(&usr->hdr_user_name, &usr->uni_user_name);
+
        copy_unistr2(&usr->uni_full_name, full_name);
+       init_uni_hdr(&usr->hdr_full_name, &usr->uni_full_name);
+
        copy_unistr2(&usr->uni_home_dir, home_dir);
+       init_uni_hdr(&usr->hdr_home_dir, &usr->uni_home_dir);
+
        copy_unistr2(&usr->uni_dir_drive, dir_drive);
+       init_uni_hdr(&usr->hdr_dir_drive, &usr->uni_dir_drive);
+
        copy_unistr2(&usr->uni_logon_script, log_scr);
+       init_uni_hdr(&usr->hdr_logon_script, &usr->uni_logon_script);
+
        copy_unistr2(&usr->uni_profile_path, prof_path);
+       init_uni_hdr(&usr->hdr_profile_path, &usr->uni_profile_path);
+
        copy_unistr2(&usr->uni_acct_desc, desc);
+       init_uni_hdr(&usr->hdr_acct_desc, &usr->uni_acct_desc);
+
        copy_unistr2(&usr->uni_workstations, wkstas);
+       init_uni_hdr(&usr->hdr_workstations, &usr->uni_workstations);
+
        copy_unistr2(&usr->uni_unknown_str, unk_str);
+       init_uni_hdr(&usr->hdr_unknown_str, &usr->uni_unknown_str);
+
        copy_unistr2(&usr->uni_munged_dial, mung_dial);
+       init_uni_hdr(&usr->hdr_munged_dial, &usr->uni_munged_dial);
 
        usr->unknown_6 = unknown_6;     /* 0x0000 04ec */
        usr->padding4 = 0;
@@ -5981,11 +5924,6 @@ NTSTATUS init_sam_user_info21A(SAM_USER_INFO_21 *usr, SAM_ACCOUNT *pw, DOM_SID *
        NTTIME          logon_time, logoff_time, kickoff_time,
                        pass_last_set_time, pass_can_change_time,
                        pass_must_change_time;
-
-       int             len_user_name, len_full_name, len_home_dir,
-                       len_dir_drive, len_logon_script, len_profile_path,
-                       len_description, len_workstations, len_unknown_str,
-                       len_munged_dial;
                        
        const char*             user_name = pdb_get_username(pw);
        const char*             full_name = pdb_get_fullname(pw);
@@ -6003,18 +5941,6 @@ NTSTATUS init_sam_user_info21A(SAM_USER_INFO_21 *usr, SAM_ACCOUNT *pw, DOM_SID *
        uint32 group_rid;
        const DOM_SID *group_sid;
 
-       len_user_name    = user_name    != NULL ? strlen(user_name   )+1 : 0;
-       len_full_name    = full_name    != NULL ? strlen(full_name   )+1 : 0;
-       len_home_dir     = home_dir     != NULL ? strlen(home_dir    )+1 : 0;
-       len_dir_drive    = dir_drive    != NULL ? strlen(dir_drive   )+1 : 0;
-       len_logon_script = logon_script != NULL ? strlen(logon_script)+1 : 0;
-       len_profile_path = profile_path != NULL ? strlen(profile_path)+1 : 0;
-       len_description  = description  != NULL ? strlen(description )+1 : 0;
-       len_workstations = workstations != NULL ? strlen(workstations)+1 : 0;
-       len_unknown_str  = 0;
-       len_munged_dial  = munged_dial  != NULL ? strlen(munged_dial )+1 : 0;
-
-
        /* Create NTTIME structs */
        unix_to_nt_time (&logon_time,           pdb_get_logon_time(pw));
        unix_to_nt_time (&logoff_time,          pdb_get_logoff_time(pw));
@@ -6031,17 +5957,6 @@ NTSTATUS init_sam_user_info21A(SAM_USER_INFO_21 *usr, SAM_ACCOUNT *pw, DOM_SID *
        usr->pass_can_change_time  = pass_can_change_time;
        usr->pass_must_change_time = pass_must_change_time;
 
-       init_uni_hdr(&usr->hdr_user_name, len_user_name);
-       init_uni_hdr(&usr->hdr_full_name, len_full_name);
-       init_uni_hdr(&usr->hdr_home_dir, len_home_dir);
-       init_uni_hdr(&usr->hdr_dir_drive, len_dir_drive);
-       init_uni_hdr(&usr->hdr_logon_script, len_logon_script);
-       init_uni_hdr(&usr->hdr_profile_path, len_profile_path);
-       init_uni_hdr(&usr->hdr_acct_desc, len_description);
-       init_uni_hdr(&usr->hdr_workstations, len_workstations);
-       init_uni_hdr(&usr->hdr_unknown_str, len_unknown_str);
-       init_uni_hdr(&usr->hdr_munged_dial, len_munged_dial);
-
        ZERO_STRUCT(usr->nt_pwd);
        ZERO_STRUCT(usr->lm_pwd);
 
@@ -6100,16 +6015,35 @@ NTSTATUS init_sam_user_info21A(SAM_USER_INFO_21 *usr, SAM_ACCOUNT *pw, DOM_SID *
        ZERO_STRUCT(usr->padding1);
        ZERO_STRUCT(usr->padding2);
 
-       init_unistr2(&usr->uni_user_name, user_name, len_user_name);
-       init_unistr2(&usr->uni_full_name, full_name, len_full_name);
-       init_unistr2(&usr->uni_home_dir, home_dir, len_home_dir);
-       init_unistr2(&usr->uni_dir_drive, dir_drive, len_dir_drive);
-       init_unistr2(&usr->uni_logon_script, logon_script, len_logon_script);
-       init_unistr2(&usr->uni_profile_path, profile_path, len_profile_path);
-       init_unistr2(&usr->uni_acct_desc, description, len_description);
-       init_unistr2(&usr->uni_workstations, workstations, len_workstations);
-       init_unistr2(&usr->uni_unknown_str, NULL, len_unknown_str);
-       init_unistr2(&usr->uni_munged_dial, munged_dial, len_munged_dial);
+       init_unistr2(&usr->uni_user_name, user_name, UNI_STR_TERMINATE);
+       init_uni_hdr(&usr->hdr_user_name, &usr->uni_user_name);
+
+       init_unistr2(&usr->uni_full_name, full_name, UNI_STR_TERMINATE);
+       init_uni_hdr(&usr->hdr_full_name, &usr->uni_full_name);
+
+       init_unistr2(&usr->uni_home_dir, home_dir, UNI_STR_TERMINATE);
+       init_uni_hdr(&usr->hdr_home_dir, &usr->uni_home_dir);
+
+       init_unistr2(&usr->uni_dir_drive, dir_drive, UNI_STR_TERMINATE);
+       init_uni_hdr(&usr->hdr_dir_drive, &usr->uni_dir_drive);
+
+       init_unistr2(&usr->uni_logon_script, logon_script, UNI_STR_TERMINATE);
+       init_uni_hdr(&usr->hdr_logon_script, &usr->uni_logon_script);
+
+       init_unistr2(&usr->uni_profile_path, profile_path, UNI_STR_TERMINATE);
+       init_uni_hdr(&usr->hdr_profile_path, &usr->uni_profile_path);
+
+       init_unistr2(&usr->uni_acct_desc, description, UNI_STR_TERMINATE);
+       init_uni_hdr(&usr->hdr_acct_desc, &usr->uni_acct_desc);
+
+       init_unistr2(&usr->uni_workstations, workstations, UNI_STR_TERMINATE);
+       init_uni_hdr(&usr->hdr_workstations, &usr->uni_workstations);
+
+       init_unistr2(&usr->uni_unknown_str, NULL, UNI_STR_TERMINATE);
+       init_uni_hdr(&usr->hdr_unknown_str, &usr->uni_unknown_str);
+
+       init_unistr2(&usr->uni_munged_dial, munged_dial, UNI_STR_TERMINATE);
+       init_uni_hdr(&usr->hdr_munged_dial, &usr->uni_munged_dial);
 
        usr->unknown_6 = pdb_get_unknown_6(pw);
        usr->padding4 = 0;
@@ -6249,12 +6183,10 @@ static BOOL sam_io_user_info21(const char *desc, SAM_USER_INFO_21 * usr,
 
 void init_sam_user_info20A(SAM_USER_INFO_20 *usr, SAM_ACCOUNT *pw)
 {
-       int             len_munged_dial;
-       const char*             munged_dial = pdb_get_munged_dial(pw);
+       const char *munged_dial = pdb_get_munged_dial(pw);
 
-       len_munged_dial  = munged_dial  != NULL ? strlen(munged_dial )+1 : 0;
-       init_uni_hdr(&usr->hdr_munged_dial, len_munged_dial);
-       init_unistr2(&usr->uni_munged_dial, munged_dial, len_munged_dial);
+       init_unistr2(&usr->uni_munged_dial, munged_dial, UNI_STR_TERMINATE);
+       init_uni_hdr(&usr->hdr_munged_dial, &usr->uni_munged_dial);
 
 }
 
@@ -6720,13 +6652,11 @@ inits a SAMR_Q_CONNECT structure.
 void init_samr_q_connect(SAMR_Q_CONNECT * q_u,
                         char *srv_name, uint32 access_mask)
 {
-       int len_srv_name = strlen(srv_name);
-
        DEBUG(5, ("init_samr_q_connect\n"));
 
        /* make PDC server name \\server */
-       q_u->ptr_srv_name = len_srv_name > 0 ? 1 : 0;
-       init_unistr2(&q_u->uni_srv_name, srv_name, len_srv_name + 1);
+       q_u->ptr_srv_name = (srv_name != NULL && *srv_name) ? 1 : 0;
+       init_unistr2(&q_u->uni_srv_name, srv_name, UNI_STR_TERMINATE);
 
        /* example values: 0x0000 0002 */
        q_u->access_mask = access_mask;
@@ -6793,13 +6723,11 @@ inits a SAMR_Q_CONNECT4 structure.
 void init_samr_q_connect4(SAMR_Q_CONNECT4 * q_u,
                          char *srv_name, uint32 access_mask)
 {
-       int len_srv_name = strlen(srv_name);
-
        DEBUG(5, ("init_samr_q_connect\n"));
 
        /* make PDC server name \\server */
-       q_u->ptr_srv_name = len_srv_name > 0 ? 1 : 0;
-       init_unistr2(&q_u->uni_srv_name, srv_name, len_srv_name + 1);
+       q_u->ptr_srv_name = (srv_name != NULL && *srv_name) ? 1 : 0;
+       init_unistr2(&q_u->uni_srv_name, srv_name, UNI_STR_TERMINATE);
 
        /* Only value we've seen, possibly an address type ? */
        q_u->unk_0 = 2;
@@ -6938,13 +6866,11 @@ inits a SAMR_Q_GET_DOM_PWINFO structure.
 void init_samr_q_get_dom_pwinfo(SAMR_Q_GET_DOM_PWINFO * q_u,
                                char *srv_name)
 {
-       int len_srv_name = strlen(srv_name);
-
        DEBUG(5, ("init_samr_q_get_dom_pwinfo\n"));
 
        q_u->ptr = 1;
-       init_uni_hdr(&q_u->hdr_srv_name, len_srv_name);
-       init_unistr2(&q_u->uni_srv_name, srv_name, len_srv_name);
+       init_unistr2(&q_u->uni_srv_name, srv_name, UNI_FLAGS_NONE);
+       init_uni_hdr(&q_u->hdr_srv_name, &q_u->uni_srv_name);
 }
 
 /*******************************************************************
@@ -7105,16 +7031,14 @@ void init_samr_q_chgpasswd_user(SAMR_Q_CHGPASSWD_USER * q_u,
                                char lm_newpass[516],
                                uchar lm_oldhash[16])
 {
-       int len_dest_host = strlen(dest_host);
-       int len_user_name = strlen(user_name);
-
        DEBUG(5, ("init_samr_q_chgpasswd_user\n"));
 
        q_u->ptr_0 = 1;
-       init_uni_hdr(&q_u->hdr_dest_host, len_dest_host);
-       init_unistr2(&q_u->uni_dest_host, dest_host, len_dest_host);
-       init_uni_hdr(&q_u->hdr_user_name, len_user_name);
-       init_unistr2(&q_u->uni_user_name, user_name, len_user_name);
+       init_unistr2(&q_u->uni_dest_host, dest_host, UNI_FLAGS_NONE);
+       init_uni_hdr(&q_u->hdr_dest_host, &q_u->uni_dest_host);
+
+       init_unistr2(&q_u->uni_user_name, user_name, UNI_FLAGS_NONE);
+       init_uni_hdr(&q_u->hdr_user_name, &q_u->uni_user_name);
 
        init_enc_passwd(&q_u->nt_newpass, nt_newpass);
        init_enc_hash(&q_u->nt_oldhash, nt_oldhash);
index 7ca9bccab461625e583936dd6fca2bd3dfecf13c..65f16414a0a7904f6abae0d68f7a01a10f6b4db0 100644 (file)
@@ -916,12 +916,12 @@ BOOL make_spoolss_q_open_printer_ex(SPOOL_Q_OPEN_PRINTER_EX *q_u,
 {
        DEBUG(5,("make_spoolss_q_open_printer_ex\n"));
        q_u->printername_ptr = (printername!=NULL)?1:0;
-       init_unistr2(&q_u->printername, printername, strlen(printername)+1);
+       init_unistr2(&q_u->printername, printername, UNI_STR_TERMINATE);
 
        q_u->printer_default.datatype_ptr = 0;
 /*
        q_u->printer_default.datatype_ptr = (datatype!=NULL)?1:0;
-       init_unistr2(&q_u->printer_default.datatype, datatype, strlen(datatype));
+       init_unistr2(&q_u->printer_default.datatype, datatype, UNI_FLAGS_NONE);
 */
        q_u->printer_default.devmode_cont.size=0;
        q_u->printer_default.devmode_cont.devmode_ptr=0;
@@ -937,8 +937,8 @@ BOOL make_spoolss_q_open_printer_ex(SPOOL_Q_OPEN_PRINTER_EX *q_u,
        q_u->user_ctr.user1.major=2;
        q_u->user_ctr.user1.minor=0;
        q_u->user_ctr.user1.processor=0;
-       init_unistr2(&q_u->user_ctr.user1.client_name, clientname, strlen(clientname)+1);
-       init_unistr2(&q_u->user_ctr.user1.user_name, user_name, strlen(user_name)+1);
+       init_unistr2(&q_u->user_ctr.user1.client_name, clientname, UNI_STR_TERMINATE);
+       init_unistr2(&q_u->user_ctr.user1.user_name, user_name, UNI_STR_TERMINATE);
        
        return True;
 }
@@ -963,7 +963,7 @@ BOOL make_spoolss_q_addprinterex(
        ZERO_STRUCTP(q_u);
 
        q_u->server_name_ptr = (srv_name!=NULL)?1:0;
-       init_unistr2(&q_u->server_name, srv_name, strlen(srv_name));
+       init_unistr2(&q_u->server_name, srv_name, UNI_FLAGS_NONE);
 
        q_u->level = level;
        
@@ -991,8 +991,8 @@ BOOL make_spoolss_q_addprinterex(
        q_u->user_ctr.user1.major=2;
        q_u->user_ctr.user1.minor=0;
        q_u->user_ctr.user1.processor=0;
-       init_unistr2(&q_u->user_ctr.user1.client_name, clientname, strlen(clientname)+1);
-       init_unistr2(&q_u->user_ctr.user1.user_name, user_name, strlen(user_name)+1);
+       init_unistr2(&q_u->user_ctr.user1.client_name, clientname, UNI_STR_TERMINATE);
+       init_unistr2(&q_u->user_ctr.user1.user_name, user_name, UNI_STR_TERMINATE);
        q_u->user_ctr.user1.size=q_u->user_ctr.user1.user_name.uni_str_len +
                                 q_u->user_ctr.user1.client_name.uni_str_len + 2;
        
@@ -1187,15 +1187,13 @@ BOOL make_spoolss_q_deleteprinterdriver(
 
        /* these must be NULL terminated or else NT4 will
           complain about invalid parameters --jerry */
-       init_unistr2(&q_u->server, server, strlen(server)+1);
-       init_unistr2(&q_u->arch, arch, strlen(arch)+1);
-       init_unistr2(&q_u->driver, driver, strlen(driver)+1);
-
+       init_unistr2(&q_u->server, server, UNI_STR_TERMINATE);
+       init_unistr2(&q_u->arch, arch, UNI_STR_TERMINATE);
+       init_unistr2(&q_u->driver, driver, UNI_STR_TERMINATE);
        
        return True;
 }
 
-
 /*******************************************************************
  * make a structure.
  ********************************************************************/
@@ -1209,7 +1207,7 @@ BOOL make_spoolss_q_getprinterdata(SPOOL_Q_GETPRINTERDATA *q_u,
         DEBUG(5,("make_spoolss_q_getprinterdata\n"));
 
         q_u->handle = *handle;
-       init_unistr2(&q_u->valuename, valuename, strlen(valuename) + 1);
+       init_unistr2(&q_u->valuename, valuename, UNI_STR_TERMINATE);
         q_u->size = size;
 
         return True;
@@ -1229,8 +1227,8 @@ BOOL make_spoolss_q_getprinterdataex(SPOOL_Q_GETPRINTERDATAEX *q_u,
         DEBUG(5,("make_spoolss_q_getprinterdataex\n"));
 
         q_u->handle = *handle;
-       init_unistr2(&q_u->valuename, valuename, strlen(valuename) + 1);
-       init_unistr2(&q_u->keyname, keyname, strlen(keyname) + 1);
+       init_unistr2(&q_u->valuename, valuename, UNI_STR_TERMINATE);
+       init_unistr2(&q_u->keyname, keyname, UNI_STR_TERMINATE);
         q_u->size = size;
 
         return True;
@@ -5317,7 +5315,7 @@ BOOL smb_io_unibuffer(const char *desc, UNISTR2 *buffer, prs_struct *ps, int dep
 {
        if (buffer==NULL) return False;
 
-       buffer->undoc=0;
+       buffer->offset=0;
        buffer->uni_str_len=buffer->uni_max_len;
        
        if(!prs_uint32("buffer_size", ps, depth, &buffer->uni_max_len))
@@ -5374,7 +5372,7 @@ BOOL make_spoolss_q_addprinterdriver(TALLOC_CTX *mem_ctx,
        DEBUG(5,("make_spoolss_q_addprinterdriver\n"));
        
        q_u->server_name_ptr = (srv_name!=NULL)?1:0;
-       init_unistr2(&q_u->server_name, srv_name, strlen(srv_name)+1);
+       init_unistr2(&q_u->server_name, srv_name, UNI_STR_TERMINATE);
        
        q_u->level = level;
        
@@ -6162,7 +6160,7 @@ BOOL make_spoolss_q_enumprinterdataex(SPOOL_Q_ENUMPRINTERDATAEX *q_u,
                                      uint32 size)
 {
        memcpy(&q_u->handle, hnd, sizeof(q_u->handle));
-       init_unistr2(&q_u->key, key, strlen(key)+1);
+       init_unistr2(&q_u->key, key, UNI_STR_TERMINATE);
        q_u->size = size;
 
        return True;
@@ -6175,7 +6173,7 @@ BOOL make_spoolss_q_setprinterdata(SPOOL_Q_SETPRINTERDATA *q_u, const POLICY_HND
 {
        memcpy(&q_u->handle, hnd, sizeof(q_u->handle));
        q_u->type = data_type;
-       init_unistr2(&q_u->value, value, strlen(value)+1);
+       init_unistr2(&q_u->value, value, UNI_STR_TERMINATE);
 
        q_u->max_len = q_u->real_len = data_size;
        q_u->data = (unsigned char *)data;
@@ -6191,8 +6189,8 @@ BOOL make_spoolss_q_setprinterdataex(SPOOL_Q_SETPRINTERDATAEX *q_u, const POLICY
 {
        memcpy(&q_u->handle, hnd, sizeof(q_u->handle));
        q_u->type = data_type;
-       init_unistr2(&q_u->value, value, strlen(value)+1);
-       init_unistr2(&q_u->key, key, strlen(key)+1);
+       init_unistr2(&q_u->value, value, UNI_STR_TERMINATE);
+       init_unistr2(&q_u->key, key, UNI_STR_TERMINATE);
 
        q_u->max_len = q_u->real_len = data_size;
        q_u->data = (unsigned char *)data;
@@ -6589,7 +6587,7 @@ BOOL make_spoolss_q_replyopenprinter(SPOOL_Q_REPLYOPENPRINTER *q_u,
        if (q_u == NULL)
                return False;
 
-       init_unistr2(&q_u->string, string, strlen(string)+1);
+       init_unistr2(&q_u->string, string, UNI_STR_TERMINATE);
 
        q_u->printer=printer;
        q_u->type=type;
@@ -7092,7 +7090,7 @@ BOOL make_spoolss_q_enumprinterkey(SPOOL_Q_ENUMPRINTERKEY *q_u,
        DEBUG(5,("make_spoolss_q_enumprinterkey\n"));
 
        memcpy(&q_u->handle, hnd, sizeof(q_u->handle));
-       init_unistr2(&q_u->key, key, strlen(key)+1);
+       init_unistr2(&q_u->key, key, UNI_STR_TERMINATE);
        q_u->size = size;
 
        return True;
@@ -7161,7 +7159,7 @@ BOOL make_spoolss_q_deleteprinterkey(SPOOL_Q_DELETEPRINTERKEY *q_u,
        DEBUG(5,("make_spoolss_q_deleteprinterkey\n"));
 
        memcpy(&q_u->handle, hnd, sizeof(q_u->handle));
-       init_unistr2(&q_u->keyname, keyname, strlen(keyname)+1);
+       init_unistr2(&q_u->keyname, keyname, UNI_STR_TERMINATE);
 
        return True;
 }
@@ -7382,8 +7380,8 @@ BOOL make_spoolss_q_getprintprocessordirectory(SPOOL_Q_GETPRINTPROCESSORDIRECTOR
 {
        DEBUG(5,("make_spoolss_q_getprintprocessordirectory\n"));
 
-       init_unistr2(&q_u->name, name, strlen(name)+1);
-       init_unistr2(&q_u->environment, environment, strlen(environment)+1);
+       init_unistr2(&q_u->name, name, UNI_STR_TERMINATE);
+       init_unistr2(&q_u->environment, environment, UNI_STR_TERMINATE);
 
        q_u->level = level;
 
@@ -7509,7 +7507,7 @@ BOOL make_spoolss_q_setform(SPOOL_Q_SETFORM *q_u, POLICY_HND *handle,
        q_u->level = level;
        q_u->level2 = level;
        memcpy(&q_u->form, form, sizeof(FORM));
-       init_unistr2(&q_u->name, form_name, strlen(form_name) + 1);
+       init_unistr2(&q_u->name, form_name, UNI_STR_TERMINATE);
 
        return True;
 }
@@ -7522,7 +7520,7 @@ BOOL make_spoolss_q_deleteform(SPOOL_Q_DELETEFORM *q_u, POLICY_HND *handle,
                               const char *form)
 {
        memcpy(&q_u->handle, handle, sizeof(POLICY_HND));
-       init_unistr2(&q_u->name, form, strlen(form) + 1);
+       init_unistr2(&q_u->name, form, UNI_STR_TERMINATE);
        return True;
 }
 
@@ -7536,7 +7534,7 @@ BOOL make_spoolss_q_getform(SPOOL_Q_GETFORM *q_u, POLICY_HND *handle,
 {
         memcpy(&q_u->handle, handle, sizeof(POLICY_HND));
         q_u->level = level;
-        init_unistr2(&q_u->formname, formname, strlen(formname) + 1);
+        init_unistr2(&q_u->formname, formname, UNI_STR_TERMINATE);
         q_u->buffer=buffer;
         q_u->offered=offered;
 
@@ -7642,17 +7640,9 @@ BOOL make_spoolss_q_startdocprinter(SPOOL_Q_STARTDOCPRINTER *q_u,
                ctr->docinfo.doc_info_1.p_outputfile = outputfile ? 1 : 0;
                ctr->docinfo.doc_info_1.p_datatype = datatype ? 1 : 0;
 
-               if (docname)
-                       init_unistr2(&ctr->docinfo.doc_info_1.docname, docname,
-                                    strlen(docname) + 1);
-
-               if (outputfile)
-                       init_unistr2(&ctr->docinfo.doc_info_1.outputfile, outputfile,
-                                    strlen(outputfile) + 1);
-
-               if (datatype)
-                       init_unistr2(&ctr->docinfo.doc_info_1.datatype, datatype,
-                                    strlen(datatype) + 1);
+               init_unistr2(&ctr->docinfo.doc_info_1.docname, docname, UNI_STR_TERMINATE);
+               init_unistr2(&ctr->docinfo.doc_info_1.outputfile, outputfile, UNI_STR_TERMINATE);
+               init_unistr2(&ctr->docinfo.doc_info_1.datatype, datatype, UNI_STR_TERMINATE);
 
                break;
        case 2:
@@ -7701,7 +7691,7 @@ BOOL make_spoolss_q_deleteprinterdata(SPOOL_Q_DELETEPRINTERDATA *q_u,
                                 POLICY_HND *handle, char *valuename)
 {
         memcpy(&q_u->handle, handle, sizeof(POLICY_HND));
-       init_unistr2(&q_u->valuename, valuename, strlen(valuename) + 1);
+       init_unistr2(&q_u->valuename, valuename, UNI_STR_TERMINATE);
 
        return True;
 }
@@ -7715,8 +7705,8 @@ BOOL make_spoolss_q_deleteprinterdataex(SPOOL_Q_DELETEPRINTERDATAEX *q_u,
                                        char *value)
 {
         memcpy(&q_u->handle, handle, sizeof(POLICY_HND));
-       init_unistr2(&q_u->valuename, value, strlen(value) + 1);
-       init_unistr2(&q_u->keyname, key, strlen(key) + 1);
+       init_unistr2(&q_u->valuename, value, UNI_STR_TERMINATE);
+       init_unistr2(&q_u->keyname, key, UNI_STR_TERMINATE);
 
        return True;
 }
@@ -7736,8 +7726,7 @@ BOOL make_spoolss_q_rffpcnex(SPOOL_Q_RFFPCNEX *q_u, POLICY_HND *handle,
 
        q_u->localmachine_ptr = 1;
 
-       init_unistr2(&q_u->localmachine, localmachine, 
-                    strlen(localmachine) + 1);
+       init_unistr2(&q_u->localmachine, localmachine, UNI_STR_TERMINATE);
 
        q_u->printerlocal = printerlocal;
 
index bbb5193ddcdaf5dea5138e5f9e47832a23bf8c54..6349fc1632575c25d5ed1706d2014a9bd69e9605 100644 (file)
@@ -36,8 +36,7 @@ void init_srv_share_info0_str(SH_INFO_0_STR *sh0, const char *net_name)
 {
        DEBUG(5,("init_srv_share_info0_str\n"));
 
-       if(net_name)
-               init_unistr2(&sh0->uni_netname, net_name, strlen(net_name)+1);
+       init_unistr2(&sh0->uni_netname, net_name, UNI_STR_TERMINATE);
 }
 
 /*******************************************************************
@@ -101,10 +100,8 @@ void init_srv_share_info1_str(SH_INFO_1_STR *sh1, const char *net_name, const ch
 {
        DEBUG(5,("init_srv_share_info1_str\n"));
 
-       if(net_name)
-               init_unistr2(&sh1->uni_netname, net_name, strlen(net_name)+1);
-       if(remark)
-               init_unistr2(&sh1->uni_remark, remark, strlen(remark)+1);
+       init_unistr2(&sh1->uni_netname, net_name, UNI_STR_TERMINATE);
+       init_unistr2(&sh1->uni_remark, remark, UNI_STR_TERMINATE);
 }
 
 /*******************************************************************
@@ -184,14 +181,10 @@ void init_srv_share_info2_str(SH_INFO_2_STR *sh2,
 {
        DEBUG(5,("init_srv_share_info2_str\n"));
 
-       if (net_name)
-               init_unistr2(&sh2->uni_netname, net_name, strlen(net_name)+1);
-       if (remark)
-               init_unistr2(&sh2->uni_remark, remark, strlen(remark)+1);
-       if (path)
-               init_unistr2(&sh2->uni_path, path, strlen(path)+1);
-       if (passwd)
-               init_unistr2(&sh2->uni_passwd, passwd, strlen(passwd)+1);
+       init_unistr2(&sh2->uni_netname, net_name, UNI_STR_TERMINATE);
+       init_unistr2(&sh2->uni_remark, remark, UNI_STR_TERMINATE);
+       init_unistr2(&sh2->uni_path, path, UNI_STR_TERMINATE);
+       init_unistr2(&sh2->uni_passwd, passwd, UNI_STR_TERMINATE);
 }
 
 /*******************************************************************
@@ -296,10 +289,8 @@ void init_srv_share_info501_str(SH_INFO_501_STR *sh501,
 {
        DEBUG(5,("init_srv_share_info501_str\n"));
 
-       if(net_name)
-               init_unistr2(&sh501->uni_netname, net_name, strlen(net_name)+1);
-       if(remark)
-               init_unistr2(&sh501->uni_remark, remark, strlen(remark)+1);
+       init_unistr2(&sh501->uni_netname, net_name, UNI_STR_TERMINATE);
+       init_unistr2(&sh501->uni_remark, remark, UNI_STR_TERMINATE);
 }
 
 /*******************************************************************
@@ -446,17 +437,13 @@ void init_srv_share_info502_str(SH_INFO_502_STR *sh502str,
 {
        DEBUG(5,("init_srv_share_info502_str\n"));
 
-       if(net_name)
-               init_unistr2(&sh502str->uni_netname, net_name, strlen(net_name)+1);
-       if(remark)
-               init_unistr2(&sh502str->uni_remark, remark, strlen(remark)+1);
-       if(path)
-               init_unistr2(&sh502str->uni_path, path, strlen(path)+1);
-       if(passwd)
-               init_unistr2(&sh502str->uni_passwd, passwd, strlen(passwd)+1);
-               sh502str->sd = psd;
+       init_unistr2(&sh502str->uni_netname, net_name, UNI_STR_TERMINATE);
+       init_unistr2(&sh502str->uni_remark, remark, UNI_STR_TERMINATE);
+       init_unistr2(&sh502str->uni_path, path, UNI_STR_TERMINATE);
+       init_unistr2(&sh502str->uni_passwd, passwd, UNI_STR_TERMINATE);
+       sh502str->sd = psd;
        sh502str->reserved = 0;
-               sh502str->sd_size = sd_size;
+       sh502str->sd_size = sd_size;
 }
 
 /*******************************************************************
@@ -551,8 +538,7 @@ void init_srv_share_info1004_str(SH_INFO_1004_STR *sh1004, const char *remark)
 {
        DEBUG(5,("init_srv_share_info1004_str\n"));
 
-       if(remark)
-               init_unistr2(&sh1004->uni_remark, remark, strlen(remark)+1);
+       init_unistr2(&sh1004->uni_remark, remark, UNI_STR_TERMINATE);
 }
 
 /*******************************************************************
@@ -659,8 +645,7 @@ void init_srv_share_info1007_str(SH_INFO_1007_STR *sh1007, const char *alternate
 {
        DEBUG(5,("init_srv_share_info1007_str\n"));
 
-       if(alternate_directory_name)
-               init_unistr2(&sh1007->uni_AlternateDirectoryName, alternate_directory_name, strlen(alternate_directory_name)+1);
+       init_unistr2(&sh1007->uni_AlternateDirectoryName, alternate_directory_name, UNI_STR_TERMINATE);
 }
 
 /*******************************************************************
@@ -1474,7 +1459,7 @@ void init_srv_q_net_share_add(SRV_Q_NET_SHARE_ADD *q, const char *srvname,
                              const char *path, const char *passwd)
 {
        q->ptr_srv_name = 1;
-       init_unistr2(&q->uni_srv_name, srvname, strlen(srvname) +1);
+       init_unistr2(&q->uni_srv_name, srvname, UNI_STR_TERMINATE);
        q->info.switch_value = q->info_level = 2;
 
        q->info.ptr_share_ctr = 1;
@@ -1525,8 +1510,8 @@ void init_srv_q_net_share_del(SRV_Q_NET_SHARE_DEL *del, const char *srvname,
                              const char *sharename)
 {
        del->ptr_srv_name = 1;
-       init_unistr2(&del->uni_srv_name, srvname, strlen(srvname) +1 );
-       init_unistr2(&del->uni_share_name, sharename, strlen(sharename) + 1);
+       init_unistr2(&del->uni_srv_name, srvname, UNI_STR_TERMINATE);
+       init_unistr2(&del->uni_share_name, sharename, UNI_STR_TERMINATE);
 }
 
 /*******************************************************************
@@ -1589,7 +1574,7 @@ void init_srv_sess_info0_str(SESS_INFO_0_STR *ss0, const char *name)
 {
        DEBUG(5,("init_srv_sess_info0_str\n"));
 
-       init_unistr2(&ss0->uni_name, name, strlen(name)+1);
+       init_unistr2(&ss0->uni_name, name, UNI_STR_TERMINATE);
 }
 
 /*******************************************************************
@@ -1703,8 +1688,8 @@ void init_srv_sess_info1_str(SESS_INFO_1_STR *ss1, const char *name, const char
 {
        DEBUG(5,("init_srv_sess_info1_str\n"));
 
-       init_unistr2(&ss1->uni_name, name, strlen(name)+1);
-       init_unistr2(&ss1->uni_user, user, strlen(user)+1);
+       init_unistr2(&ss1->uni_name, name, UNI_STR_TERMINATE);
+       init_unistr2(&ss1->uni_user, user, UNI_STR_TERMINATE);
 }
 
 /*******************************************************************
@@ -2075,8 +2060,8 @@ void init_srv_conn_info1_str(CONN_INFO_1_STR *ss1, const char *usr_name, const c
 {
        DEBUG(5,("init_srv_conn_info1_str\n"));
 
-       init_unistr2(&ss1->uni_usr_name, usr_name, strlen(usr_name)+1);
-       init_unistr2(&ss1->uni_net_name, net_name, strlen(net_name)+1);
+       init_unistr2(&ss1->uni_usr_name, usr_name, UNI_STR_TERMINATE);
+       init_unistr2(&ss1->uni_net_name, net_name, UNI_STR_TERMINATE);
 }
 
 /*******************************************************************
@@ -2365,8 +2350,8 @@ void init_srv_file_info3_str(FILE_INFO_3_STR *fi3, const char *user_name, const
 {
        DEBUG(5,("init_srv_file_info3_str\n"));
 
-       init_unistr2(&fi3->uni_path_name, path_name, strlen(path_name)+1);
-       init_unistr2(&fi3->uni_user_name, user_name, strlen(user_name)+1);
+       init_unistr2(&fi3->uni_path_name, path_name, UNI_STR_TERMINATE);
+       init_unistr2(&fi3->uni_user_name, user_name, UNI_STR_TERMINATE);
 }
 
 /*******************************************************************
@@ -2628,7 +2613,7 @@ void init_srv_q_net_file_close(SRV_Q_NET_FILE_CLOSE *q_n, const char *server,
                               uint32 file_id)
 {
        q_n->ptr_srv_name = 1;
-       init_unistr2(&q_n->uni_srv_name, server, strlen(server) + 1);
+       init_unistr2(&q_n->uni_srv_name, server, UNI_STR_TERMINATE);
        q_n->file_id = file_id;
 }
 
@@ -3586,6 +3571,5 @@ BOOL srv_io_r_net_file_set_secdesc(const char *desc, SRV_R_NET_FILE_SET_SECDESC
 void init_srv_q_net_remote_tod(SRV_Q_NET_REMOTE_TOD *q_u, const char *server)
 {
        q_u->ptr_srv_name = 1;
-       init_unistr2(&q_u->uni_srv_name, server, strlen(server) + 1);
+       init_unistr2(&q_u->uni_srv_name, server, UNI_STR_TERMINATE);
 }
-
index 3470ad99b458d51829375f704ef9019e9899a312..751cb6e6425d5295bfce1018664dca3a04f1c52d 100644 (file)
@@ -198,7 +198,7 @@ static BOOL init_reply_dfs_info_1(struct junction_map* j, DFS_INFO_1* dfs1, int
       slprintf(str, sizeof(pstring)-1, "\\\\%s\\%s\\%s", global_myname(), 
               j[i].service_name, j[i].volume_name);
       DEBUG(5,("init_reply_dfs_info_1: %d) initing entrypath: %s\n",i,str));
-      init_unistr2(&dfs1[i].entrypath,str,strlen(str)+1);
+      init_unistr2(&dfs1[i].entrypath,str,UNI_STR_TERMINATE);
     }
   return True;
 }
@@ -212,7 +212,7 @@ static BOOL init_reply_dfs_info_2(struct junction_map* j, DFS_INFO_2* dfs2, int
       dfs2[i].ptr_entrypath = 1;
       slprintf(str, sizeof(pstring)-1, "\\\\%s\\%s\\%s", global_myname(),
               j[i].service_name, j[i].volume_name);
-      init_unistr2(&dfs2[i].entrypath, str, strlen(str)+1);
+      init_unistr2(&dfs2[i].entrypath, str, UNI_STR_TERMINATE);
       dfs2[i].ptr_comment = 0;
       dfs2[i].state = 1; /* set up state of dfs junction as OK */
       dfs2[i].num_storages = j[i].referral_count;
@@ -234,9 +234,9 @@ static BOOL init_reply_dfs_info_3(TALLOC_CTX *ctx, struct junction_map* j, DFS_I
              slprintf(str, sizeof(pstring)-1, "\\\\%s\\%s\\%s", global_myname(),
                       j[i].service_name, j[i].volume_name);
 
-      init_unistr2(&dfs3[i].entrypath, str, strlen(str)+1);
+      init_unistr2(&dfs3[i].entrypath, str, UNI_STR_TERMINATE);
       dfs3[i].ptr_comment = 1;
-      init_unistr2(&dfs3[i].comment, "", 1); 
+      init_unistr2(&dfs3[i].comment, "", UNI_STR_TERMINATE);
       dfs3[i].state = 1;
       dfs3[i].num_storages = dfs3[i].num_storage_infos = j[i].referral_count;
       dfs3[i].ptr_storages = 1;
@@ -267,8 +267,8 @@ static BOOL init_reply_dfs_info_3(TALLOC_CTX *ctx, struct junction_map* j, DFS_I
          *p = '\0';
          DEBUG(5,("storage %d: %s.%s\n",ii,path,p+1));
          stor->state = 2; /* set all storages as ONLINE */
-         init_unistr2(&stor->servername, path, strlen(path)+1);
-         init_unistr2(&stor->sharename,  p+1, strlen(p+1)+1);
+         init_unistr2(&stor->servername, path, UNI_STR_TERMINATE);
+         init_unistr2(&stor->sharename,  p+1, UNI_STR_TERMINATE);
          stor->ptr_servername = stor->ptr_sharename = 1;
        }
     }
index 37540a9668c39388d6b0c9031e9e465b0b7ca552..97e9dc361d99c3e035fea44bc6c18c80b261290c 100644 (file)
@@ -77,12 +77,12 @@ static NTSTATUS fill_dsrole_dominfo_basic(TALLOC_CTX *ctx, DSROLE_PRIMARY_DOMAIN
 
        basic->netbios_ptr = 1;
        netbios_domain = get_global_sam_name();
-       init_unistr2( &basic->netbios_domain, netbios_domain, strlen(netbios_domain) );
+       init_unistr2( &basic->netbios_domain, netbios_domain, UNI_FLAGS_NONE);
 
        basic->dnsname_ptr = 1;
-       init_unistr2( &basic->dns_domain, dnsdomain, strlen(dnsdomain) );
+       init_unistr2( &basic->dns_domain, dnsdomain, UNI_FLAGS_NONE);
        basic->forestname_ptr = 1;
-       init_unistr2( &basic->forest_domain, dnsdomain, strlen(dnsdomain) );
+       init_unistr2( &basic->forest_domain, dnsdomain, UNI_FLAGS_NONE);
        
 
        /* fill in some additional fields if we are a member of an AD domain */
index 686a3069bbf7d1142d81840b99db60a698d91645..0921824cadd7dfbfdcacb5a8c2f84f80bceb39d6 100644 (file)
@@ -61,7 +61,12 @@ Init dom_query
 
 static void init_dom_query(DOM_QUERY *d_q, const char *dom_name, DOM_SID *dom_sid)
 {
-       int domlen = (dom_name != NULL) ? strlen(dom_name) : 0;
+       d_q->buffer_dom_name = (dom_name != NULL) ? 1 : 0; /* domain buffer pointer */
+       d_q->buffer_dom_sid = (dom_sid != NULL) ? 1 : 0;  /* domain sid pointer */
+
+       /* this string is supposed to be non-null terminated. */
+       /* But the maxlen in this UNISTR2 must include the terminating null. */
+       init_unistr2(&d_q->uni_domain_name, dom_name, UNI_MAXLEN_TERMINATE);
 
        /*
         * I'm not sure why this really odd combination of length
@@ -71,14 +76,15 @@ static void init_dom_query(DOM_QUERY *d_q, const char *dom_name, DOM_SID *dom_si
         * a domain with both odd and even length names... JRA.
         */
 
-       d_q->uni_dom_str_len = domlen ? ((domlen + 1) * 2) : 0;
-       d_q->uni_dom_max_len = domlen * 2;
-       d_q->buffer_dom_name = domlen != 0 ? 1 : 0; /* domain buffer pointer */
-       d_q->buffer_dom_sid = dom_sid != NULL ? 1 : 0;  /* domain sid pointer */
+       /*
+        * IMPORTANT NOTE !!!!
+        * The two fields below probably are reversed in meaning, ie.
+        * the first field is probably the str_len, the second the max
+        * len. Both are measured in bytes anyway.
+        */
 
-       /* this string is supposed to be character short */
-       init_unistr2(&d_q->uni_domain_name, dom_name, domlen);
-       d_q->uni_domain_name.uni_max_len++;
+       d_q->uni_dom_str_len = d_q->uni_domain_name.uni_max_len * 2;
+       d_q->uni_dom_max_len = d_q->uni_domain_name.uni_str_len * 2;
 
        if (dom_sid != NULL)
                init_dom_sid2(&d_q->dom_sid, dom_sid);
@@ -91,7 +97,6 @@ static void init_dom_query(DOM_QUERY *d_q, const char *dom_name, DOM_SID *dom_si
 static int init_dom_ref(DOM_R_REF *ref, char *dom_name, DOM_SID *dom_sid)
 {
        int num = 0;
-       int len;
 
        if (dom_name != NULL) {
                for (num = 0; num < ref->num_ref_doms_1; num++) {
@@ -114,14 +119,11 @@ static int init_dom_ref(DOM_R_REF *ref, char *dom_name, DOM_SID *dom_sid)
        ref->max_entries = MAX_REF_DOMAINS;
        ref->num_ref_doms_2 = num+1;
 
-       len = (dom_name != NULL) ? strlen(dom_name) : 0;
-       if(dom_name != NULL && len == 0)
-               len = 1;
-
-       init_uni_hdr(&ref->hdr_ref_dom[num].hdr_dom_name, len);
        ref->hdr_ref_dom[num].ptr_dom_sid = dom_sid != NULL ? 1 : 0;
 
-       init_unistr2(&ref->ref_dom[num].uni_dom_name, dom_name, len);
+       init_unistr2(&ref->ref_dom[num].uni_dom_name, dom_name, UNI_FLAGS_NONE);
+       init_uni_hdr(&ref->hdr_ref_dom[num].hdr_dom_name, &ref->ref_dom[num].uni_dom_name);
+
        init_dom_sid2(&ref->ref_dom[num].ref_dom, dom_sid );
 
        return num;
@@ -349,25 +351,22 @@ static void init_dns_dom_info(LSA_DNS_DOM_INFO *r_l, const char *nb_name,
                              GUID *dom_guid, DOM_SID *dom_sid)
 {
        if (nb_name && *nb_name) {
-               init_uni_hdr(&r_l->hdr_nb_dom_name, strlen(nb_name));
-               init_unistr2(&r_l->uni_nb_dom_name, nb_name, 
-                            strlen(nb_name));
+               init_unistr2(&r_l->uni_nb_dom_name, nb_name, UNI_FLAGS_NONE);
+               init_uni_hdr(&r_l->hdr_nb_dom_name, &r_l->uni_nb_dom_name);
                r_l->hdr_nb_dom_name.uni_max_len += 2;
                r_l->uni_nb_dom_name.uni_max_len += 1;
        }
        
        if (dns_name && *dns_name) {
-               init_uni_hdr(&r_l->hdr_dns_dom_name, strlen(dns_name));
-               init_unistr2(&r_l->uni_dns_dom_name, dns_name,
-                            strlen(dns_name));
+               init_unistr2(&r_l->uni_dns_dom_name, dns_name, UNI_FLAGS_NONE);
+               init_uni_hdr(&r_l->hdr_dns_dom_name, &r_l->uni_dns_dom_name);
                r_l->hdr_dns_dom_name.uni_max_len += 2;
                r_l->uni_dns_dom_name.uni_max_len += 1;
        }
 
        if (forest_name && *forest_name) {
-               init_uni_hdr(&r_l->hdr_forest_name, strlen(forest_name));
-               init_unistr2(&r_l->uni_forest_name, forest_name,
-                            strlen(forest_name));
+               init_unistr2(&r_l->uni_forest_name, forest_name, UNI_FLAGS_NONE);
+               init_uni_hdr(&r_l->hdr_forest_name, &r_l->uni_forest_name);
                r_l->hdr_forest_name.uni_max_len += 2;
                r_l->uni_forest_name.uni_max_len += 1;
        }
@@ -774,13 +773,13 @@ NTSTATUS _lsa_enum_privs(pipes_struct *p, LSA_Q_ENUM_PRIVS *q_u, LSA_R_ENUM_PRIV
 
        for (i = 0; i < PRIV_ALL_INDEX; i++, entry++) {
                if( i<enum_context) {
-                       init_uni_hdr(&entry->hdr_name, 0);
-                       init_unistr2(&entry->name, NULL, 0 );
+                       init_unistr2(&entry->name, NULL, UNI_FLAGS_NONE);
+                       init_uni_hdr(&entry->hdr_name, &entry->name);
                        entry->luid_low = 0;
                        entry->luid_high = 0;
                } else {
-                       init_uni_hdr(&entry->hdr_name, strlen(privs[i+1].priv));
-                       init_unistr2(&entry->name, privs[i+1].priv, strlen(privs[i+1].priv) );
+                       init_unistr2(&entry->name, privs[i+1].priv, UNI_FLAGS_NONE);
+                       init_uni_hdr(&entry->hdr_name, &entry->name);
                        entry->luid_low = privs[i+1].se_priv;
                        entry->luid_high = 0;
                }
@@ -822,8 +821,8 @@ NTSTATUS _lsa_priv_get_dispname(pipes_struct *p, LSA_Q_PRIV_GET_DISPNAME *q_u, L
        
        if (privs[i].se_priv!=SE_PRIV_ALL) {
                DEBUG(10,(": %s\n", privs[i].description));
-               init_uni_hdr(&r_u->hdr_desc, strlen(privs[i].description));
-               init_unistr2(&r_u->desc, privs[i].description, strlen(privs[i].description) );
+               init_unistr2(&r_u->desc, privs[i].description, UNI_FLAGS_NONE);
+               init_uni_hdr(&r_u->hdr_desc, &r_u->desc);
 
                r_u->ptr_info=0xdeadbeef;
                r_u->lang_id=q_u->lang_id;
@@ -890,7 +889,6 @@ NTSTATUS _lsa_enum_accounts(pipes_struct *p, LSA_Q_ENUM_ACCOUNTS *q_u, LSA_R_ENU
 NTSTATUS _lsa_unk_get_connuser(pipes_struct *p, LSA_Q_UNK_GET_CONNUSER *q_u, LSA_R_UNK_GET_CONNUSER *r_u)
 {
        fstring username, domname;
-       int ulen, dlen;
        user_struct *vuser = get_valid_user_struct(p->vuid);
   
        if (vuser == NULL)
@@ -899,18 +897,15 @@ NTSTATUS _lsa_unk_get_connuser(pipes_struct *p, LSA_Q_UNK_GET_CONNUSER *q_u, LSA
        fstrcpy(username, vuser->user.smb_name);
        fstrcpy(domname, vuser->user.domain);
   
-       ulen = strlen(username) + 1;
-       dlen = strlen(domname) + 1;
-  
-       init_uni_hdr(&r_u->hdr_user_name, ulen);
        r_u->ptr_user_name = 1;
-       init_unistr2(&r_u->uni2_user_name, username, ulen);
+       init_unistr2(&r_u->uni2_user_name, username, UNI_STR_TERMINATE);
+       init_uni_hdr(&r_u->hdr_user_name, &r_u->uni2_user_name);
 
        r_u->unk1 = 1;
   
-       init_uni_hdr(&r_u->hdr_dom_name, dlen);
        r_u->ptr_dom_name = 1;
-       init_unistr2(&r_u->uni2_dom_name, domname, dlen);
+       init_unistr2(&r_u->uni2_dom_name, domname,  UNI_STR_TERMINATE);
+       init_uni_hdr(&r_u->hdr_dom_name, &r_u->uni2_dom_name);
 
        r_u->status = NT_STATUS_OK;
   
index 828e07c1ad95d59dbed87cad595b14be79aefb33..71e5bc7d70b372b1ee748aaea2579cc7262c2a4b 100644 (file)
@@ -719,7 +719,7 @@ static NTSTATUS make_user_sam_entry_list(TALLOC_CTX *ctx, SAM_ENTRY **sam_pp, UN
        for (i = 0; i < num_entries; i++) {
                pwd = &disp_user_info[i+start_idx];
                temp_name = pdb_get_username(pwd);
-               init_unistr2(&uni_temp_name, temp_name, strlen(temp_name)+1);
+               init_unistr2(&uni_temp_name, temp_name, UNI_STR_TERMINATE);
                user_sid = pdb_get_user_sid(pwd);
 
                if (!sid_peek_check_rid(domain_sid, user_sid, &user_rid)) {
@@ -731,7 +731,7 @@ static NTSTATUS make_user_sam_entry_list(TALLOC_CTX *ctx, SAM_ENTRY **sam_pp, UN
                        return NT_STATUS_UNSUCCESSFUL;
                }
 
-               init_sam_entry(&sam[i], uni_temp_name.uni_str_len, user_rid);
+               init_sam_entry(&sam[i], &uni_temp_name, user_rid);
                copy_unistr2(&uni_name[i], &uni_temp_name);
        }
 
@@ -865,10 +865,8 @@ static void make_group_sam_entry_list(TALLOC_CTX *ctx, SAM_ENTRY **sam_pp, UNIST
                /*
                 * JRA. I think this should include the null. TNG does not.
                 */
-               int len = strlen(grp[i].name)+1;
-
-               init_sam_entry(&sam[i], len, grp[i].rid);
-               init_unistr2(&uni_name[i], grp[i].name, len);
+               init_unistr2(&uni_name[i], grp[i].name, UNI_STR_TERMINATE);
+               init_sam_entry(&sam[i], &uni_name[i], grp[i].rid);
        }
 
        *sam_pp = sam;
@@ -1580,10 +1578,9 @@ static BOOL make_samr_lookup_rids(TALLOC_CTX *ctx, uint32 num_names, fstring nam
        }
 
        for (i = 0; i < num_names; i++) {
-               int len = names[i] != NULL ? strlen(names[i]) : 0;
-               DEBUG(10, ("names[%d]:%s\n", i, names[i]));
-               init_uni_hdr(&hdr_name[i], len);
-               init_unistr2(&uni_name[i], names[i], len);
+               DEBUG(10, ("names[%d]:%s\n", i, names[i] ? names[i] : ""));
+               init_unistr2(&uni_name[i], names[i], UNI_FLAGS_NONE);
+               init_uni_hdr(&hdr_name[i], &uni_name[i]);
        }
 
        *pp_uni_name = uni_name;
@@ -2570,10 +2567,8 @@ static BOOL make_enum_domains(TALLOC_CTX *ctx, SAM_ENTRY **pp_sam,
                return False;
 
        for (i = 0; i < num_sam_entries; i++) {
-               int len = doms[i] != NULL ? strlen(doms[i]) : 0;
-
-               init_sam_entry(&sam[i], len, 0);
-               init_unistr2(&uni_name[i], doms[i], len);
+               init_unistr2(&uni_name[i], doms[i], UNI_FLAGS_NONE);
+               init_sam_entry(&sam[i], &uni_name[i], 0);
        }
 
        *pp_sam = sam;
index 7159527a7d8d3ead86460427c71711adf6083d87..493f58f8a8123734d4fe0bbf8bb9b8321a2733c2 100644 (file)
@@ -690,7 +690,7 @@ static void notify_string(struct spoolss_notify_msg *msg,
        
        /* The length of the message includes the trailing \0 */
 
-       init_unistr2(&unistr, msg->notify.data, msg->len);
+       init_unistr2(&unistr, msg->notify.data, UNI_STR_TERMINATE);
 
        data->notify_data.data.length = msg->len * 2;
        data->notify_data.data.string = (uint16 *)talloc(mem_ctx, msg->len * 2);
@@ -6121,7 +6121,7 @@ static WERROR update_printer(pipes_struct *p, POLICY_HND *handle, uint32 level,
         */
 
        if (!strequal(printer->info_2->comment, old_printer->info_2->comment)) {
-               init_unistr2( &buffer, printer->info_2->comment, strlen(printer->info_2->comment)+1 );
+               init_unistr2( &buffer, printer->info_2->comment, UNI_STR_TERMINATE);
                set_printer_dataex( printer, SPOOL_DSSPOOLER_KEY, "description",
                        REG_SZ, (uint8*)buffer.buffer, buffer.uni_str_len*2 );
 
@@ -6129,7 +6129,7 @@ static WERROR update_printer(pipes_struct *p, POLICY_HND *handle, uint32 level,
        }
 
        if (!strequal(printer->info_2->sharename, old_printer->info_2->sharename)) {
-               init_unistr2( &buffer, printer->info_2->sharename, strlen(printer->info_2->sharename)+1 );
+               init_unistr2( &buffer, printer->info_2->sharename, UNI_STR_TERMINATE);
                set_printer_dataex( printer, SPOOL_DSSPOOLER_KEY, "printerName",
                        REG_SZ, (uint8*)buffer.buffer, buffer.uni_str_len*2 );
                set_printer_dataex( printer, SPOOL_DSSPOOLER_KEY, "shareName",
@@ -6139,7 +6139,7 @@ static WERROR update_printer(pipes_struct *p, POLICY_HND *handle, uint32 level,
        }
 
        if (!strequal(printer->info_2->portname, old_printer->info_2->portname)) {
-               init_unistr2( &buffer, printer->info_2->portname, strlen(printer->info_2->portname)+1 );
+               init_unistr2( &buffer, printer->info_2->portname, UNI_STR_TERMINATE);
                set_printer_dataex( printer, SPOOL_DSSPOOLER_KEY, "portName",
                        REG_SZ, (uint8*)buffer.buffer, buffer.uni_str_len*2 );
 
@@ -6147,7 +6147,7 @@ static WERROR update_printer(pipes_struct *p, POLICY_HND *handle, uint32 level,
        }
 
        if (!strequal(printer->info_2->location, old_printer->info_2->location)) {
-               init_unistr2( &buffer, printer->info_2->location, strlen(printer->info_2->location)+1 );
+               init_unistr2( &buffer, printer->info_2->location, UNI_STR_TERMINATE);
                set_printer_dataex( printer, SPOOL_DSSPOOLER_KEY, "location",
                        REG_SZ, (uint8*)buffer.buffer, buffer.uni_str_len*2 );
 
@@ -6157,7 +6157,7 @@ static WERROR update_printer(pipes_struct *p, POLICY_HND *handle, uint32 level,
        /* here we need to update some more DsSpooler keys */
        /* uNCName, serverName, shortServerName */
        
-       init_unistr2( &buffer, global_myname(), strlen(global_myname())+1 );
+       init_unistr2( &buffer, global_myname(), UNI_STR_TERMINATE);
        set_printer_dataex( printer, SPOOL_DSSPOOLER_KEY, "serverName",
                REG_SZ, (uint8*)buffer.buffer, buffer.uni_str_len*2 );
        set_printer_dataex( printer, SPOOL_DSSPOOLER_KEY, "shortServerName",
@@ -6165,7 +6165,7 @@ static WERROR update_printer(pipes_struct *p, POLICY_HND *handle, uint32 level,
 
        slprintf( asc_buffer, sizeof(asc_buffer)-1, "\\\\%s\\%s",
                  global_myname(), printer->info_2->sharename );
-       init_unistr2( &buffer, asc_buffer, strlen(asc_buffer)+1 );
+       init_unistr2( &buffer, asc_buffer, UNI_STR_TERMINATE);
        set_printer_dataex( printer, SPOOL_DSSPOOLER_KEY, "uNCName",
                REG_SZ, (uint8*)buffer.buffer, buffer.uni_str_len*2 );
 
index 61e100c03bb7a12b7650573212120d7294b131cb..05bfb2a0dcce448cd7974d78b561bfee1668e131 100644 (file)
@@ -1568,7 +1568,7 @@ static WERROR cmd_spoolss_addform(struct cli_state *cli, TALLOC_CTX *mem_ctx,
        form.right = 20;
        form.bottom = 30;
 
-       init_unistr2(&form.name, argv[2], strlen(argv[2]) + 1);
+       init_unistr2(&form.name, argv[2], UNI_STR_TERMINATE);
 
        /* Add the form */
 
@@ -1627,7 +1627,7 @@ static WERROR cmd_spoolss_setform(struct cli_state *cli, TALLOC_CTX *mem_ctx,
        form.right = 2000;
        form.bottom = 3000;
 
-       init_unistr2(&form.name, argv[2], strlen(argv[2]) + 1);
+       init_unistr2(&form.name, argv[2], UNI_STR_TERMINATE);
 
        /* Set the form */