summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYorhel <git@yorhel.nl>2009-04-25 11:49:20 +0200
committerYorhel <git@yorhel.nl>2009-04-25 11:49:20 +0200
commit18211ebe2eca4bf1203840c23a87f5aefbfee573 (patch)
tree3dd61ad8af390b5b8cac3499a6022df8863e538a
parent00217dd86e55bc5d48c3c5b944366e6352241b57 (diff)
Properly chdir() before lstat()
-rw-r--r--src/calc.c16
1 files changed, 12 insertions, 4 deletions
diff --git a/src/calc.c b/src/calc.c
index ae3eaec..987b5bd 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;