fix for crash's in file selector.

- on unix BLI_diskfree was only using 100 chars for the dir name, and 
not checking if the name given was longer, increased to FILE_MAXDIR 
(160) and added a check, return -1 if its too long.

The file selector only allowed 80 chars to be typed into the directory 
entry.

Made the file selector check that the path is less then FILE_MIXDIR, if 
you try and enter a path thats longer it will tell you that the path is 
too long, before it was writing into other memory and crashing.
This commit is contained in:
Campbell Barton 2007-10-21 09:32:18 +00:00
parent 3a04520686
commit bacfc9eb91
4 changed files with 33 additions and 16 deletions

@ -180,12 +180,15 @@ double BLI_diskfree(char *dir)
return (double) (freec*bytesps*sectorspc);
#else
struct statfs disk;
char name[100],*slash;
char name[FILE_MAXDIR],*slash;
int len = strlen(dir);
if (len >= FILE_MAXDIR) /* path too long */
return -1;
strcpy(name,dir);
if(strlen(name)){
if(len){
slash = strrchr(name,'/');
if (slash) slash[1] = 0;
} else strcpy(name,"/");

@ -1039,7 +1039,7 @@ void drawfilespace(ScrArea *sa, void *spacedata)
else loadbutton= 0;
uiBlockBeginAlign(block);
uiDefBut(block, TEX, B_FS_DIRNAME,"", textrct.xmin + (strp?20:0), filebuty2, textrct.xmax-textrct.xmin-loadbutton - (strp?20:0), 21, sfile->dir, 0.0, (float)FILE_MAXFILE-1, 0, 0, "Directory, enter a directory and press enter to create it"); /* Directory input */
uiDefBut(block, TEX, B_FS_DIRNAME,"", textrct.xmin + (strp?20:0), filebuty2, textrct.xmax-textrct.xmin-loadbutton - (strp?20:0), 21, sfile->dir, 0.0, (float)FILE_MAXDIR-1, 0, 0, "Directory, enter a directory and press enter to create it"); /* Directory input */
if(loadbutton) {
uiSetCurFont(block, UI_HELV);
uiDefBut(block, BUT, B_FS_LOAD, sfile->title, textrct.xmax-loadbutton, filebuty2, loadbutton, 21, sfile->dir, 0.0, (float)FILE_MAXFILE-1, 0, 0, "");
@ -1833,12 +1833,20 @@ void winqreadfilespace(ScrArea *sa, void *spacedata, BWinEvent *evt)
if(act>=0 && act<sfile->totfile) {
if(S_ISDIR(sfile->filelist[act].type)) {
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;
/* the path is too long and we are not going up! */
if (strcmp(sfile->filelist[act].relname, ".") &&
strcmp(sfile->filelist[act].relname, "..") &&
strlen(sfile->dir) + strlen(sfile->filelist[act].relname) >= FILE_MAXDIR )
{
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);
freefilelist(sfile);
sfile->ofs= 0;
do_draw= 1;
}
}
else {
if( strcmp(sfile->file, sfile->filelist[act].relname)) {

@ -188,7 +188,7 @@ void file_buttons(void)
BIF_DrawString(G.font, naam, 0);
}
/* always do as last */
curarea->headbutlen= xco+2*XIC;
}

@ -745,11 +745,17 @@ static void do_history(char *name)
void BIF_write_file(char *target)
{
Library *li;
int writeflags;
char di[FILE_MAXDIR];
int writeflags, len;
char di[FILE_MAX];
char *err;
if (BLI_streq(target, "")) return;
len = strlen(target);
if (len == 0) return;
if (len >= FILE_MAX) {
error("Path too long, cannot save");
return;
}
/* send the OnSave event */
if (G.f & G_DOSCRIPTLINKS) BPY_do_pyscript(&G.scene->id, SCRIPT_ONSAVE);
@ -761,7 +767,7 @@ void BIF_write_file(char *target)
}
}
if (!BLO_has_bfile_extension(target)) {
if (!BLO_has_bfile_extension(target) && (len+6 < FILE_MAX)) {
sprintf(di, "%s.blend", target);
} else {
strcpy(di, target);