alpha_strcpy() is a utility function which reportedly: Strips out all but 'a-Z0-9...
authorDavid Disseldorp <ddiss@suse.de>
Fri, 1 Apr 2011 18:21:59 +0000 (11:21 -0700)
committerKarolin Seeger <kseeger@samba.org>
Tue, 14 Jun 2011 10:56:31 +0000 (12:56 +0200)
This statement does not currently hold true in all cases (e.g. src =
"ТАНЦЕВАТЬ").

Part of a fix for bug 8040 - smbclient segfaults when a Cyrillic netbios
name or workgroup is configured.
(cherry picked from commit 3e0f539596fbb867b672eeaff037e81c33428309)

source3/lib/util_str.c

index 3da2b834d20ef32b187e1b00ac52331d93b64fa6..d86963702e03ebc73365d327f08f5f090e098e16 100644 (file)
@@ -586,7 +586,9 @@ char *safe_strcat_fn(const char *fn,
  Paranoid strcpy into a buffer of given length (includes terminating
  zero. Strips out all but 'a-Z0-9' and the character in other_safe_chars
  and replaces with '_'. Deliberately does *NOT* check for multibyte
- characters. Don't change it !
+ characters. Treats src as an array of bytes, not as a multibyte
+ string. Any byte >0x7f is automatically converted to '_'.
+ other_safe_chars must also contain an ascii string (bytes<0x7f).
 **/
 
 char *alpha_strcpy_fn(const char *fn,
@@ -622,8 +624,12 @@ char *alpha_strcpy_fn(const char *fn,
 
        for(i = 0; i < len; i++) {
                int val = (src[i] & 0xff);
-               if (isupper_ascii(val) || islower_ascii(val) ||
-                               isdigit(val) || strchr_m(other_safe_chars, val))
+               if (val > 0x7f) {
+                       dest[i] = '_';
+                       continue;
+               }
+               if (isupper(val) || islower(val) ||
+                               isdigit(val) || strchr(other_safe_chars, val))
                        dest[i] = src[i];
                else
                        dest[i] = '_';