workaround [#27203] Crashes with some high-res image thumbnail generation
authorCampbell Barton <ideasman42@gmail.com>
Mon, 2 May 2011 10:22:49 +0000 (10:22 +0000)
committerCampbell Barton <ideasman42@gmail.com>
Mon, 2 May 2011 10:22:49 +0000 (10:22 +0000)
skip generating thumbs for images over 100mb.
also pass string lengths as size_t rather then int for path_util.c functions.

source/blender/blenlib/BLI_path_util.h
source/blender/blenlib/intern/path_util.c
source/blender/imbuf/IMB_thumbs.h
source/blender/imbuf/intern/thumbs.c

index 3e86079..585f559 100644 (file)
@@ -109,15 +109,15 @@ void BLI_make_file_string(const char *relabase, char *string,  const char *dir,
 void BLI_make_exist(char *dir);
 void BLI_make_existing_file(const char *name);
 void BLI_split_dirfile(const char *string, char *dir, char *file);
-void BLI_join_dirfile(char *string, const int maxlen, const char *dir, const char *file);
+void BLI_join_dirfile(char *string, const size_t maxlen, const char *dir, const char *file);
 char *BLI_path_basename(char *path);
-int BKE_rebase_path(char *abs, int abs_size, char *rel, int rel_size, const char *base_dir, const char *src_dir, const char *dest_dir);
+int BKE_rebase_path(char *abs, size_t abs_len, char *rel, size_t rel_len, const char *base_dir, const char *src_dir, const char *dest_dir);
 char *BLI_last_slash(const char *string);
 int      BLI_add_slash(char *string);
 void  BLI_del_slash(char *string);
 char *BLI_first_slash(char *string);
 
-void BLI_getlastdir(const char* dir, char *last, int maxlen);
+void BLI_getlastdir(const char* dir, char *last, const size_t maxlen);
 int BLI_testextensie(const char *str, const char *ext);
 int BLI_testextensie_array(const char *str, const char **ext_array);
 int BLI_testextensie_glob(const char *str, const char *ext_fnmatch);
@@ -195,7 +195,7 @@ void BLI_char_switch(char *string, char from, char to);
         * @param fullname The full path and full name of the executable
         * @param name The name of the executable (usually argv[0]) to be checked
         */
-void BLI_where_am_i(char *fullname, const int maxlen, const char *name);
+void BLI_where_am_i(char *fullname, const size_t maxlen, const char *name);
 
 char *get_install_dir(void);
        /**
@@ -206,7 +206,7 @@ char *get_install_dir(void);
         *
         * @param fullname The full path to the temp directory
         */
-void BLI_where_is_temp(char *fullname, const int maxlen, int usertemp);
+void BLI_where_is_temp(char *fullname, const size_t maxlen, int usertemp);
 
 
 #ifdef WITH_ICONV
index 1a47a93..6630faf 100644 (file)
@@ -763,7 +763,7 @@ void BLI_splitdirstring(char *di, char *fi)
        }
 }
 
-void BLI_getlastdir(const char* dir, char *last, int maxlen)
+void BLI_getlastdir(const char* dir, char *last, const size_t maxlen)
 {
        const char *s = dir;
        const char *lslash = NULL;
@@ -1441,7 +1441,7 @@ void BLI_split_dirfile(const char *string, char *dir, char *file)
 }
 
 /* simple appending of filename to dir, does not check for valid path! */
-void BLI_join_dirfile(char *string, const int maxlen, const char *dir, const char *file)
+void BLI_join_dirfile(char *string, const size_t maxlen, const char *dir, const char *file)
 {
        int sl_dir;
        
@@ -1491,7 +1491,7 @@ char *BLI_path_basename(char *path)
   that a user gets his images in one place. It'll also provide
   consistent behaviour across exporters.
  */
-int BKE_rebase_path(char *abs, int abs_size, char *rel, int rel_size, const char *base_dir, const char *src_dir, const char *dest_dir)
+int BKE_rebase_path(char *abs, size_t abs_len, char *rel, size_t rel_len, const char *base_dir, const char *src_dir, const char *dest_dir)
 {
        char path[FILE_MAX];
        char dir[FILE_MAX];
@@ -1547,11 +1547,11 @@ int BKE_rebase_path(char *abs, int abs_size, char *rel, int rel_size, const char
        }
 
        if (abs)
-               BLI_strncpy(abs, dest_path, abs_size);
+               BLI_strncpy(abs, dest_path, abs_len);
 
        if (rel) {
-               strncat(rel, rel_dir, rel_size);
-               strncat(rel, base, rel_size);
+               strncat(rel, rel_dir, rel_len);
+               strncat(rel, base, rel_len);
        }
 
        /* return 2 if src=dest */
@@ -1667,7 +1667,7 @@ static int add_win32_extension(char *name)
 }
 
 /* filename must be FILE_MAX length minimum */
-void BLI_where_am_i(char *fullname, const int maxlen, const char *name)
+void BLI_where_am_i(char *fullname, const size_t maxlen, const char *name)
 {
        char filename[FILE_MAXDIR+FILE_MAXFILE];
        const char *path = NULL, *temp;
@@ -1756,7 +1756,7 @@ void BLI_where_am_i(char *fullname, const int maxlen, const char *name)
        }
 }
 
-void BLI_where_is_temp(char *fullname, const int maxlen, int usertemp)
+void BLI_where_is_temp(char *fullname, const size_t maxlen, int usertemp)
 {
        fullname[0] = '\0';
        
index 583a677..f5e63b7 100644 (file)
@@ -59,6 +59,9 @@ typedef enum ThumbSource {
        THB_SOURCE_BLEND
 } ThumbSource;
 
+/* dont generate thumbs for images bigger then this (100mb) */
+#define THUMB_SIZE_MAX (100 * 1024*1024)
+
 // IB_metadata
 
 /* create thumbnail for file and returns new imbuf for thumbnail */
index 3e17665..1d91f34 100644 (file)
@@ -275,6 +275,15 @@ ImBuf* IMB_thumb_create(const char* path, ThumbSize size, ThumbSource source, Im
                        return NULL; /* unknown size */
        }
 
+       /* exception, skip images over 100mb */
+       if(source == THB_SOURCE_IMAGE) {
+               const size_t size= BLI_filepathsize(path);
+               if(size != -1 && size > THUMB_SIZE_MAX) {
+                       // printf("file too big: %d, skipping %s\n", (int)size, path);
+                       return NULL;
+               }
+       }
+
        uri_from_filename(path, uri);
        thumbname_from_uri(uri, thumb, sizeof(thumb));
        if (get_thumb_dir(tdir, size)) {