[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