Fix a segv in winbindd caused by trying to free an fstring. Make a copy of the machin...
[tprouty/samba.git] / source / lib / util_str.c
index aaba7300fcf19dfc3f27f159ee9f0d1346ccef77..52cdbfceddc694ff95424a313e4c4c171ea0c960 100644 (file)
@@ -126,6 +126,8 @@ BOOL next_token_nr(const char **ptr,char *buff, const char *sep, size_t bufsize)
        return ret;     
 }
 
+static uint16 tmpbuf[sizeof(pstring)];
+
 void set_first_token(char *ptr)
 {
        last_ptr = ptr;
@@ -392,11 +394,9 @@ BOOL strisnormal(const char *s, int case_default)
  NOTE: oldc and newc must be 7 bit characters
 **/
 
-void string_replace( char *s, char oldc, char newc )
+void string_replace( pstring s, char oldc, char newc )
 {
        char *p;
-       smb_ucs2_t *tmp;
-       size_t src_len, len;
 
        /* this is quite a common operation, so we want it to be
           fast. We optimise for the ascii case, knowing that all our
@@ -418,14 +418,9 @@ void string_replace( char *s, char oldc, char newc )
        /* With compose characters we must restart from the beginning. JRA. */
        p = s;
 #endif
-       src_len = strlen(p);
-       len = push_ucs2_allocate(&tmp, p);
-       if (len == -1) {
-               return;
-       }
-       string_replace_w(tmp, UCS2_CHAR(oldc), UCS2_CHAR(newc));
-       pull_ucs2(NULL, p, tmp, src_len+1, -1, STR_TERMINATE);
-       SAFE_FREE(tmp);
+       push_ucs2(NULL, tmpbuf, p, sizeof(tmpbuf), STR_TERMINATE);
+       string_replace_w(tmpbuf, UCS2_CHAR(oldc), UCS2_CHAR(newc));
+       pull_ucs2(NULL, p, tmpbuf, -1, sizeof(tmpbuf), STR_TERMINATE);
 }
 
 /**
@@ -589,22 +584,12 @@ BOOL trim_string(char *s,const char *front,const char *back)
 
 BOOL strhasupper(const char *s)
 {
-       smb_ucs2_t *tmp, *p;
-       BOOL ret;
-
-       if (push_ucs2_allocate(&tmp, s) == -1) {
-               return False;
-       }
-
-       for(p = tmp; *p != 0; p++) {
-               if(isupper_w(*p)) {
-                       break;
-               }
-       }
-
-       ret = (*p != 0);
-       SAFE_FREE(tmp);
-       return ret;
+       smb_ucs2_t *ptr;
+       push_ucs2(NULL, tmpbuf,s, sizeof(tmpbuf), STR_TERMINATE);
+       for(ptr=tmpbuf;*ptr;ptr++)
+               if(isupper_w(*ptr))
+                       return True;
+       return(False);
 }
 
 /**
@@ -613,22 +598,12 @@ BOOL strhasupper(const char *s)
 
 BOOL strhaslower(const char *s)
 {
-       smb_ucs2_t *tmp, *p;
-       BOOL ret;
-
-       if (push_ucs2_allocate(&tmp, s) == -1) {
-               return False;
-       }
-
-       for(p = tmp; *p != 0; p++) {
-               if(islower_w(*p)) {
-                       break;
-               }
-       }
-
-       ret = (*p != 0);
-       SAFE_FREE(tmp);
-       return ret;
+       smb_ucs2_t *ptr;
+       push_ucs2(NULL, tmpbuf,s, sizeof(tmpbuf), STR_TERMINATE);
+       for(ptr=tmpbuf;*ptr;ptr++)
+               if(islower_w(*ptr))
+                       return True;
+       return(False);
 }
 
 /**
@@ -2653,7 +2628,7 @@ size_t utf16_len_n(const void *src, size_t n)
 char *escape_shell_string(const char *src)
 {
        size_t srclen = strlen(src);
-       char *ret = SMB_MALLOC_ARRAY(char, (srclen * 2) + 1);
+       char *ret = SMB_MALLOC((srclen * 2) + 1);
        char *dest = ret;
        BOOL in_s_quote = False;
        BOOL in_d_quote = False;