From b290e70432852614eba9261502bf6bc6eb8aadf6 Mon Sep 17 00:00:00 2001 From: David Disseldorp Date: Fri, 1 Apr 2011 11:21:59 -0700 Subject: [PATCH] alpha_strcpy() is a utility function which reportedly: Strips out all but 'a-Z0-9' and the character in other_safe_chars and replaces with '_'. MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit 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 | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/source3/lib/util_str.c b/source3/lib/util_str.c index 3da2b834d20..d86963702e0 100644 --- a/source3/lib/util_str.c +++ b/source3/lib/util_str.c @@ -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] = '_'; -- 2.11.4.GIT