From 4de245f29be7558cf3dd4c68e038ff6c48b2de26 Mon Sep 17 00:00:00 2001 From: yorhel Date: Fri, 20 Jul 2007 11:29:50 +0000 Subject: [PATCH] Small bugfixes + cygwin patch git-svn-id: svn://blicky.net/ncdu/trunk@2 ce56bc8d-f834-0410-b703-f827bd498a76 --- src/browser.c | 1 + src/calc.c | 41 ++++++++++++++++++++++++++++++++--------- src/ncdu.h | 8 ++++++++ 3 files changed, 41 insertions(+), 9 deletions(-) diff --git a/src/browser.c b/src/browser.c index 0740002..c54ae53 100644 --- a/src/browser.c +++ b/src/browser.c @@ -434,6 +434,7 @@ void browseDir(void) { for(i=1; i 0 && !(i == 1 && dat.name[strlen(dat.name)-1] == '/')) strcat(cdir, "/"); strcat(cdir, dirs[i]->name); } + /* avoid lstat("//name", .) -- Linux:OK, Cygwin:UNC path, POSIX:Implementation-defined */ + if(cdir[0] == '/' && cdir[1] == '\0') + cdir1++; + cdir1len = strlen(cdir1); /* opendir */ if((dir = opendir(cdir)) == NULL) { dirs[level]->flags |= FF_ERR; @@ -213,19 +221,31 @@ int calcUsage() { /* readdir */ errno = 0; while((dr = readdir(dir)) != NULL) { + int namelen; f = dr->d_name; if(f[0] == '.' && (f[1] == '\0' || (f[1] == '.' && f[2] == '\0'))) continue; + namelen = strlen(f); + if(cdir1len+namelen+1 >= PATH_MAX) { + direrr = 1; + errno = 0; + continue; + } d = calloc(sizeof(struct dir), 1); - d->name = malloc(strlen(f)+1); + d->name = malloc(namelen+1); strcpy(d->name, f); if(dirs[level] != NULL) dirs[level]->next = d; d->prev = dirs[level]; d->parent = dirs[level-1]; dirs[level-1]->sub = d; dirs[level] = d; - sprintf(tmp, "%s/%s", cdir, d->name); - lstat(tmp, &fs); + sprintf(tmp, "%s/%s", cdir1, d->name); + if(lstat(tmp, &fs)) { + staterr = 1; + d->flags = FF_ERR; + errno = 0; + continue; + } /* check filetype */ if(sflags & SF_SMFS && dev != fs.st_dev) d->flags |= FF_OTHFS; @@ -247,10 +267,13 @@ int calcUsage() { if(d->flags & FF_OTHFS) d->size = 0; for(i=level; i-->0;) dirs[i]->size += d->size; + errno = 0; } + if(errno) + direrr = 1; closedir(dir); - if(errno) { - dirs[level-1]->flags |= FF_ERR; + if(direrr || staterr) { + dirs[level-1]->flags |= (direrr ? FF_ERR : FF_SERR); for(i=level-1; i-->0;) dirs[i]->flags |= FF_SERR; } diff --git a/src/ncdu.h b/src/ncdu.h index 1960877..eaf8d13 100644 --- a/src/ncdu.h +++ b/src/ncdu.h @@ -47,6 +47,14 @@ #endif #include +/* PATH_MAX 260 on Cygwin is too small for /proc/registry */ +#ifdef __CYGWIN__ +# if PATH_MAX < 1024 +# undef PATH_MAX +# define PATH_MAX 1024 +# endif +#endif + /* get PATH_MAX */ #ifndef PATH_MAX # ifdef _POSIX_PATH_MAX