Revision: 42029
          
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=42029
Author:   campbellbarton
Date:     2011-11-21 11:53:29 +0000 (Mon, 21 Nov 2011)
Log Message:
-----------
fix [#29337] Duplicate long shapekey names crash Blender
- added BLI_strncat_utf8.
- ensure resulting strings are valid utf8.

Modified Paths:
--------------
    trunk/blender/source/blender/blenlib/BLI_string_utf8.h
    trunk/blender/source/blender/blenlib/intern/path_util.c
    trunk/blender/source/blender/blenlib/intern/string_utf8.c

Modified: trunk/blender/source/blender/blenlib/BLI_string_utf8.h
===================================================================
--- trunk/blender/source/blender/blenlib/BLI_string_utf8.h      2011-11-21 
11:46:05 UTC (rev 42028)
+++ trunk/blender/source/blender/blenlib/BLI_string_utf8.h      2011-11-21 
11:53:29 UTC (rev 42029)
@@ -32,6 +32,7 @@
 #endif
 
 char        *BLI_strncpy_utf8(char *dst, const char *src, size_t maxncpy);
+char        *BLI_strncat_utf8(char *dst, const char *src, size_t maxncpy);
 int          BLI_utf8_invalid_byte(const char *str, int length);
 int          BLI_utf8_invalid_strip(char *str, int length);
 

Modified: trunk/blender/source/blender/blenlib/intern/path_util.c
===================================================================
--- trunk/blender/source/blender/blenlib/intern/path_util.c     2011-11-21 
11:46:05 UTC (rev 42028)
+++ trunk/blender/source/blender/blenlib/intern/path_util.c     2011-11-21 
11:53:29 UTC (rev 42029)
@@ -44,6 +44,7 @@
 #include "BLI_fileops.h"
 #include "BLI_path_util.h"
 #include "BLI_string.h"
+#include "BLI_string_utf8.h"
 #include "BLI_utildefines.h"
 
 #include "BKE_utildefines.h"
@@ -220,17 +221,26 @@
        }
 
        if(unique_check(arg, name)) {
+               char    numstr[16];
                char    tempname[UNIQUE_NAME_MAX];
                char    left[UNIQUE_NAME_MAX];
                int             number;
                int             len= BLI_split_name_num(left, &number, name, 
delim);
                do {
-                       int newlen= BLI_snprintf(tempname, name_len, 
"%s%c%03d", left, delim, ++number);
-                       if(newlen >= name_len) {
-                               len -= ((newlen + 1) - name_len);
-                               if(len < 0) len= number= 0;
-                               left[len]= '\0';
+                       int numlen= BLI_snprintf(numstr, sizeof(numstr), 
"%c%03d", delim, ++number);
+
+                       /* highly unlikely the string only has enough room for 
the number
+                        * but support anyway */
+                       if ((len == 0) || (numlen >= name_len)) {
+                               /* number is know not to be utf-8 */
+                               BLI_strncpy(tempname, numstr, name_len);
                        }
+                       else {
+                               char *tempname_buf;
+                               tempname[0]= '\0';
+                               tempname_buf =BLI_strncat_utf8(tempname, left, 
name_len - numlen);
+                               memcpy(tempname_buf, numstr, numlen + 1);
+                       }
                } while(unique_check(arg, tempname));
 
                BLI_strncpy(name, tempname, name_len);

Modified: trunk/blender/source/blender/blenlib/intern/string_utf8.c
===================================================================
--- trunk/blender/source/blender/blenlib/intern/string_utf8.c   2011-11-21 
11:46:05 UTC (rev 42028)
+++ trunk/blender/source/blender/blenlib/intern/string_utf8.c   2011-11-21 
11:53:29 UTC (rev 42029)
@@ -163,29 +163,47 @@
     3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,4,4,4,4,4,4,4,4,5,5,5,5,6,6,1,1
 };
 
+#define BLI_STR_UTF8_CPY(dst, src, maxncpy)                                   \
+       {                                                                       
  \
+               size_t utf8_size;                                               
      \
+               while(*src != '\0' && (utf8_size= utf8_skip_data[*src]) < 
maxncpy) {  \
+                       maxncpy -= utf8_size;                                   
          \
+                       switch(utf8_size) {                                     
          \
+                               case 6: *dst ++ = *src ++;                      
              \
+                               case 5: *dst ++ = *src ++;                      
              \
+                               case 4: *dst ++ = *src ++;                      
              \
+                               case 3: *dst ++ = *src ++;                      
              \
+                               case 2: *dst ++ = *src ++;                      
              \
+                               case 1: *dst ++ = *src ++;                      
              \
+                       }                                                       
          \
+               }                                                               
      \
+               *dst= '\0';                                                     
      \
+       }
+
 char *BLI_strncpy_utf8(char *dst, const char *src, size_t maxncpy)
 {
        char *dst_r= dst;
-       size_t utf8_size;
 
        /* note: currently we dont attempt to deal with invalid utf8 chars */
+       BLI_STR_UTF8_CPY(dst, src, maxncpy)
 
-       while(*src != '\0' && (utf8_size= utf8_skip_data[*src]) < maxncpy) {
-               maxncpy -= utf8_size;
-               switch(utf8_size) {
-                       case 6: *dst ++ = *src ++;
-                       case 5: *dst ++ = *src ++;
-                       case 4: *dst ++ = *src ++;
-                       case 3: *dst ++ = *src ++;
-                       case 2: *dst ++ = *src ++;
-                       case 1: *dst ++ = *src ++;
-               }
-       }
-       *dst= '\0';
        return dst_r;
 }
 
+char *BLI_strncat_utf8(char *dst, const char *src, size_t maxncpy)
+{
+       while (*dst && maxncpy > 0) {
+               dst++;
+               maxncpy--;
+       }
 
+       BLI_STR_UTF8_CPY(dst, src, maxncpy)
+
+       return dst;
+}
+
+#undef BLI_STR_UTF8_CPY
+
 /* --------------------------------------------------------------------------*/
 /* wchar_t / utf8 functions  */
 

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to