[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [36433] trunk/blender/source/blender: workaround [#27203] Crashes with some high-res image thumbnail generation

Campbell Barton ideasman42 at gmail.com
Mon May 2 12:22:49 CEST 2011


Revision: 36433
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=36433
Author:   campbellbarton
Date:     2011-05-02 10:22:49 +0000 (Mon, 02 May 2011)
Log Message:
-----------
workaround [#27203] Crashes with some high-res image thumbnail generation
skip generating thumbs for images over 100mb.
also pass string lengths as size_t rather then int for path_util.c functions.

Modified Paths:
--------------
    trunk/blender/source/blender/blenlib/BLI_path_util.h
    trunk/blender/source/blender/blenlib/intern/path_util.c
    trunk/blender/source/blender/imbuf/IMB_thumbs.h
    trunk/blender/source/blender/imbuf/intern/thumbs.c

Modified: trunk/blender/source/blender/blenlib/BLI_path_util.h
===================================================================
--- trunk/blender/source/blender/blenlib/BLI_path_util.h	2011-05-02 10:21:07 UTC (rev 36432)
+++ trunk/blender/source/blender/blenlib/BLI_path_util.h	2011-05-02 10:22:49 UTC (rev 36433)
@@ -109,15 +109,15 @@
 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 @@
 	 * @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 @@
 	 *
 	 * @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

Modified: trunk/blender/source/blender/blenlib/intern/path_util.c
===================================================================
--- trunk/blender/source/blender/blenlib/intern/path_util.c	2011-05-02 10:21:07 UTC (rev 36432)
+++ trunk/blender/source/blender/blenlib/intern/path_util.c	2011-05-02 10:22:49 UTC (rev 36433)
@@ -763,7 +763,7 @@
 	}
 }
 
-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 @@
 }
 
 /* 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 @@
   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 @@
 	}
 
 	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 @@
 }
 
 /* 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_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';
 	

Modified: trunk/blender/source/blender/imbuf/IMB_thumbs.h
===================================================================
--- trunk/blender/source/blender/imbuf/IMB_thumbs.h	2011-05-02 10:21:07 UTC (rev 36432)
+++ trunk/blender/source/blender/imbuf/IMB_thumbs.h	2011-05-02 10:22:49 UTC (rev 36433)
@@ -59,6 +59,9 @@
 	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 */

Modified: trunk/blender/source/blender/imbuf/intern/thumbs.c
===================================================================
--- trunk/blender/source/blender/imbuf/intern/thumbs.c	2011-05-02 10:21:07 UTC (rev 36432)
+++ trunk/blender/source/blender/imbuf/intern/thumbs.c	2011-05-02 10:22:49 UTC (rev 36433)
@@ -275,6 +275,15 @@
 			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)) {




More information about the Bf-blender-cvs mailing list