diff options
author | Yorhel <git@yorhel.nl> | 2009-04-25 11:49:20 +0200 |
---|---|---|
committer | Yorhel <git@yorhel.nl> | 2009-04-25 11:49:20 +0200 |
commit | 18211ebe2eca4bf1203840c23a87f5aefbfee573 (patch) | |
tree | 3dd61ad8af390b5b8cac3499a6022df8863e538a | |
parent | 00217dd86e55bc5d48c3c5b944366e6352241b57 (diff) |
Properly chdir() before lstat()
-rw-r--r-- | src/calc.c | 16 |
1 files changed, 12 insertions, 4 deletions
@@ -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; |