• Home
  • History
  • Annotate
  • Line#
  • Navigate
  • Raw
  • Download
  • only in /asuswrt-rt-n18u-9.0.0.4.380.2695/release/src-rt-6.x.4708/router/samba-3.5.8/source3/lib/
1/*
2   Unix SMB/CIFS implementation.
3   Samba utility functions
4
5   Copyright (C) Andrew Tridgell 1992-2001
6   Copyright (C) Simo Sorce      2001-2002
7   Copyright (C) Martin Pool     2003
8   Copyright (C) James Peach	 2006
9   Copyright (C) Jeremy Allison  1992-2007
10
11   This program is free software; you can redistribute it and/or modify
12   it under the terms of the GNU General Public License as published by
13   the Free Software Foundation; either version 3 of the License, or
14   (at your option) any later version.
15
16   This program is distributed in the hope that it will be useful,
17   but WITHOUT ANY WARRANTY; without even the implied warranty of
18   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
19   GNU General Public License for more details.
20
21   You should have received a copy of the GNU General Public License
22   along with this program.  If not, see <http://www.gnu.org/licenses/>.
23*/
24
25#include "includes.h"
26
27const char toupper_ascii_fast_table[128] = {
28	0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xa, 0xb, 0xc, 0xd, 0xe, 0xf,
29	0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
30	0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
31	0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f,
32	0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f,
33	0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f,
34	0x60, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f,
35	0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f
36};
37
38/**
39 * Case insensitive string compararison.
40 *
41 * iconv does not directly give us a way to compare strings in
42 * arbitrary unix character sets -- all we can is convert and then
43 * compare.  This is expensive.
44 *
45 * As an optimization, we do a first pass that considers only the
46 * prefix of the strings that is entirely 7-bit.  Within this, we
47 * check whether they have the same value.
48 *
49 * Hopefully this will often give the answer without needing to copy.
50 * In particular it should speed comparisons to literal ascii strings
51 * or comparisons of strings that are "obviously" different.
52 *
53 * If we find a non-ascii character we fall back to converting via
54 * iconv.
55 *
56 * This should never be slower than convering the whole thing, and
57 * often faster.
58 *
59 * A different optimization would be to compare for bitwise equality
60 * in the binary encoding.  (It would be possible thought hairy to do
61 * both simultaneously.)  But in that case if they turn out to be
62 * different, we'd need to restart the whole thing.
63 *
64 * Even better is to implement strcasecmp for each encoding and use a
65 * function pointer.
66 **/
67int StrCaseCmp(const char *s, const char *t)
68{
69
70	const char *ps, *pt;
71	size_t size;
72	smb_ucs2_t *buffer_s, *buffer_t;
73	int ret;
74
75	for (ps = s, pt = t; ; ps++, pt++) {
76		char us, ut;
77
78		if (!*ps && !*pt)
79			return 0; /* both ended */
80 		else if (!*ps)
81			return -1; /* s is a prefix */
82		else if (!*pt)
83			return +1; /* t is a prefix */
84		else if ((*ps & 0x80) || (*pt & 0x80))
85			/* not ascii anymore, do it the hard way
86			 * from here on in */
87			break;
88
89		us = toupper_ascii_fast(*ps);
90		ut = toupper_ascii_fast(*pt);
91		if (us == ut)
92			continue;
93		else if (us < ut)
94			return -1;
95		else if (us > ut)
96			return +1;
97	}
98
99	if (!push_ucs2_talloc(talloc_tos(), &buffer_s, ps, &size)) {
100		return strcmp(ps, pt);
101		/* Not quite the right answer, but finding the right one
102		   under this failure case is expensive, and it's pretty
103		   close */
104	}
105
106	if (!push_ucs2_talloc(talloc_tos(), &buffer_t, pt, &size)) {
107		TALLOC_FREE(buffer_s);
108		return strcmp(ps, pt);
109		/* Not quite the right answer, but finding the right one
110		   under this failure case is expensive, and it's pretty
111		   close */
112	}
113
114	ret = strcasecmp_w(buffer_s, buffer_t);
115	TALLOC_FREE(buffer_s);
116	TALLOC_FREE(buffer_t);
117	return ret;
118}
119
120
121/**
122 Case insensitive string compararison, length limited.
123**/
124int StrnCaseCmp(const char *s, const char *t, size_t len)
125{
126	size_t n = 0;
127	const char *ps, *pt;
128	size_t size;
129	smb_ucs2_t *buffer_s, *buffer_t;
130	int ret;
131
132	for (ps = s, pt = t; n < len ; ps++, pt++, n++) {
133		char us, ut;
134
135		if (!*ps && !*pt)
136			return 0; /* both ended */
137 		else if (!*ps)
138			return -1; /* s is a prefix */
139		else if (!*pt)
140			return +1; /* t is a prefix */
141		else if ((*ps & 0x80) || (*pt & 0x80))
142			/* not ascii anymore, do it the
143			 * hard way from here on in */
144			break;
145
146		us = toupper_ascii_fast(*ps);
147		ut = toupper_ascii_fast(*pt);
148		if (us == ut)
149			continue;
150		else if (us < ut)
151			return -1;
152		else if (us > ut)
153			return +1;
154	}
155
156	if (n == len) {
157		return 0;
158	}
159
160	if (!push_ucs2_talloc(talloc_tos(), &buffer_s, ps, &size)) {
161		return strncmp(ps, pt, len-n);
162		/* Not quite the right answer, but finding the right one
163		   under this failure case is expensive,
164		   and it's pretty close */
165	}
166
167	if (!push_ucs2_talloc(talloc_tos(), &buffer_t, pt, &size)) {
168		TALLOC_FREE(buffer_s);
169		return strncmp(ps, pt, len-n);
170		/* Not quite the right answer, but finding the right one
171		   under this failure case is expensive,
172		   and it's pretty close */
173	}
174
175	ret = strncasecmp_w(buffer_s, buffer_t, len-n);
176	TALLOC_FREE(buffer_s);
177	TALLOC_FREE(buffer_t);
178	return ret;
179}
180
181/**
182 * Compare 2 strings.
183 *
184 * @note The comparison is case-insensitive.
185 **/
186bool strequal(const char *s1, const char *s2)
187{
188	if (s1 == s2)
189		return(true);
190	if (!s1 || !s2)
191		return(false);
192
193	return(StrCaseCmp(s1,s2)==0);
194}
195
196/**
197 * Compare 2 strings up to and including the nth char.
198 *
199 * @note The comparison is case-insensitive.
200 **/
201bool strnequal(const char *s1,const char *s2,size_t n)
202{
203	if (s1 == s2)
204		return(true);
205	if (!s1 || !s2 || !n)
206		return(false);
207
208	return(StrnCaseCmp(s1,s2,n)==0);
209}
210
211/**
212 Compare 2 strings (case sensitive).
213**/
214
215bool strcsequal(const char *s1,const char *s2)
216{
217	if (s1 == s2)
218		return(true);
219	if (!s1 || !s2)
220		return(false);
221
222	return(strcmp(s1,s2)==0);
223}
224
225/**
226Do a case-insensitive, whitespace-ignoring string compare.
227**/
228
229int strwicmp(const char *psz1, const char *psz2)
230{
231	/* if BOTH strings are NULL, return TRUE, if ONE is NULL return */
232	/* appropriate value. */
233	if (psz1 == psz2)
234		return (0);
235	else if (psz1 == NULL)
236		return (-1);
237	else if (psz2 == NULL)
238		return (1);
239
240	/* sync the strings on first non-whitespace */
241	while (1) {
242		while (isspace((int)*psz1))
243			psz1++;
244		while (isspace((int)*psz2))
245			psz2++;
246		if (toupper_ascii(*psz1) != toupper_ascii(*psz2) ||
247				*psz1 == '\0' || *psz2 == '\0')
248			break;
249		psz1++;
250		psz2++;
251	}
252	return (*psz1 - *psz2);
253}
254
255/**
256 Convert a string to "normal" form.
257**/
258
259void strnorm(char *s, int case_default)
260{
261	if (case_default == CASE_UPPER)
262		strupper_m(s);
263	else
264		strlower_m(s);
265}
266
267/**
268 Check if a string is in "normal" case.
269**/
270
271bool strisnormal(const char *s, int case_default)
272{
273	if (case_default == CASE_UPPER)
274		return(!strhaslower(s));
275
276	return(!strhasupper(s));
277}
278
279
280/**
281 String replace.
282 NOTE: oldc and newc must be 7 bit characters
283**/
284void string_replace( char *s, char oldc, char newc )
285{
286	char *p;
287
288	/* this is quite a common operation, so we want it to be
289	   fast. We optimise for the ascii case, knowing that all our
290	   supported multi-byte character sets are ascii-compatible
291	   (ie. they match for the first 128 chars) */
292
293	for (p = s; *p; p++) {
294		if (*p & 0x80) /* mb string - slow path. */
295			break;
296		if (*p == oldc) {
297			*p = newc;
298		}
299	}
300
301	if (!*p)
302		return;
303
304	/* Slow (mb) path. */
305#ifdef BROKEN_UNICODE_COMPOSE_CHARACTERS
306	/* With compose characters we must restart from the beginning. JRA. */
307	p = s;
308#endif
309
310	while (*p) {
311		size_t c_size;
312		next_codepoint(p, &c_size);
313
314		if (c_size == 1) {
315			if (*p == oldc) {
316				*p = newc;
317			}
318		}
319		p += c_size;
320	}
321}
322
323/**
324 *  Skip past some strings in a buffer - old version - no checks.
325 *  **/
326
327char *push_skip_string(char *buf)
328{
329	buf += strlen(buf) + 1;
330	return(buf);
331}
332
333/**
334 Skip past a string in a buffer. Buffer may not be
335 null terminated. end_ptr points to the first byte after
336 then end of the buffer.
337**/
338
339char *skip_string(const char *base, size_t len, char *buf)
340{
341	const char *end_ptr = base + len;
342
343	if (end_ptr < base || !base || !buf || buf >= end_ptr) {
344		return NULL;
345	}
346
347	/* Skip the string */
348	while (*buf) {
349		buf++;
350		if (buf >= end_ptr) {
351			return NULL;
352		}
353	}
354	/* Skip the '\0' */
355	buf++;
356	return buf;
357}
358
359/**
360 Count the number of characters in a string. Normally this will
361 be the same as the number of bytes in a string for single byte strings,
362 but will be different for multibyte.
363**/
364
365size_t str_charnum(const char *s)
366{
367	size_t ret, converted_size;
368	smb_ucs2_t *tmpbuf2 = NULL;
369	if (!push_ucs2_talloc(talloc_tos(), &tmpbuf2, s, &converted_size)) {
370		return 0;
371	}
372	ret = strlen_w(tmpbuf2);
373	TALLOC_FREE(tmpbuf2);
374	return ret;
375}
376
377/**
378 Count the number of characters in a string. Normally this will
379 be the same as the number of bytes in a string for single byte strings,
380 but will be different for multibyte.
381**/
382
383size_t str_ascii_charnum(const char *s)
384{
385	size_t ret, converted_size;
386	char *tmpbuf2 = NULL;
387	if (!push_ascii_talloc(talloc_tos(), &tmpbuf2, s, &converted_size)) {
388		return 0;
389	}
390	ret = strlen(tmpbuf2);
391	TALLOC_FREE(tmpbuf2);
392	return ret;
393}
394
395bool trim_char(char *s,char cfront,char cback)
396{
397	bool ret = false;
398	char *ep;
399	char *fp = s;
400
401	/* Ignore null or empty strings. */
402	if (!s || (s[0] == '\0'))
403		return false;
404
405	if (cfront) {
406		while (*fp && *fp == cfront)
407			fp++;
408		if (!*fp) {
409			/* We ate the string. */
410			s[0] = '\0';
411			return true;
412		}
413		if (fp != s)
414			ret = true;
415	}
416
417	ep = fp + strlen(fp) - 1;
418	if (cback) {
419		/* Attempt ascii only. Bail for mb strings. */
420		while ((ep >= fp) && (*ep == cback)) {
421			ret = true;
422			if ((ep > fp) && (((unsigned char)ep[-1]) & 0x80)) {
423				/* Could be mb... bail back to tim_string. */
424				char fs[2], bs[2];
425				if (cfront) {
426					fs[0] = cfront;
427					fs[1] = '\0';
428				}
429				bs[0] = cback;
430				bs[1] = '\0';
431				return trim_string(s, cfront ? fs : NULL, bs);
432			} else {
433				ep--;
434			}
435		}
436		if (ep < fp) {
437			/* We ate the string. */
438			s[0] = '\0';
439			return true;
440		}
441	}
442
443	ep[1] = '\0';
444	memmove(s, fp, ep-fp+2);
445	return ret;
446}
447
448/**
449 Does a string have any uppercase chars in it?
450**/
451
452bool strhasupper(const char *s)
453{
454	smb_ucs2_t *tmp, *p;
455	bool ret;
456	size_t converted_size;
457
458	if (!push_ucs2_talloc(talloc_tos(), &tmp, s, &converted_size)) {
459		return false;
460	}
461
462	for(p = tmp; *p != 0; p++) {
463		if(isupper_w(*p)) {
464			break;
465		}
466	}
467
468	ret = (*p != 0);
469	TALLOC_FREE(tmp);
470	return ret;
471}
472
473/**
474 Does a string have any lowercase chars in it?
475**/
476
477bool strhaslower(const char *s)
478{
479	smb_ucs2_t *tmp, *p;
480	bool ret;
481	size_t converted_size;
482
483	if (!push_ucs2_talloc(talloc_tos(), &tmp, s, &converted_size)) {
484		return false;
485	}
486
487	for(p = tmp; *p != 0; p++) {
488		if(islower_w(*p)) {
489			break;
490		}
491	}
492
493	ret = (*p != 0);
494	TALLOC_FREE(tmp);
495	return ret;
496}
497
498/**
499 Safe string copy into a known length string. maxlength does not
500 include the terminating zero.
501**/
502
503char *safe_strcpy_fn(const char *fn,
504		int line,
505		char *dest,
506		const char *src,
507		size_t maxlength)
508{
509	size_t len;
510
511	if (!dest) {
512		DEBUG(0,("ERROR: NULL dest in safe_strcpy, "
513			"called from [%s][%d]\n", fn, line));
514		return NULL;
515	}
516
517#ifdef DEVELOPER
518	clobber_region(fn,line,dest, maxlength+1);
519#endif
520
521	if (!src) {
522		*dest = 0;
523		return dest;
524	}
525
526	len = strnlen(src, maxlength+1);
527
528	if (len > maxlength) {
529		DEBUG(0,("ERROR: string overflow by "
530			"%lu (%lu - %lu) in safe_strcpy [%.50s]\n",
531			 (unsigned long)(len-maxlength), (unsigned long)len,
532			 (unsigned long)maxlength, src));
533		len = maxlength;
534	}
535
536	memmove(dest, src, len);
537	dest[len] = 0;
538	return dest;
539}
540
541/**
542 Safe string cat into a string. maxlength does not
543 include the terminating zero.
544**/
545char *safe_strcat_fn(const char *fn,
546		int line,
547		char *dest,
548		const char *src,
549		size_t maxlength)
550{
551	size_t src_len, dest_len;
552
553	if (!dest) {
554		DEBUG(0,("ERROR: NULL dest in safe_strcat, "
555			"called from [%s][%d]\n", fn, line));
556		return NULL;
557	}
558
559	if (!src)
560		return dest;
561
562	src_len = strnlen(src, maxlength + 1);
563	dest_len = strnlen(dest, maxlength + 1);
564
565#ifdef DEVELOPER
566	clobber_region(fn, line, dest + dest_len, maxlength + 1 - dest_len);
567#endif
568
569	if (src_len + dest_len > maxlength) {
570		DEBUG(0,("ERROR: string overflow by %d "
571			"in safe_strcat [%.50s]\n",
572			 (int)(src_len + dest_len - maxlength), src));
573		if (maxlength > dest_len) {
574			memcpy(&dest[dest_len], src, maxlength - dest_len);
575		}
576		dest[maxlength] = 0;
577		return NULL;
578	}
579
580	memcpy(&dest[dest_len], src, src_len);
581	dest[dest_len + src_len] = 0;
582	return dest;
583}
584
585/**
586 Paranoid strcpy into a buffer of given length (includes terminating
587 zero. Strips out all but 'a-Z0-9' and the character in other_safe_chars
588 and replaces with '_'. Deliberately does *NOT* check for multibyte
589 characters. Don't change it !
590**/
591
592char *alpha_strcpy_fn(const char *fn,
593		int line,
594		char *dest,
595		const char *src,
596		const char *other_safe_chars,
597		size_t maxlength)
598{
599	size_t len, i;
600
601#ifdef DEVELOPER
602	clobber_region(fn, line, dest, maxlength);
603#endif
604
605	if (!dest) {
606		DEBUG(0,("ERROR: NULL dest in alpha_strcpy, "
607			"called from [%s][%d]\n", fn, line));
608		return NULL;
609	}
610
611	if (!src) {
612		*dest = 0;
613		return dest;
614	}
615
616	len = strlen(src);
617	if (len >= maxlength)
618		len = maxlength - 1;
619
620	if (!other_safe_chars)
621		other_safe_chars = "";
622
623	for(i = 0; i < len; i++) {
624		int val = (src[i] & 0xff);
625		if (isupper_ascii(val) || islower_ascii(val) ||
626				isdigit(val) || strchr_m(other_safe_chars, val))
627			dest[i] = src[i];
628		else
629			dest[i] = '_';
630	}
631
632	dest[i] = '\0';
633
634	return dest;
635}
636
637/**
638 Like strncpy but always null terminates. Make sure there is room!
639 The variable n should always be one less than the available size.
640**/
641char *StrnCpy_fn(const char *fn, int line,char *dest,const char *src,size_t n)
642{
643	char *d = dest;
644
645#ifdef DEVELOPER
646	clobber_region(fn, line, dest, n+1);
647#endif
648
649	if (!dest) {
650		DEBUG(0,("ERROR: NULL dest in StrnCpy, "
651			"called from [%s][%d]\n", fn, line));
652		return(NULL);
653	}
654
655	if (!src) {
656		*dest = 0;
657		return(dest);
658	}
659
660	while (n-- && (*d = *src)) {
661		d++;
662		src++;
663	}
664
665	*d = 0;
666	return(dest);
667}
668
669#if 0
670/**
671 Like strncpy but copies up to the character marker.  always null terminates.
672 returns a pointer to the character marker in the source string (src).
673**/
674
675static char *strncpyn(char *dest, const char *src, size_t n, char c)
676{
677	char *p;
678	size_t str_len;
679
680#ifdef DEVELOPER
681	clobber_region(dest, n+1);
682#endif
683	p = strchr_m(src, c);
684	if (p == NULL) {
685		DEBUG(5, ("strncpyn: separator character (%c) not found\n", c));
686		return NULL;
687	}
688
689	str_len = PTR_DIFF(p, src);
690	strncpy(dest, src, MIN(n, str_len));
691	dest[str_len] = '\0';
692
693	return p;
694}
695#endif
696
697/**
698 Check if a string is part of a list.
699**/
700
701bool in_list(const char *s, const char *list, bool casesensitive)
702{
703	char *tok = NULL;
704	bool ret = false;
705	TALLOC_CTX *frame;
706
707	if (!list) {
708		return false;
709	}
710
711	frame = talloc_stackframe();
712	while (next_token_talloc(frame, &list, &tok,LIST_SEP)) {
713		if (casesensitive) {
714			if (strcmp(tok,s) == 0) {
715				ret = true;
716				break;
717			}
718		} else {
719			if (StrCaseCmp(tok,s) == 0) {
720				ret = true;
721				break;
722			}
723		}
724	}
725	TALLOC_FREE(frame);
726	return ret;
727}
728
729/* this is used to prevent lots of mallocs of size 1 */
730static const char null_string[] = "";
731
732/**
733 Set a string value, allocing the space for the string
734**/
735
736static bool string_init(char **dest,const char *src)
737{
738	size_t l;
739
740	if (!src)
741		src = "";
742
743	l = strlen(src);
744
745	if (l == 0) {
746		*dest = CONST_DISCARD(char*, null_string);
747	} else {
748		(*dest) = SMB_STRDUP(src);
749		if ((*dest) == NULL) {
750			DEBUG(0,("Out of memory in string_init\n"));
751			return false;
752		}
753	}
754	return(true);
755}
756
757/**
758 Free a string value.
759**/
760
761void string_free(char **s)
762{
763	if (!s || !(*s))
764		return;
765	if (*s == null_string)
766		*s = NULL;
767	SAFE_FREE(*s);
768}
769
770/**
771 Set a string value, deallocating any existing space, and allocing the space
772 for the string
773**/
774
775bool string_set(char **dest,const char *src)
776{
777	string_free(dest);
778	return(string_init(dest,src));
779}
780
781/**
782 Substitute a string for a pattern in another string. Make sure there is
783 enough room!
784
785 This routine looks for pattern in s and replaces it with
786 insert. It may do multiple replacements or just one.
787
788 Any of " ; ' $ or ` in the insert string are replaced with _
789 if len==0 then the string cannot be extended. This is different from the old
790 use of len==0 which was for no length checks to be done.
791**/
792
793void string_sub2(char *s,const char *pattern, const char *insert, size_t len,
794		 bool remove_unsafe_characters, bool replace_once,
795		 bool allow_trailing_dollar)
796{
797	char *p;
798	ssize_t ls,lp,li, i;
799
800	if (!insert || !pattern || !*pattern || !s)
801		return;
802
803	ls = (ssize_t)strlen(s);
804	lp = (ssize_t)strlen(pattern);
805	li = (ssize_t)strlen(insert);
806
807	if (len == 0)
808		len = ls + 1; /* len is number of *bytes* */
809
810	while (lp <= ls && (p = strstr_m(s,pattern))) {
811		if (ls + (li-lp) >= len) {
812			DEBUG(0,("ERROR: string overflow by "
813				"%d in string_sub(%.50s, %d)\n",
814				 (int)(ls + (li-lp) - len),
815				 pattern, (int)len));
816			break;
817		}
818		if (li != lp) {
819			memmove(p+li,p+lp,strlen(p+lp)+1);
820		}
821		for (i=0;i<li;i++) {
822			switch (insert[i]) {
823			case '`':
824			case '"':
825			case '\'':
826			case ';':
827			case '$':
828				/* allow a trailing $
829				 * (as in machine accounts) */
830				if (allow_trailing_dollar && (i == li - 1 )) {
831					p[i] = insert[i];
832					break;
833				}
834			case '%':
835			case '\r':
836			case '\n':
837				if ( remove_unsafe_characters ) {
838					p[i] = '_';
839					/* yes this break should be here
840					 * since we want to fall throw if
841					 * not replacing unsafe chars */
842					break;
843				}
844			default:
845				p[i] = insert[i];
846			}
847		}
848		s = p + li;
849		ls += (li-lp);
850
851		if (replace_once)
852			break;
853	}
854}
855
856void string_sub_once(char *s, const char *pattern,
857		const char *insert, size_t len)
858{
859	string_sub2( s, pattern, insert, len, true, true, false );
860}
861
862void string_sub(char *s,const char *pattern, const char *insert, size_t len)
863{
864	string_sub2( s, pattern, insert, len, true, false, false );
865}
866
867void fstring_sub(char *s,const char *pattern,const char *insert)
868{
869	string_sub(s, pattern, insert, sizeof(fstring));
870}
871
872/**
873 Similar to string_sub2, but it will accept only allocated strings
874 and may realloc them so pay attention at what you pass on no
875 pointers inside strings, no const may be passed
876 as string.
877**/
878
879char *realloc_string_sub2(char *string,
880			const char *pattern,
881			const char *insert,
882			bool remove_unsafe_characters,
883			bool allow_trailing_dollar)
884{
885	char *p, *in;
886	char *s;
887	ssize_t ls,lp,li,ld, i;
888
889	if (!insert || !pattern || !*pattern || !string || !*string)
890		return NULL;
891
892	s = string;
893
894	in = SMB_STRDUP(insert);
895	if (!in) {
896		DEBUG(0, ("realloc_string_sub: out of memory!\n"));
897		return NULL;
898	}
899	ls = (ssize_t)strlen(s);
900	lp = (ssize_t)strlen(pattern);
901	li = (ssize_t)strlen(insert);
902	ld = li - lp;
903	for (i=0;i<li;i++) {
904		switch (in[i]) {
905			case '`':
906			case '"':
907			case '\'':
908			case ';':
909			case '$':
910				/* allow a trailing $
911				 * (as in machine accounts) */
912				if (allow_trailing_dollar && (i == li - 1 )) {
913					break;
914				}
915			case '%':
916			case '\r':
917			case '\n':
918				if ( remove_unsafe_characters ) {
919					in[i] = '_';
920					break;
921				}
922			default:
923				/* ok */
924				break;
925		}
926	}
927
928	while ((p = strstr_m(s,pattern))) {
929		if (ld > 0) {
930			int offset = PTR_DIFF(s,string);
931			string = (char *)SMB_REALLOC(string, ls + ld + 1);
932			if (!string) {
933				DEBUG(0, ("realloc_string_sub: "
934					"out of memory!\n"));
935				SAFE_FREE(in);
936				return NULL;
937			}
938			p = string + offset + (p - s);
939		}
940		if (li != lp) {
941			memmove(p+li,p+lp,strlen(p+lp)+1);
942		}
943		memcpy(p, in, li);
944		s = p + li;
945		ls += ld;
946	}
947	SAFE_FREE(in);
948	return string;
949}
950
951char *realloc_string_sub(char *string,
952			const char *pattern,
953			const char *insert)
954{
955	return realloc_string_sub2(string, pattern, insert, true, false);
956}
957
958/*
959 * Internal guts of talloc_string_sub and talloc_all_string_sub.
960 * talloc version of string_sub2.
961 */
962
963char *talloc_string_sub2(TALLOC_CTX *mem_ctx, const char *src,
964			const char *pattern,
965			const char *insert,
966			bool remove_unsafe_characters,
967			bool replace_once,
968			bool allow_trailing_dollar)
969{
970	char *p, *in;
971	char *s;
972	char *string;
973	ssize_t ls,lp,li,ld, i;
974
975	if (!insert || !pattern || !*pattern || !src) {
976		return NULL;
977	}
978
979	string = talloc_strdup(mem_ctx, src);
980	if (string == NULL) {
981		DEBUG(0, ("talloc_string_sub2: "
982			"talloc_strdup failed\n"));
983		return NULL;
984	}
985
986	s = string;
987
988	in = SMB_STRDUP(insert);
989	if (!in) {
990		DEBUG(0, ("talloc_string_sub2: ENOMEM\n"));
991		return NULL;
992	}
993	ls = (ssize_t)strlen(s);
994	lp = (ssize_t)strlen(pattern);
995	li = (ssize_t)strlen(insert);
996	ld = li - lp;
997
998	for (i=0;i<li;i++) {
999		switch (in[i]) {
1000			case '`':
1001			case '"':
1002			case '\'':
1003			case ';':
1004			case '$':
1005				/* allow a trailing $
1006				 * (as in machine accounts) */
1007				if (allow_trailing_dollar && (i == li - 1 )) {
1008					break;
1009				}
1010			case '%':
1011			case '\r':
1012			case '\n':
1013				if (remove_unsafe_characters) {
1014					in[i] = '_';
1015					break;
1016				}
1017			default:
1018				/* ok */
1019				break;
1020		}
1021	}
1022
1023	while ((p = strstr_m(s,pattern))) {
1024		if (ld > 0) {
1025			int offset = PTR_DIFF(s,string);
1026			string = (char *)TALLOC_REALLOC(mem_ctx, string,
1027							ls + ld + 1);
1028			if (!string) {
1029				DEBUG(0, ("talloc_string_sub: out of "
1030					  "memory!\n"));
1031				SAFE_FREE(in);
1032				return NULL;
1033			}
1034			p = string + offset + (p - s);
1035		}
1036		if (li != lp) {
1037			memmove(p+li,p+lp,strlen(p+lp)+1);
1038		}
1039		memcpy(p, in, li);
1040		s = p + li;
1041		ls += ld;
1042
1043		if (replace_once) {
1044			break;
1045		}
1046	}
1047	SAFE_FREE(in);
1048	return string;
1049}
1050
1051/* Same as string_sub, but returns a talloc'ed string */
1052
1053char *talloc_string_sub(TALLOC_CTX *mem_ctx,
1054			const char *src,
1055			const char *pattern,
1056			const char *insert)
1057{
1058	return talloc_string_sub2(mem_ctx, src, pattern, insert,
1059			true, false, false);
1060}
1061
1062/**
1063 Similar to string_sub() but allows for any character to be substituted.
1064 Use with caution!
1065 if len==0 then the string cannot be extended. This is different from the old
1066 use of len==0 which was for no length checks to be done.
1067**/
1068
1069void all_string_sub(char *s,const char *pattern,const char *insert, size_t len)
1070{
1071	char *p;
1072	ssize_t ls,lp,li;
1073
1074	if (!insert || !pattern || !s)
1075		return;
1076
1077	ls = (ssize_t)strlen(s);
1078	lp = (ssize_t)strlen(pattern);
1079	li = (ssize_t)strlen(insert);
1080
1081	if (!*pattern)
1082		return;
1083
1084	if (len == 0)
1085		len = ls + 1; /* len is number of *bytes* */
1086
1087	while (lp <= ls && (p = strstr_m(s,pattern))) {
1088		if (ls + (li-lp) >= len) {
1089			DEBUG(0,("ERROR: string overflow by "
1090				"%d in all_string_sub(%.50s, %d)\n",
1091				 (int)(ls + (li-lp) - len),
1092				 pattern, (int)len));
1093			break;
1094		}
1095		if (li != lp) {
1096			memmove(p+li,p+lp,strlen(p+lp)+1);
1097		}
1098		memcpy(p, insert, li);
1099		s = p + li;
1100		ls += (li-lp);
1101	}
1102}
1103
1104char *talloc_all_string_sub(TALLOC_CTX *ctx,
1105				const char *src,
1106				const char *pattern,
1107				const char *insert)
1108{
1109	return talloc_string_sub2(ctx, src, pattern, insert,
1110			false, false, false);
1111}
1112
1113/**
1114 Write an octal as a string.
1115**/
1116
1117char *octal_string(int i)
1118{
1119	char *result;
1120	if (i == -1) {
1121		result = talloc_strdup(talloc_tos(), "-1");
1122	}
1123	else {
1124		result = talloc_asprintf(talloc_tos(), "0%o", i);
1125	}
1126	SMB_ASSERT(result != NULL);
1127	return result;
1128}
1129
1130
1131/**
1132 Truncate a string at a specified length.
1133**/
1134
1135char *string_truncate(char *s, unsigned int length)
1136{
1137	if (s && strlen(s) > length)
1138		s[length] = 0;
1139	return s;
1140}
1141
1142/**
1143 Strchr and strrchr_m are very hard to do on general multi-byte strings.
1144 We convert via ucs2 for now.
1145**/
1146
1147char *strchr_m(const char *src, char c)
1148{
1149	smb_ucs2_t *ws = NULL;
1150	char *s2 = NULL;
1151	smb_ucs2_t *p;
1152	const char *s;
1153	char *ret;
1154	size_t converted_size;
1155
1156	/* characters below 0x3F are guaranteed to not appear in
1157	   non-initial position in multi-byte charsets */
1158	if ((c & 0xC0) == 0) {
1159		return strchr(src, c);
1160	}
1161
1162	/* this is quite a common operation, so we want it to be
1163	   fast. We optimise for the ascii case, knowing that all our
1164	   supported multi-byte character sets are ascii-compatible
1165	   (ie. they match for the first 128 chars) */
1166
1167	for (s = src; *s && !(((unsigned char)s[0]) & 0x80); s++) {
1168		if (*s == c)
1169			return (char *)s;
1170	}
1171
1172	if (!*s)
1173		return NULL;
1174
1175#ifdef BROKEN_UNICODE_COMPOSE_CHARACTERS
1176	/* With compose characters we must restart from the beginning. JRA. */
1177	s = src;
1178#endif
1179
1180	if (!push_ucs2_talloc(talloc_tos(), &ws, s, &converted_size)) {
1181		/* Wrong answer, but what can we do... */
1182		return strchr(src, c);
1183	}
1184	p = strchr_w(ws, UCS2_CHAR(c));
1185	if (!p) {
1186		TALLOC_FREE(ws);
1187		return NULL;
1188	}
1189	*p = 0;
1190	if (!pull_ucs2_talloc(talloc_tos(), &s2, ws, &converted_size)) {
1191		SAFE_FREE(ws);
1192		/* Wrong answer, but what can we do... */
1193		return strchr(src, c);
1194	}
1195	ret = (char *)(s+strlen(s2));
1196	TALLOC_FREE(ws);
1197	TALLOC_FREE(s2);
1198	return ret;
1199}
1200
1201char *strrchr_m(const char *s, char c)
1202{
1203	/* characters below 0x3F are guaranteed to not appear in
1204	   non-initial position in multi-byte charsets */
1205	if ((c & 0xC0) == 0) {
1206		return strrchr(s, c);
1207	}
1208
1209	/* this is quite a common operation, so we want it to be
1210	   fast. We optimise for the ascii case, knowing that all our
1211	   supported multi-byte character sets are ascii-compatible
1212	   (ie. they match for the first 128 chars). Also, in Samba
1213	   we only search for ascii characters in 'c' and that
1214	   in all mb character sets with a compound character
1215	   containing c, if 'c' is not a match at position
1216	   p, then p[-1] > 0x7f. JRA. */
1217
1218	{
1219		size_t len = strlen(s);
1220		const char *cp = s;
1221		bool got_mb = false;
1222
1223		if (len == 0)
1224			return NULL;
1225		cp += (len - 1);
1226		do {
1227			if (c == *cp) {
1228				/* Could be a match. Part of a multibyte ? */
1229			       	if ((cp > s) &&
1230					(((unsigned char)cp[-1]) & 0x80)) {
1231					/* Yep - go slow :-( */
1232					got_mb = true;
1233					break;
1234				}
1235				/* No - we have a match ! */
1236			       	return (char *)cp;
1237			}
1238		} while (cp-- != s);
1239		if (!got_mb)
1240			return NULL;
1241	}
1242
1243	/* String contained a non-ascii char. Slow path. */
1244	{
1245		smb_ucs2_t *ws = NULL;
1246		char *s2 = NULL;
1247		smb_ucs2_t *p;
1248		char *ret;
1249		size_t converted_size;
1250
1251		if (!push_ucs2_talloc(talloc_tos(), &ws, s, &converted_size)) {
1252			/* Wrong answer, but what can we do. */
1253			return strrchr(s, c);
1254		}
1255		p = strrchr_w(ws, UCS2_CHAR(c));
1256		if (!p) {
1257			TALLOC_FREE(ws);
1258			return NULL;
1259		}
1260		*p = 0;
1261		if (!pull_ucs2_talloc(talloc_tos(), &s2, ws, &converted_size)) {
1262			TALLOC_FREE(ws);
1263			/* Wrong answer, but what can we do. */
1264			return strrchr(s, c);
1265		}
1266		ret = (char *)(s+strlen(s2));
1267		TALLOC_FREE(ws);
1268		TALLOC_FREE(s2);
1269		return ret;
1270	}
1271}
1272
1273/***********************************************************************
1274 Return the equivalent of doing strrchr 'n' times - always going
1275 backwards.
1276***********************************************************************/
1277
1278char *strnrchr_m(const char *s, char c, unsigned int n)
1279{
1280	smb_ucs2_t *ws = NULL;
1281	char *s2 = NULL;
1282	smb_ucs2_t *p;
1283	char *ret;
1284	size_t converted_size;
1285
1286	if (!push_ucs2_talloc(talloc_tos(), &ws, s, &converted_size)) {
1287		/* Too hard to try and get right. */
1288		return NULL;
1289	}
1290	p = strnrchr_w(ws, UCS2_CHAR(c), n);
1291	if (!p) {
1292		TALLOC_FREE(ws);
1293		return NULL;
1294	}
1295	*p = 0;
1296	if (!pull_ucs2_talloc(talloc_tos(), &s2, ws, &converted_size)) {
1297		TALLOC_FREE(ws);
1298		/* Too hard to try and get right. */
1299		return NULL;
1300	}
1301	ret = (char *)(s+strlen(s2));
1302	TALLOC_FREE(ws);
1303	TALLOC_FREE(s2);
1304	return ret;
1305}
1306
1307/***********************************************************************
1308 strstr_m - We convert via ucs2 for now.
1309***********************************************************************/
1310
1311char *strstr_m(const char *src, const char *findstr)
1312{
1313	smb_ucs2_t *p;
1314	smb_ucs2_t *src_w, *find_w;
1315	const char *s;
1316	char *s2;
1317	char *retp;
1318
1319	size_t converted_size, findstr_len = 0;
1320
1321	/* for correctness */
1322	if (!findstr[0]) {
1323		return (char*)src;
1324	}
1325
1326	/* Samba does single character findstr calls a *lot*. */
1327	if (findstr[1] == '\0')
1328		return strchr_m(src, *findstr);
1329
1330	/* We optimise for the ascii case, knowing that all our
1331	   supported multi-byte character sets are ascii-compatible
1332	   (ie. they match for the first 128 chars) */
1333
1334	for (s = src; *s && !(((unsigned char)s[0]) & 0x80); s++) {
1335		if (*s == *findstr) {
1336			if (!findstr_len)
1337				findstr_len = strlen(findstr);
1338
1339			if (strncmp(s, findstr, findstr_len) == 0) {
1340				return (char *)s;
1341			}
1342		}
1343	}
1344
1345	if (!*s)
1346		return NULL;
1347
1348#if 1 /* def BROKEN_UNICODE_COMPOSE_CHARACTERS */
1349	/* 'make check' fails unless we do this */
1350
1351	/* With compose characters we must restart from the beginning. JRA. */
1352	s = src;
1353#endif
1354
1355	if (!push_ucs2_talloc(talloc_tos(), &src_w, src, &converted_size)) {
1356		DEBUG(0,("strstr_m: src malloc fail\n"));
1357		return NULL;
1358	}
1359
1360	if (!push_ucs2_talloc(talloc_tos(), &find_w, findstr, &converted_size)) {
1361		TALLOC_FREE(src_w);
1362		DEBUG(0,("strstr_m: find malloc fail\n"));
1363		return NULL;
1364	}
1365
1366	p = strstr_w(src_w, find_w);
1367
1368	if (!p) {
1369		TALLOC_FREE(src_w);
1370		TALLOC_FREE(find_w);
1371		return NULL;
1372	}
1373
1374	*p = 0;
1375	if (!pull_ucs2_talloc(talloc_tos(), &s2, src_w, &converted_size)) {
1376		TALLOC_FREE(src_w);
1377		TALLOC_FREE(find_w);
1378		DEBUG(0,("strstr_m: dest malloc fail\n"));
1379		return NULL;
1380	}
1381	retp = (char *)(s+strlen(s2));
1382	TALLOC_FREE(src_w);
1383	TALLOC_FREE(find_w);
1384	TALLOC_FREE(s2);
1385	return retp;
1386}
1387
1388/**
1389 Convert a string to lower case.
1390**/
1391
1392void strlower_m(char *s)
1393{
1394	size_t len;
1395	int errno_save;
1396
1397	/* this is quite a common operation, so we want it to be
1398	   fast. We optimise for the ascii case, knowing that all our
1399	   supported multi-byte character sets are ascii-compatible
1400	   (ie. they match for the first 128 chars) */
1401
1402	while (*s && !(((unsigned char)s[0]) & 0x80)) {
1403		*s = tolower_ascii((unsigned char)*s);
1404		s++;
1405	}
1406
1407	if (!*s)
1408		return;
1409
1410	/* I assume that lowercased string takes the same number of bytes
1411	 * as source string even in UTF-8 encoding. (VIV) */
1412	len = strlen(s) + 1;
1413	errno_save = errno;
1414	errno = 0;
1415	unix_strlower(s,len,s,len);
1416	/* Catch mb conversion errors that may not terminate. */
1417	if (errno)
1418		s[len-1] = '\0';
1419	errno = errno_save;
1420}
1421
1422/**
1423 Convert a string to upper case.
1424**/
1425
1426void strupper_m(char *s)
1427{
1428	size_t len;
1429	int errno_save;
1430
1431	/* this is quite a common operation, so we want it to be
1432	   fast. We optimise for the ascii case, knowing that all our
1433	   supported multi-byte character sets are ascii-compatible
1434	   (ie. they match for the first 128 chars) */
1435
1436	while (*s && !(((unsigned char)s[0]) & 0x80)) {
1437		*s = toupper_ascii_fast((unsigned char)*s);
1438		s++;
1439	}
1440
1441	if (!*s)
1442		return;
1443
1444	/* I assume that lowercased string takes the same number of bytes
1445	 * as source string even in multibyte encoding. (VIV) */
1446	len = strlen(s) + 1;
1447	errno_save = errno;
1448	errno = 0;
1449	unix_strupper(s,len,s,len);
1450	/* Catch mb conversion errors that may not terminate. */
1451	if (errno)
1452		s[len-1] = '\0';
1453	errno = errno_save;
1454}
1455
1456/**
1457 * Calculate the number of units (8 or 16-bit, depending on the
1458 * destination charset), that would be needed to convert the input
1459 * string which is expected to be in in CH_UNIX encoding to the
1460 * destination charset (which should be a unicode charset).
1461 */
1462size_t strlen_m_ext(const char *s, const charset_t dst_charset)
1463{
1464	size_t count = 0;
1465
1466	if (!s) {
1467		return 0;
1468	}
1469
1470	while (*s && !(((uint8_t)*s) & 0x80)) {
1471		s++;
1472		count++;
1473	}
1474
1475	if (!*s) {
1476		return count;
1477	}
1478
1479	while (*s) {
1480		size_t c_size;
1481		codepoint_t c = next_codepoint(s, &c_size);
1482		s += c_size;
1483
1484		switch(dst_charset) {
1485		case CH_UTF16LE:
1486		case CH_UTF16BE:
1487		case CH_UTF16MUNGED:
1488			if (c < 0x10000) {
1489				/* Unicode char fits into 16 bits. */
1490				count += 1;
1491			} else {
1492				/* Double-width unicode char - 32 bits. */
1493				count += 2;
1494			}
1495			break;
1496		case CH_UTF8:
1497			/*
1498			 * this only checks ranges, and does not
1499			 * check for invalid codepoints
1500			 */
1501			if (c < 0x80) {
1502				count += 1;
1503			} else if (c < 0x800) {
1504				count += 2;
1505			} else if (c < 0x1000) {
1506				count += 3;
1507			} else {
1508				count += 4;
1509			}
1510			break;
1511		default:
1512			/*
1513			 * non-unicode encoding:
1514			 * assume that each codepoint fits into
1515			 * one unit in the destination encoding.
1516			 */
1517			count += 1;
1518		}
1519	}
1520
1521	return count;
1522}
1523
1524size_t strlen_m_ext_term(const char *s, const charset_t dst_charset)
1525{
1526	if (!s) {
1527		return 0;
1528	}
1529	return strlen_m_ext(s, dst_charset) + 1;
1530}
1531
1532/**
1533 Count the number of UCS2 characters in a string. Normally this will
1534 be the same as the number of bytes in a string for single byte strings,
1535 but will be different for multibyte.
1536**/
1537
1538size_t strlen_m(const char *s)
1539{
1540	return strlen_m_ext(s, CH_UTF16LE);
1541}
1542
1543/**
1544 Count the number of UCS2 characters in a string including the null
1545 terminator.
1546**/
1547
1548size_t strlen_m_term(const char *s)
1549{
1550	if (!s) {
1551		return 0;
1552	}
1553	return strlen_m(s) + 1;
1554}
1555
1556/*
1557 * Weird helper routine for the winreg pipe: If nothing is around, return 0,
1558 * if a string is there, include the terminator.
1559 */
1560
1561size_t strlen_m_term_null(const char *s)
1562{
1563	size_t len;
1564	if (!s) {
1565		return 0;
1566	}
1567	len = strlen_m(s);
1568	if (len == 0) {
1569		return 0;
1570	}
1571
1572	return len+1;
1573}
1574/**
1575 Return a RFC2254 binary string representation of a buffer.
1576 Used in LDAP filters.
1577 Caller must free.
1578**/
1579
1580char *binary_string_rfc2254(TALLOC_CTX *mem_ctx, const uint8_t *buf, int len)
1581{
1582	char *s;
1583	int i, j;
1584	const char *hex = "0123456789ABCDEF";
1585	s = talloc_array(mem_ctx, char, len * 3 + 1);
1586	if (s == NULL) {
1587		return NULL;
1588	}
1589	for (j=i=0;i<len;i++) {
1590		s[j] = '\\';
1591		s[j+1] = hex[((unsigned char)buf[i]) >> 4];
1592		s[j+2] = hex[((unsigned char)buf[i]) & 0xF];
1593		j += 3;
1594	}
1595	s[j] = 0;
1596	return s;
1597}
1598
1599char *binary_string(char *buf, int len)
1600{
1601	char *s;
1602	int i, j;
1603	const char *hex = "0123456789ABCDEF";
1604	s = (char *)SMB_MALLOC(len * 2 + 1);
1605	if (!s)
1606		return NULL;
1607	for (j=i=0;i<len;i++) {
1608		s[j]   = hex[((unsigned char)buf[i]) >> 4];
1609		s[j+1] = hex[((unsigned char)buf[i]) & 0xF];
1610		j += 2;
1611	}
1612	s[j] = 0;
1613	return s;
1614}
1615
1616/**
1617 Just a typesafety wrapper for snprintf into a fstring.
1618**/
1619
1620int fstr_sprintf(fstring s, const char *fmt, ...)
1621{
1622	va_list ap;
1623	int ret;
1624
1625	va_start(ap, fmt);
1626	ret = vsnprintf(s, FSTRING_LEN, fmt, ap);
1627	va_end(ap);
1628	return ret;
1629}
1630
1631/**
1632 List of Strings manipulation functions
1633**/
1634
1635#define S_LIST_ABS 16 /* List Allocation Block Size */
1636
1637/******************************************************************************
1638 version of standard_sub_basic() for string lists; uses talloc_sub_basic()
1639 for the work
1640 *****************************************************************************/
1641
1642bool str_list_sub_basic( char **list, const char *smb_name,
1643			 const char *domain_name )
1644{
1645	TALLOC_CTX *ctx = list;
1646	char *s, *tmpstr;
1647
1648	while ( *list ) {
1649		s = *list;
1650		tmpstr = talloc_sub_basic(ctx, smb_name, domain_name, s);
1651		if ( !tmpstr ) {
1652			DEBUG(0,("str_list_sub_basic: "
1653				"alloc_sub_basic() return NULL!\n"));
1654			return false;
1655		}
1656
1657		TALLOC_FREE(*list);
1658		*list = tmpstr;
1659
1660		list++;
1661	}
1662
1663	return true;
1664}
1665
1666/******************************************************************************
1667 substitute a specific pattern in a string list
1668 *****************************************************************************/
1669
1670bool str_list_substitute(char **list, const char *pattern, const char *insert)
1671{
1672	TALLOC_CTX *ctx = list;
1673	char *p, *s, *t;
1674	ssize_t ls, lp, li, ld, i, d;
1675
1676	if (!list)
1677		return false;
1678	if (!pattern)
1679		return false;
1680	if (!insert)
1681		return false;
1682
1683	lp = (ssize_t)strlen(pattern);
1684	li = (ssize_t)strlen(insert);
1685	ld = li -lp;
1686
1687	while (*list) {
1688		s = *list;
1689		ls = (ssize_t)strlen(s);
1690
1691		while ((p = strstr_m(s, pattern))) {
1692			t = *list;
1693			d = p -t;
1694			if (ld) {
1695				t = TALLOC_ARRAY(ctx, char, ls +ld +1);
1696				if (!t) {
1697					DEBUG(0,("str_list_substitute: "
1698						"Unable to allocate memory"));
1699					return false;
1700				}
1701				memcpy(t, *list, d);
1702				memcpy(t +d +li, p +lp, ls -d -lp +1);
1703				TALLOC_FREE(*list);
1704				*list = t;
1705				ls += ld;
1706				s = t +d +li;
1707			}
1708
1709			for (i = 0; i < li; i++) {
1710				switch (insert[i]) {
1711					case '`':
1712					case '"':
1713					case '\'':
1714					case ';':
1715					case '$':
1716					case '%':
1717					case '\r':
1718					case '\n':
1719						t[d +i] = '_';
1720						break;
1721					default:
1722						t[d +i] = insert[i];
1723				}
1724			}
1725		}
1726
1727		list++;
1728	}
1729
1730	return true;
1731}
1732
1733
1734#define IPSTR_LIST_SEP	","
1735#define IPSTR_LIST_CHAR	','
1736
1737/**
1738 * Add ip string representation to ipstr list. Used also
1739 * as part of @function ipstr_list_make
1740 *
1741 * @param ipstr_list pointer to string containing ip list;
1742 *        MUST BE already allocated and IS reallocated if necessary
1743 * @param ipstr_size pointer to current size of ipstr_list (might be changed
1744 *        as a result of reallocation)
1745 * @param ip IP address which is to be added to list
1746 * @return pointer to string appended with new ip and possibly
1747 *         reallocated to new length
1748 **/
1749
1750static char *ipstr_list_add(char **ipstr_list, const struct ip_service *service)
1751{
1752	char *new_ipstr = NULL;
1753	char addr_buf[INET6_ADDRSTRLEN];
1754	int ret;
1755
1756	/* arguments checking */
1757	if (!ipstr_list || !service) {
1758		return NULL;
1759	}
1760
1761	print_sockaddr(addr_buf,
1762			sizeof(addr_buf),
1763			&service->ss);
1764
1765	/* attempt to convert ip to a string and append colon separator to it */
1766	if (*ipstr_list) {
1767		if (service->ss.ss_family == AF_INET) {
1768			/* IPv4 */
1769			ret = asprintf(&new_ipstr, "%s%s%s:%d",	*ipstr_list,
1770				       IPSTR_LIST_SEP, addr_buf,
1771				       service->port);
1772		} else {
1773			/* IPv6 */
1774			ret = asprintf(&new_ipstr, "%s%s[%s]:%d", *ipstr_list,
1775				       IPSTR_LIST_SEP, addr_buf,
1776				       service->port);
1777		}
1778		SAFE_FREE(*ipstr_list);
1779	} else {
1780		if (service->ss.ss_family == AF_INET) {
1781			/* IPv4 */
1782			ret = asprintf(&new_ipstr, "%s:%d", addr_buf,
1783				       service->port);
1784		} else {
1785			/* IPv6 */
1786			ret = asprintf(&new_ipstr, "[%s]:%d", addr_buf,
1787				       service->port);
1788		}
1789	}
1790	if (ret == -1) {
1791		return NULL;
1792	}
1793	*ipstr_list = new_ipstr;
1794	return *ipstr_list;
1795}
1796
1797/**
1798 * Allocate and initialise an ipstr list using ip adresses
1799 * passed as arguments.
1800 *
1801 * @param ipstr_list pointer to string meant to be allocated and set
1802 * @param ip_list array of ip addresses to place in the list
1803 * @param ip_count number of addresses stored in ip_list
1804 * @return pointer to allocated ip string
1805 **/
1806
1807char *ipstr_list_make(char **ipstr_list,
1808			const struct ip_service *ip_list,
1809			int ip_count)
1810{
1811	int i;
1812
1813	/* arguments checking */
1814	if (!ip_list || !ipstr_list) {
1815		return 0;
1816	}
1817
1818	*ipstr_list = NULL;
1819
1820	/* process ip addresses given as arguments */
1821	for (i = 0; i < ip_count; i++) {
1822		*ipstr_list = ipstr_list_add(ipstr_list, &ip_list[i]);
1823	}
1824
1825	return (*ipstr_list);
1826}
1827
1828
1829/**
1830 * Parse given ip string list into array of ip addresses
1831 * (as ip_service structures)
1832 *    e.g. [IPv6]:port,192.168.1.100:389,192.168.1.78, ...
1833 *
1834 * @param ipstr ip string list to be parsed
1835 * @param ip_list pointer to array of ip addresses which is
1836 *        allocated by this function and must be freed by caller
1837 * @return number of successfully parsed addresses
1838 **/
1839
1840int ipstr_list_parse(const char *ipstr_list, struct ip_service **ip_list)
1841{
1842	TALLOC_CTX *frame;
1843	char *token_str = NULL;
1844	size_t count;
1845	int i;
1846
1847	if (!ipstr_list || !ip_list)
1848		return 0;
1849
1850	count = count_chars(ipstr_list, IPSTR_LIST_CHAR) + 1;
1851	if ( (*ip_list = SMB_MALLOC_ARRAY(struct ip_service, count)) == NULL ) {
1852		DEBUG(0,("ipstr_list_parse: malloc failed for %lu entries\n",
1853					(unsigned long)count));
1854		return 0;
1855	}
1856
1857	frame = talloc_stackframe();
1858	for ( i=0; next_token_talloc(frame, &ipstr_list, &token_str,
1859				IPSTR_LIST_SEP) && i<count; i++ ) {
1860		char *s = token_str;
1861		char *p = strrchr(token_str, ':');
1862
1863		if (p) {
1864			*p = 0;
1865			(*ip_list)[i].port = atoi(p+1);
1866		}
1867
1868		/* convert single token to ip address */
1869		if (token_str[0] == '[') {
1870			/* IPv6 address. */
1871			s++;
1872			p = strchr(token_str, ']');
1873			if (!p) {
1874				continue;
1875			}
1876			*p = '\0';
1877		}
1878		if (!interpret_string_addr(&(*ip_list)[i].ss,
1879					s,
1880					AI_NUMERICHOST)) {
1881			continue;
1882		}
1883	}
1884	TALLOC_FREE(frame);
1885	return count;
1886}
1887
1888/**
1889 * Safely free ip string list
1890 *
1891 * @param ipstr_list ip string list to be freed
1892 **/
1893
1894void ipstr_list_free(char* ipstr_list)
1895{
1896	SAFE_FREE(ipstr_list);
1897}
1898
1899static const char b64[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
1900
1901/**
1902 * Decode a base64 string into a DATA_BLOB - simple and slow algorithm
1903 **/
1904DATA_BLOB base64_decode_data_blob(const char *s)
1905{
1906	int bit_offset, byte_offset, idx, i, n;
1907	DATA_BLOB decoded = data_blob(s, strlen(s)+1);
1908	unsigned char *d = decoded.data;
1909	char *p;
1910
1911	n=i=0;
1912
1913	while (*s && (p=strchr_m(b64,*s))) {
1914		idx = (int)(p - b64);
1915		byte_offset = (i*6)/8;
1916		bit_offset = (i*6)%8;
1917		d[byte_offset] &= ~((1<<(8-bit_offset))-1);
1918		if (bit_offset < 3) {
1919			d[byte_offset] |= (idx << (2-bit_offset));
1920			n = byte_offset+1;
1921		} else {
1922			d[byte_offset] |= (idx >> (bit_offset-2));
1923			d[byte_offset+1] = 0;
1924			d[byte_offset+1] |= (idx << (8-(bit_offset-2))) & 0xFF;
1925			n = byte_offset+2;
1926		}
1927		s++; i++;
1928	}
1929
1930	if ((n > 0) && (*s == '=')) {
1931		n -= 1;
1932	}
1933
1934	/* fix up length */
1935	decoded.length = n;
1936	return decoded;
1937}
1938
1939/**
1940 * Decode a base64 string in-place - wrapper for the above
1941 **/
1942void base64_decode_inplace(char *s)
1943{
1944	DATA_BLOB decoded = base64_decode_data_blob(s);
1945
1946	if ( decoded.length != 0 ) {
1947		memcpy(s, decoded.data, decoded.length);
1948
1949		/* null terminate */
1950		s[decoded.length] = '\0';
1951	} else {
1952		*s = '\0';
1953	}
1954
1955	data_blob_free(&decoded);
1956}
1957
1958/**
1959 * Encode a base64 string into a talloc()ed string caller to free.
1960 *
1961 * From SQUID: adopted from http://ftp.sunet.se/pub2/gnu/vm/base64-encode.c
1962 * with adjustments
1963 **/
1964
1965char *base64_encode_data_blob(TALLOC_CTX *mem_ctx, DATA_BLOB data)
1966{
1967	int bits = 0;
1968	int char_count = 0;
1969	size_t out_cnt, len, output_len;
1970	char *result;
1971
1972        if (!data.length || !data.data)
1973		return NULL;
1974
1975	out_cnt = 0;
1976	len = data.length;
1977	output_len = data.length * 2 + 4; /* Account for closing bytes. 4 is
1978					   * random but should be enough for
1979					   * the = and \0 */
1980	result = TALLOC_ARRAY(mem_ctx, char, output_len); /* get us plenty of space */
1981	SMB_ASSERT(result != NULL);
1982
1983	while (len--) {
1984		int c = (unsigned char) *(data.data++);
1985		bits += c;
1986		char_count++;
1987		if (char_count == 3) {
1988			result[out_cnt++] = b64[bits >> 18];
1989			result[out_cnt++] = b64[(bits >> 12) & 0x3f];
1990			result[out_cnt++] = b64[(bits >> 6) & 0x3f];
1991			result[out_cnt++] = b64[bits & 0x3f];
1992			bits = 0;
1993			char_count = 0;
1994		} else {
1995			bits <<= 8;
1996		}
1997	}
1998	if (char_count != 0) {
1999		bits <<= 16 - (8 * char_count);
2000		result[out_cnt++] = b64[bits >> 18];
2001		result[out_cnt++] = b64[(bits >> 12) & 0x3f];
2002		if (char_count == 1) {
2003			result[out_cnt++] = '=';
2004			result[out_cnt++] = '=';
2005		} else {
2006			result[out_cnt++] = b64[(bits >> 6) & 0x3f];
2007			result[out_cnt++] = '=';
2008		}
2009	}
2010	result[out_cnt] = '\0';	/* terminate */
2011	return result;
2012}
2013
2014/* read a SMB_BIG_UINT from a string */
2015uint64_t STR_TO_SMB_BIG_UINT(const char *nptr, const char **entptr)
2016{
2017
2018	uint64_t val = -1;
2019	const char *p = nptr;
2020
2021	if (!p) {
2022		if (entptr) {
2023			*entptr = p;
2024		}
2025		return val;
2026	}
2027
2028	while (*p && isspace(*p))
2029		p++;
2030
2031	sscanf(p,"%"PRIu64,&val);
2032	if (entptr) {
2033		while (*p && isdigit(*p))
2034			p++;
2035		*entptr = p;
2036	}
2037
2038	return val;
2039}
2040
2041/* Convert a size specification to a count of bytes. We accept the following
2042 * suffixes:
2043 *	    bytes if there is no suffix
2044 *	kK  kibibytes
2045 *	mM  mebibytes
2046 *	gG  gibibytes
2047 *	tT  tibibytes
2048 *	pP  whatever the ISO name for petabytes is
2049 *
2050 *  Returns 0 if the string can't be converted.
2051 */
2052SMB_OFF_T conv_str_size(const char * str)
2053{
2054        SMB_OFF_T lval;
2055	char * end;
2056
2057        if (str == NULL || *str == '\0') {
2058                return 0;
2059        }
2060
2061#ifdef HAVE_STRTOULL
2062	if (sizeof(SMB_OFF_T) == 8) {
2063	    lval = strtoull(str, &end, 10 /* base */);
2064	} else {
2065	    lval = strtoul(str, &end, 10 /* base */);
2066	}
2067#else
2068	lval = strtoul(str, &end, 10 /* base */);
2069#endif
2070
2071        if (end == NULL || end == str) {
2072                return 0;
2073        }
2074
2075        if (*end) {
2076		SMB_OFF_T lval_orig = lval;
2077
2078                if (strwicmp(end, "K") == 0) {
2079                        lval *= (SMB_OFF_T)1024;
2080                } else if (strwicmp(end, "M") == 0) {
2081                        lval *= ((SMB_OFF_T)1024 * (SMB_OFF_T)1024);
2082                } else if (strwicmp(end, "G") == 0) {
2083                        lval *= ((SMB_OFF_T)1024 * (SMB_OFF_T)1024 *
2084				(SMB_OFF_T)1024);
2085                } else if (strwicmp(end, "T") == 0) {
2086                        lval *= ((SMB_OFF_T)1024 * (SMB_OFF_T)1024 *
2087				(SMB_OFF_T)1024 * (SMB_OFF_T)1024);
2088                } else if (strwicmp(end, "P") == 0) {
2089                        lval *= ((SMB_OFF_T)1024 * (SMB_OFF_T)1024 *
2090				(SMB_OFF_T)1024 * (SMB_OFF_T)1024 *
2091				(SMB_OFF_T)1024);
2092                } else {
2093                        return 0;
2094                }
2095
2096		/* Primitive attempt to detect wrapping on platforms with
2097		 * 4-byte SMB_OFF_T. It's better to let the caller handle
2098		 * a failure than some random number.
2099		 */
2100		if (lval_orig <= lval) {
2101			return 0;
2102		}
2103        }
2104
2105	return lval;
2106}
2107
2108void string_append(char **left, const char *right)
2109{
2110	int new_len = strlen(right) + 1;
2111
2112	if (*left == NULL) {
2113		*left = (char *)SMB_MALLOC(new_len);
2114		*left[0] = '\0';
2115	} else {
2116		new_len += strlen(*left);
2117		*left = (char *)SMB_REALLOC(*left, new_len);
2118	}
2119
2120	if (*left == NULL) {
2121		return;
2122	}
2123
2124	safe_strcat(*left, right, new_len-1);
2125}
2126
2127bool add_string_to_array(TALLOC_CTX *mem_ctx,
2128			 const char *str, const char ***strings,
2129			 int *num)
2130{
2131	char *dup_str = talloc_strdup(mem_ctx, str);
2132
2133	*strings = TALLOC_REALLOC_ARRAY(mem_ctx, *strings,
2134			const char *, (*num)+1);
2135
2136	if ((*strings == NULL) || (dup_str == NULL)) {
2137		*num = 0;
2138		return false;
2139	}
2140
2141	(*strings)[*num] = dup_str;
2142	*num += 1;
2143	return true;
2144}
2145
2146/* Append an sprintf'ed string. Double buffer size on demand. Usable without
2147 * error checking in between. The indiation that something weird happened is
2148 * string==NULL */
2149
2150void sprintf_append(TALLOC_CTX *mem_ctx, char **string, ssize_t *len,
2151		    size_t *bufsize, const char *fmt, ...)
2152{
2153	va_list ap;
2154	char *newstr;
2155	int ret;
2156	bool increased;
2157
2158	/* len<0 is an internal marker that something failed */
2159	if (*len < 0)
2160		goto error;
2161
2162	if (*string == NULL) {
2163		if (*bufsize == 0)
2164			*bufsize = 128;
2165
2166		*string = TALLOC_ARRAY(mem_ctx, char, *bufsize);
2167		if (*string == NULL)
2168			goto error;
2169	}
2170
2171	va_start(ap, fmt);
2172	ret = vasprintf(&newstr, fmt, ap);
2173	va_end(ap);
2174
2175	if (ret < 0)
2176		goto error;
2177
2178	increased = false;
2179
2180	while ((*len)+ret >= *bufsize) {
2181		increased = true;
2182		*bufsize *= 2;
2183		if (*bufsize >= (1024*1024*256))
2184			goto error;
2185	}
2186
2187	if (increased) {
2188		*string = TALLOC_REALLOC_ARRAY(mem_ctx, *string, char,
2189					       *bufsize);
2190		if (*string == NULL) {
2191			goto error;
2192		}
2193	}
2194
2195	StrnCpy((*string)+(*len), newstr, ret);
2196	(*len) += ret;
2197	free(newstr);
2198	return;
2199
2200 error:
2201	*len = -1;
2202	*string = NULL;
2203}
2204
2205/*
2206 * asprintf into a string and strupper_m it after that.
2207 */
2208
2209int asprintf_strupper_m(char **strp, const char *fmt, ...)
2210{
2211	va_list ap;
2212	char *result;
2213	int ret;
2214
2215	va_start(ap, fmt);
2216	ret = vasprintf(&result, fmt, ap);
2217	va_end(ap);
2218
2219	if (ret == -1)
2220		return -1;
2221
2222	strupper_m(result);
2223	*strp = result;
2224	return ret;
2225}
2226
2227char *talloc_asprintf_strupper_m(TALLOC_CTX *t, const char *fmt, ...)
2228{
2229	va_list ap;
2230	char *ret;
2231
2232	va_start(ap, fmt);
2233	ret = talloc_vasprintf(t, fmt, ap);
2234	va_end(ap);
2235
2236	if (ret == NULL) {
2237		return NULL;
2238	}
2239	strupper_m(ret);
2240	return ret;
2241}
2242
2243char *talloc_asprintf_strlower_m(TALLOC_CTX *t, const char *fmt, ...)
2244{
2245	va_list ap;
2246	char *ret;
2247
2248	va_start(ap, fmt);
2249	ret = talloc_vasprintf(t, fmt, ap);
2250	va_end(ap);
2251
2252	if (ret == NULL) {
2253		return NULL;
2254	}
2255	strlower_m(ret);
2256	return ret;
2257}
2258
2259
2260/*
2261   Returns the substring from src between the first occurrence of
2262   the char "front" and the first occurence of the char "back".
2263   Mallocs the return string which must be freed.  Not for use
2264   with wide character strings.
2265*/
2266char *sstring_sub(const char *src, char front, char back)
2267{
2268	char *temp1, *temp2, *temp3;
2269	ptrdiff_t len;
2270
2271	temp1 = strchr(src, front);
2272	if (temp1 == NULL) return NULL;
2273	temp2 = strchr(src, back);
2274	if (temp2 == NULL) return NULL;
2275	len = temp2 - temp1;
2276	if (len <= 0) return NULL;
2277	temp3 = (char*)SMB_MALLOC(len);
2278	if (temp3 == NULL) {
2279		DEBUG(1,("Malloc failure in sstring_sub\n"));
2280		return NULL;
2281	}
2282	memcpy(temp3, temp1+1, len-1);
2283	temp3[len-1] = '\0';
2284	return temp3;
2285}
2286
2287/********************************************************************
2288 Check a string for any occurrences of a specified list of invalid
2289 characters.
2290********************************************************************/
2291
2292bool validate_net_name( const char *name,
2293		const char *invalid_chars,
2294		int max_len)
2295{
2296	int i;
2297
2298	for ( i=0; i<max_len && name[i]; i++ ) {
2299		/* fail if strchr_m() finds one of the invalid characters */
2300		if ( name[i] && strchr_m( invalid_chars, name[i] ) ) {
2301			return false;
2302		}
2303	}
2304
2305	return true;
2306}
2307
2308
2309/*******************************************************************
2310 Add a shell escape character '\' to any character not in a known list
2311 of characters. UNIX charset format.
2312*******************************************************************/
2313
2314#define INCLUDE_LIST "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_/ \t.,"
2315#define INSIDE_DQUOTE_LIST "$`\n\"\\"
2316
2317char *escape_shell_string(const char *src)
2318{
2319	size_t srclen = strlen(src);
2320	char *ret = SMB_MALLOC_ARRAY(char, (srclen * 2) + 1);
2321	char *dest = ret;
2322	bool in_s_quote = false;
2323	bool in_d_quote = false;
2324	bool next_escaped = false;
2325
2326	if (!ret) {
2327		return NULL;
2328	}
2329
2330	while (*src) {
2331		size_t c_size;
2332		codepoint_t c = next_codepoint(src, &c_size);
2333
2334		if (c == INVALID_CODEPOINT) {
2335			SAFE_FREE(ret);
2336			return NULL;
2337		}
2338
2339		if (c_size > 1) {
2340			memcpy(dest, src, c_size);
2341			src += c_size;
2342			dest += c_size;
2343			next_escaped = false;
2344			continue;
2345		}
2346
2347		/*
2348		 * Deal with backslash escaped state.
2349		 * This only lasts for one character.
2350		 */
2351
2352		if (next_escaped) {
2353			*dest++ = *src++;
2354			next_escaped = false;
2355			continue;
2356		}
2357
2358		/*
2359		 * Deal with single quote state. The
2360		 * only thing we care about is exiting
2361		 * this state.
2362		 */
2363
2364		if (in_s_quote) {
2365			if (*src == '\'') {
2366				in_s_quote = false;
2367			}
2368			*dest++ = *src++;
2369			continue;
2370		}
2371
2372		/*
2373		 * Deal with double quote state. The most
2374		 * complex state. We must cope with \, meaning
2375		 * possibly escape next char (depending what it
2376		 * is), ", meaning exit this state, and possibly
2377		 * add an \ escape to any unprotected character
2378		 * (listed in INSIDE_DQUOTE_LIST).
2379		 */
2380
2381		if (in_d_quote) {
2382			if (*src == '\\') {
2383				/*
2384				 * Next character might be escaped.
2385				 * We have to peek. Inside double
2386				 * quotes only INSIDE_DQUOTE_LIST
2387				 * characters are escaped by a \.
2388				 */
2389
2390				char nextchar;
2391
2392				c = next_codepoint(&src[1], &c_size);
2393				if (c == INVALID_CODEPOINT) {
2394					SAFE_FREE(ret);
2395					return NULL;
2396				}
2397				if (c_size > 1) {
2398					/*
2399					 * Don't escape the next char.
2400					 * Just copy the \.
2401					 */
2402					*dest++ = *src++;
2403					continue;
2404				}
2405
2406				nextchar = src[1];
2407
2408				if (nextchar && strchr(INSIDE_DQUOTE_LIST,
2409							(int)nextchar)) {
2410					next_escaped = true;
2411				}
2412				*dest++ = *src++;
2413				continue;
2414			}
2415
2416			if (*src == '\"') {
2417				/* Exit double quote state. */
2418				in_d_quote = false;
2419				*dest++ = *src++;
2420				continue;
2421			}
2422
2423			/*
2424			 * We know the character isn't \ or ",
2425			 * so escape it if it's any of the other
2426			 * possible unprotected characters.
2427			 */
2428
2429	       		if (strchr(INSIDE_DQUOTE_LIST, (int)*src)) {
2430				*dest++ = '\\';
2431			}
2432			*dest++ = *src++;
2433			continue;
2434		}
2435
2436		/*
2437		 * From here to the end of the loop we're
2438		 * not in the single or double quote state.
2439		 */
2440
2441		if (*src == '\\') {
2442			/* Next character must be escaped. */
2443			next_escaped = true;
2444			*dest++ = *src++;
2445			continue;
2446		}
2447
2448		if (*src == '\'') {
2449			/* Go into single quote state. */
2450			in_s_quote = true;
2451			*dest++ = *src++;
2452			continue;
2453		}
2454
2455		if (*src == '\"') {
2456			/* Go into double quote state. */
2457			in_d_quote = true;
2458			*dest++ = *src++;
2459			continue;
2460		}
2461
2462		/* Check if we need to escape the character. */
2463
2464	       	if (!strchr(INCLUDE_LIST, (int)*src)) {
2465			*dest++ = '\\';
2466		}
2467		*dest++ = *src++;
2468	}
2469	*dest++ = '\0';
2470	return ret;
2471}
2472
2473/***************************************************
2474 str_list_make, v3 version. The v4 version does not
2475 look at quoted strings with embedded blanks, so
2476 do NOT merge this function please!
2477***************************************************/
2478
2479#define S_LIST_ABS 16 /* List Allocation Block Size */
2480
2481char **str_list_make_v3(TALLOC_CTX *mem_ctx, const char *string,
2482	const char *sep)
2483{
2484	char **list;
2485	const char *str;
2486	char *s, *tok;
2487	int num, lsize;
2488
2489	if (!string || !*string)
2490		return NULL;
2491
2492	list = TALLOC_ARRAY(mem_ctx, char *, S_LIST_ABS+1);
2493	if (list == NULL) {
2494		return NULL;
2495	}
2496	lsize = S_LIST_ABS;
2497
2498	s = talloc_strdup(list, string);
2499	if (s == NULL) {
2500		DEBUG(0,("str_list_make: Unable to allocate memory"));
2501		TALLOC_FREE(list);
2502		return NULL;
2503	}
2504	if (!sep) sep = LIST_SEP;
2505
2506	num = 0;
2507	str = s;
2508
2509	while (next_token_talloc(list, &str, &tok, sep)) {
2510
2511		if (num == lsize) {
2512			char **tmp;
2513
2514			lsize += S_LIST_ABS;
2515
2516			tmp = TALLOC_REALLOC_ARRAY(mem_ctx, list, char *,
2517						   lsize + 1);
2518			if (tmp == NULL) {
2519				DEBUG(0,("str_list_make: "
2520					"Unable to allocate memory"));
2521				TALLOC_FREE(list);
2522				return NULL;
2523			}
2524
2525			list = tmp;
2526
2527			memset (&list[num], 0,
2528				((sizeof(char**)) * (S_LIST_ABS +1)));
2529		}
2530
2531		list[num] = tok;
2532		num += 1;
2533	}
2534
2535	list[num] = NULL;
2536
2537	TALLOC_FREE(s);
2538	return list;
2539}
2540