From 91b8a8d1d21b810b6aca44ce647837669efd6dcf Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Thu, 21 Jun 2001 09:10:42 +0000 Subject: next_token() was supposed to be a reentrant replacement for strtok(), but the code suffered from bitrot and is not now reentrant. That means we can get bizarre behaviour i've fixed this by making next_token() reentrant and creating a next_token_nr() that is a small non-reentrant wrapper for those lumps of code (mostly smbclient) that have come to rely on the non-reentrant behaviour (This used to be commit 674ee2f1d12b0afc164a9e9072758fd1c5e54df7) --- source3/lib/util_unistr.c | 150 ---------------------------------------------- 1 file changed, 150 deletions(-) (limited to 'source3/lib/util_unistr.c') diff --git a/source3/lib/util_unistr.c b/source3/lib/util_unistr.c index f6bb7e8068..7058665145 100644 --- a/source3/lib/util_unistr.c +++ b/source3/lib/util_unistr.c @@ -1169,133 +1169,6 @@ smb_ucs2_t tolower_w( smb_ucs2_t val ) return map_table_lower(val); } -static smb_ucs2_t *last_ptr = NULL; - -void set_first_token_w(smb_ucs2_t *ptr) -{ - last_ptr = ptr; -} - -/**************************************************************************** - Get the next token from a string, return False if none found - handles double-quotes. - Based on a routine by GJC@VILLAGE.COM. - Extensively modified by Andrew.Tridgell@anu.edu.au - bufsize is in bytes. -****************************************************************************/ - -static smb_ucs2_t sep_list[] = { (smb_ucs2_t)' ', (smb_ucs2_t)'\t', (smb_ucs2_t)'\n', (smb_ucs2_t)'\r', 0}; -static smb_ucs2_t quotechar = (smb_ucs2_t)'\"'; - -BOOL next_token_w(smb_ucs2_t **ptr, smb_ucs2_t *buff, smb_ucs2_t *sep, size_t bufsize) -{ - smb_ucs2_t *s; - BOOL quoted; - size_t len=1; - - /* - * Convert bufsize to smb_ucs2_t units. - */ - - bufsize /= sizeof(smb_ucs2_t); - - if (!ptr) - ptr = &last_ptr; - if (!ptr) - return(False); - - s = *ptr; - - /* - * Default to simple separators. - */ - - if (!sep) - sep = sep_list; - - /* - * Find the first non sep char. - */ - - while(*s && strchr_w(sep,*s)) - s++; - - /* - * Nothing left ? - */ - - if (!*s) - return(False); - - /* - * Copy over the token. - */ - - for (quoted = False; len < bufsize && *s && (quoted || !strchr_w(sep,*s)); s++) { - if (*s == quotechar) { - quoted = !quoted; - } else { - len++; - *buff++ = *s; - } - } - - *ptr = (*s) ? s+1 : s; - *buff = 0; - last_ptr = *ptr; - - return(True); -} - -/**************************************************************************** - Convert list of tokens to array; dependent on above routine. - Uses last_ptr from above - bit of a hack. -****************************************************************************/ - -smb_ucs2_t **toktocliplist_w(int *ctok, smb_ucs2_t *sep) -{ - smb_ucs2_t *s=last_ptr; - int ictok=0; - smb_ucs2_t **ret, **iret; - - if (!sep) - sep = sep_list; - - while(*s && strchr_w(sep,*s)) - s++; - - /* - * Nothing left ? - */ - - if (!*s) - return(NULL); - - do { - ictok++; - while(*s && (!strchr_w(sep,*s))) - s++; - while(*s && strchr_w(sep,*s)) - *s++=0; - } while(*s); - - *ctok = ictok; - s = last_ptr; - - if (!(ret=iret=malloc(ictok*sizeof(smb_ucs2_t *)))) - return NULL; - - while(ictok--) { - *iret++=s; - while(*s++) - ; - while(!*s) - s++; - } - - return ret; -} - /******************************************************************* Case insensitive string compararison. ********************************************************************/ @@ -1715,29 +1588,6 @@ size_t strhex_to_str_w(char *p, size_t len, const smb_ucs2_t *strhex) return num_chars; } -/**************************************************************************** - Check if a string is part of a list. -****************************************************************************/ - -BOOL in_list_w(smb_ucs2_t *s,smb_ucs2_t *list,BOOL casesensitive) -{ - wpstring tok; - smb_ucs2_t *p=list; - - if (!list) - return(False); - - while (next_token_w(&p,tok,LIST_SEP_W,sizeof(tok))) { - if (casesensitive) { - if (strcmp_w(tok,s) == 0) - return(True); - } else { - if (StrCaseCmp_w(tok,s) == 0) - return(True); - } - } - return(False); -} /* This is used to prevent lots of mallocs of size 2 */ static smb_ucs2_t *null_string = NULL; -- cgit