Fix crash pressing +/- in file-selector
authorCampbell Barton <ideasman42@gmail.com>
Thu, 15 Oct 2015 17:57:52 +0000 (04:57 +1100)
committerCampbell Barton <ideasman42@gmail.com>
Thu, 15 Oct 2015 17:57:52 +0000 (04:57 +1100)
Filenames over 128 chars would crash.
Move BLI_newname into file_ops,
this was only used in one place and isn't all that re-usable.
Also remove special behavior for 4 digits.

source/blender/blenlib/intern/path_util.c
source/blender/editors/space_file/file_ops.c

index 7b291d50bd921b5278bb8b18ec78bc30eae56d48..a32e2c089325b08ce0feaae15b9a902fe6aa536c 100644 (file)
@@ -190,31 +190,6 @@ int BLI_split_name_num(char *left, int *nr, const char *name, const char delim)
        return name_len;
 }
 
-/**
- * Looks for a string of digits within name (using BLI_stringdec) and adjusts it by add.
- */
-void BLI_newname(char *name, int add)
-{
-       char head[UNIQUE_NAME_MAX], tail[UNIQUE_NAME_MAX];
-       int pic;
-       unsigned short digits;
-       
-       pic = BLI_stringdec(name, head, tail, &digits);
-       
-       /* are we going from 100 -> 99 or from 10 -> 9 */
-       if (add < 0 && digits < 4 && digits > 0) {
-               int i, exp;
-               exp = 1;
-               for (i = digits; i > 1; i--) exp *= 10;
-               if (pic >= exp && (pic + add) < exp) digits--;
-       }
-       
-       pic += add;
-       
-       if (digits == 4 && pic < 0) pic = 0;
-       BLI_stringenc(name, head, tail, digits, pic);
-}
-
 /**
  * Ensures name is unique (according to criteria specified by caller in unique_check callback),
  * incrementing its numeric suffix as necessary. Returns true if name had to be adjusted.
index 8347ad872589ad137912102253aaf72a39b02a44..36572d6469dd0a4b77c0d8602fda648038ac8ed0 100644 (file)
@@ -2033,6 +2033,37 @@ void FILE_OT_bookmark_toggle(struct wmOperatorType *ot)
 }
 
 
+/**
+ * Looks for a string of digits within name (using BLI_stringdec) and adjusts it by add.
+ */
+static void filenum_newname(char *name, size_t name_size, int add)
+{
+       char head[FILE_MAXFILE], tail[FILE_MAXFILE];
+       char name_temp[FILE_MAXFILE];
+       int pic;
+       unsigned short digits;
+
+       pic = BLI_stringdec(name, head, tail, &digits);
+
+       /* are we going from 100 -> 99 or from 10 -> 9 */
+       if (add < 0 && digits > 0) {
+               int i, exp;
+               exp = 1;
+               for (i = digits; i > 1; i--) {
+                       exp *= 10;
+               }
+               if (pic >= exp && (pic + add) < exp) {
+                       digits--;
+               }
+       }
+
+       pic += add;
+       if (pic < 0)
+               pic = 0;
+       BLI_stringenc(name_temp, head, tail, digits, pic);
+       BLI_strncpy(name, name_temp, name_size);
+}
+
 static int file_filenum_exec(bContext *C, wmOperator *op)
 {
        SpaceFile *sfile = CTX_wm_space_file(C);
@@ -2040,7 +2071,7 @@ static int file_filenum_exec(bContext *C, wmOperator *op)
        
        int inc = RNA_int_get(op->ptr, "increment");
        if (sfile->params && (inc != 0)) {
-               BLI_newname(sfile->params->file, inc);
+               filenum_newname(sfile->params->file, sizeof(sfile->params->file), inc);
                ED_area_tag_redraw(sa);
                file_draw_check(C);
                // WM_event_add_notifier(C, NC_WINDOW, NULL);