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)
This commit is contained in:
Campbell Barton 2008-09-22 15:37:32 +00:00
parent bc151f1334
commit e4def00d5b
5 changed files with 42 additions and 78 deletions

@ -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

@ -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)
{

@ -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;

@ -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);
}

@ -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;