[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [16677] trunk/blender/source/blender: fix for [#15020] File browser: going back from the root of all directories introduces "../" ad libitum + harcoded path?

Campbell Barton ideasman42 at gmail.com
Mon Sep 22 17:38:06 CEST 2008


Revision: 16677
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=16677
Author:   campbellbarton
Date:     2008-09-22 17:37:32 +0200 (Mon, 22 Sep 2008)

Log Message:
-----------
fix for [#15020] File browser: going back from the root of all directories introduces "../" ad libitum + harcoded path?
bug was introduced when fixing BLI_cleanup_dir not to write to negative character indicies.
added a BLI_parent_dir(char *path)

Modified Paths:
--------------
    trunk/blender/source/blender/blenlib/BLI_blenlib.h
    trunk/blender/source/blender/blenlib/intern/util.c
    trunk/blender/source/blender/src/editimasel.c
    trunk/blender/source/blender/src/filelist.c
    trunk/blender/source/blender/src/filesel.c

Modified: trunk/blender/source/blender/blenlib/BLI_blenlib.h
===================================================================
--- trunk/blender/source/blender/blenlib/BLI_blenlib.h	2008-09-22 14:52:50 UTC (rev 16676)
+++ trunk/blender/source/blender/blenlib/BLI_blenlib.h	2008-09-22 15:37:32 UTC (rev 16677)
@@ -137,6 +137,9 @@
 void BLI_cleanup_file(const char *relabase, char *dir);
 void BLI_cleanup_dir(const char *relabase, char *dir); /* same as above but adds a trailing slash */
 
+/* go back one directory */
+int BLI_parent_dir(char *path);
+
 	/**
 	 * Blender's path code replacement function.
 	 * Bases @a path strings leading with "//" by the

Modified: trunk/blender/source/blender/blenlib/intern/util.c
===================================================================
--- trunk/blender/source/blender/blenlib/intern/util.c	2008-09-22 14:52:50 UTC (rev 16676)
+++ trunk/blender/source/blender/blenlib/intern/util.c	2008-09-22 15:37:32 UTC (rev 16677)
@@ -1058,6 +1058,21 @@
 	}
 }
 
+int BLI_parent_dir(char *path)
+{
+	char tmp[FILE_MAXDIR+FILE_MAXFILE+4];
+	BLI_strncpy(tmp, path, sizeof(tmp));
+	BLI_add_slash(tmp);
+	strcat(tmp, "../");
+	BLI_cleanup_dir(NULL, tmp);
+ 	
+	if (!BLI_testextensie(tmp, "../")) {
+		BLI_strncpy(path, tmp, sizeof(tmp));	
+		return 1;
+	} else {
+		return 0;
+	}
+}
 
 int BLI_convertstringframe(char *path, int frame)
 {

Modified: trunk/blender/source/blender/src/editimasel.c
===================================================================
--- trunk/blender/source/blender/src/editimasel.c	2008-09-22 14:52:50 UTC (rev 16676)
+++ trunk/blender/source/blender/src/editimasel.c	2008-09-22 15:37:32 UTC (rev 16677)
@@ -959,10 +959,15 @@
 						{
 							error("Path too long, cannot enter this directory");
 						} else {
-							strcat(simasel->dir, file->relname);
-							strcat(simasel->dir,"/");
-							simasel->file[0] = '\0';
-							BLI_cleanup_dir(G.sce, simasel->dir);
+							if (strcmp(file->relname, "..")==0) {
+								/* avoids /../../ */
+								BLI_parent_dir(simasel->dir);
+							} else {
+								strcat(simasel->dir, file->relname);
+								strcat(simasel->dir,"/");
+								simasel->file[0] = '\0';
+								BLI_cleanup_dir(G.sce, simasel->dir);
+							}
 							BIF_filelist_setdir(simasel->files, simasel->dir);
 							BIF_filelist_free(simasel->files);
 							simasel->active_file = -1;

Modified: trunk/blender/source/blender/src/filelist.c
===================================================================
--- trunk/blender/source/blender/src/filelist.c	2008-09-22 14:52:50 UTC (rev 16676)
+++ trunk/blender/source/blender/src/filelist.c	2008-09-22 15:37:32 UTC (rev 16677)
@@ -629,35 +629,7 @@
 
 void BIF_filelist_parent(struct FileList* filelist)
 {
-#ifdef WIN32
-	char c = '\\';
-#else
-	char c = '/';
-#endif
-	char *dir = filelist->dir;
-	size_t len = strlen(dir);
-	
-	while( (len > 0) && (dir[len-1] == c)  )
-	{
-		--len;
-		dir[len] = '\0';
-	}
-	while ( (len > 0) && (dir[len-1] != c) )
-	{
-		--len;
-		dir[len] = '\0';
-	}
-	if (len == 0)
-	{
-		dir[0] = c; dir[1] = '\0';
-	}
-#ifdef WIN32
-	strcat(filelist->dir, "\\");
-#else
-	strcat(filelist->dir, "/");
-#endif
-	
-	BLI_cleanup_dir(G.sce, filelist->dir);
+	BLI_parent_dir(filelist->dir);
 	BLI_make_exist(filelist->dir);
 	BIF_filelist_readdir(filelist);
 }

Modified: trunk/blender/source/blender/src/filesel.c
===================================================================
--- trunk/blender/source/blender/src/filesel.c	2008-09-22 14:52:50 UTC (rev 16676)
+++ trunk/blender/source/blender/src/filesel.c	2008-09-22 15:37:32 UTC (rev 16677)
@@ -555,54 +555,18 @@
 
 void parent(SpaceFile *sfile)
 {
-	short a;
-	char *dir;
+	char path[sizeof(sfile->dir)+4];
 	
 	/* if databrowse: no parent */
 	if(sfile->type==FILE_MAIN && filesel_has_func(sfile)) return;
-
-	dir= sfile->dir;
 	
+	BLI_parent_dir(sfile->dir);
+	
+	if (sfile->type!=FILE_MAIN && (sfile->dir[0]=='\0'))
 #ifdef WIN32
-	if( (a = strlen(dir)) ) {				/* remove all '/' at the end */
-		while(dir[a-1] == '\\') {
-			a--;
-			dir[a] = 0;
-			if (a<=0) break;
-		}
-	}
-	if( (a = strlen(dir)) ) {				/* then remove all until '/' */
-		while(dir[a-1] != '\\') {
-			a--;
-			dir[a] = 0;
-			if (a<=0) break;
-		}
-	}
-	if( (a = strlen(dir)) ) {
-		if (dir[a-1] != '\\') strcat(dir,"\\");
-	}
-	else if(sfile->type!=FILE_MAIN) { 
-		get_default_root(dir);
-	}
+		get_default_root(sfile->dir);
 #else
-	if( (a = strlen(dir)) ) {				/* remove all '/' at the end */
-		while(dir[a-1] == '/') {
-			a--;
-			dir[a] = 0;
-			if (a<=0) break;
-		}
-	}
-	if( (a = strlen(dir)) ) {				/* then remove until '/' */
-		while(dir[a-1] != '/') {
-			a--;
-			dir[a] = 0;
-			if (a<=0) break;
-		}
-	}
-	if ( (a = strlen(dir)) ) {
-		if (dir[a-1] != '/') strcat(dir,"/");
-	}
-	else if(sfile->type!=FILE_MAIN) strcpy(dir,"/");
+		strcpy(sfile->dir,"/");
 #endif
 	
 	/* to be sure */
@@ -1914,9 +1878,14 @@
 						{
 							error("Path too long, cannot enter this directory");
 						} else {
-							strcat(sfile->dir, sfile->filelist[act].relname);
-							strcat(sfile->dir,"/");
-							BLI_cleanup_dir(G.sce, sfile->dir);
+							if (strcmp(sfile->filelist[act].relname, "..")==0) {
+								/* avoids /../../ */
+								BLI_parent_dir(sfile->dir);
+							} else {
+								strcat(sfile->dir, sfile->filelist[act].relname);
+								strcat(sfile->dir,"/");
+								BLI_cleanup_dir(G.sce, sfile->dir);
+							}
 							freefilelist(sfile);						
 							sfile->ofs= 0;
 							do_draw= 1;





More information about the Bf-blender-cvs mailing list