[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [42029] trunk/blender/source/blender/ blenlib: fix [#29337] Duplicate long shapekey names crash Blender

Campbell Barton ideasman42 at gmail.com
Mon Nov 21 12:53:30 CET 2011


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  */
 




More information about the Bf-blender-cvs mailing list