diff options
author | Campbell Barton <ideasman42@gmail.com> | 2008-09-22 19:37:32 +0400 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2008-09-22 19:37:32 +0400 |
commit | e4def00d5bc8c4b2947f74d2b5c3308ae07a4eee (patch) | |
tree | c417d2273fb5ac9aa7b89e63f7dd3212a1de4628 /source/blender | |
parent | bc151f133478dff9190fae6e63e58dc7cdbfeb75 (diff) |
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)
Diffstat (limited to 'source/blender')
-rw-r--r-- | source/blender/blenlib/BLI_blenlib.h | 3 | ||||
-rw-r--r-- | source/blender/blenlib/intern/util.c | 15 | ||||
-rw-r--r-- | source/blender/src/editimasel.c | 13 | ||||
-rw-r--r-- | source/blender/src/filelist.c | 30 | ||||
-rw-r--r-- | source/blender/src/filesel.c | 59 |
5 files changed, 42 insertions, 78 deletions
diff --git a/source/blender/blenlib/BLI_blenlib.h b/source/blender/blenlib/BLI_blenlib.h index 6a50e2de0e5..4bbda9709d7 100644 --- a/source/blender/blenlib/BLI_blenlib.h +++ b/source/blender/blenlib/BLI_blenlib.h @@ -137,6 +137,9 @@ void BLI_dlist_reinit(struct DynamicList *dlist); 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 diff --git a/source/blender/blenlib/intern/util.c b/source/blender/blenlib/intern/util.c index 9dfe9557c1b..1630842be05 100644 --- a/source/blender/blenlib/intern/util.c +++ b/source/blender/blenlib/intern/util.c @@ -1058,6 +1058,21 @@ void BLI_makestringcode(const char *relfile, char *file) } } +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) { diff --git a/source/blender/src/editimasel.c b/source/blender/src/editimasel.c index 97ddc2e0f1d..8335af21247 100644 --- a/source/blender/src/editimasel.c +++ b/source/blender/src/editimasel.c @@ -959,10 +959,15 @@ void winqreadimaselspace(ScrArea *sa, void *spacedata, BWinEvent *evt) { 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; diff --git a/source/blender/src/filelist.c b/source/blender/src/filelist.c index 589afb7f75f..c2c0f00885f 100644 --- a/source/blender/src/filelist.c +++ b/source/blender/src/filelist.c @@ -629,35 +629,7 @@ int BIF_filelist_empty(struct FileList* filelist) 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); } diff --git a/source/blender/src/filesel.c b/source/blender/src/filesel.c index cdb001d9193..22f7e577ad9 100644 --- a/source/blender/src/filesel.c +++ b/source/blender/src/filesel.c @@ -555,54 +555,18 @@ static void split_sfile(SpaceFile *sfile, char *s1) 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 @@ void winqreadfilespace(ScrArea *sa, void *spacedata, BWinEvent *evt) { 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; |