[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