diff --git a/src/calc.c b/src/calc.c index ae3eaecc07ddbc8aaffc8e2a272f3539ed0eb5c2..987b5bd0f09673940097176a13572263c4de793b 100644 --- a/src/calc.c +++ b/src/calc.c @@ -302,15 +302,23 @@ void calc_process() { struct dir *t; /* check root directory */ - if((tmp = path_real(curpath)) == NULL || lstat(tmp, &fs) != 0 || !S_ISDIR(fs.st_mode)) { + if((tmp = path_real(curpath)) == NULL) { failed = 1; strcpy(errmsg, "Directory not found"); - goto fail; + goto calc_fail; } + /* we need to chdir so we can provide relative paths for lstat() and opendir(), + * this to prevent creating path names longer than PATH_MAX */ if(path_chdir(tmp) < 0 || chdir("..") < 0) { failed = 1; strcpy(errmsg, "Couldn't chdir into directory"); - goto fail; + goto calc_fail; + } + /* would be strange for this to fail, but oh well... */ + if(lstat(tmp, &fs) != 0 || !S_ISDIR(fs.st_mode)) { + failed = 1; + strcpy(errmsg, "Couldn't stat directory"); + goto calc_fail; } /* initialize parent dir */ @@ -352,7 +360,7 @@ void calc_process() { /* something went wrong... */ freedir(root); -fail: +calc_fail: while(failed && !input_handle(0)) ; pstate = orig ? ST_BROWSE : ST_QUIT;