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;


_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to