commit 52abe8e13010b21ae13d05f1428caca05aa24bdf from: Russ Cox date: Sat Jan 12 16:04:41 2008 UTC libdiskfs: fix ext2 directory reading bug (Mike Mammarella) commit - 1a4b58ebd8421085ce3e8f9f3f513b12e4547271 commit + 52abe8e13010b21ae13d05f1428caca05aa24bdf blob - d0ea65e232f6da81191fbc6748f242fc175e8df8 blob + afd952222c6cba995ea02827ae16aa7015b70be7 --- src/libdiskfs/ext2.c +++ src/libdiskfs/ext2.c @@ -568,7 +568,7 @@ ext2readdir(Fsys *fsys, SunAuthUnix *au, Nfs3Handle *h { u32int nblock; u32int i; - int off, done; + int off, outofspace; uchar *data, *dp, *dep, *p, *ep, *ndp; Dirent de; Inode ino; @@ -588,6 +588,9 @@ ext2readdir(Fsys *fsys, SunAuthUnix *au, Nfs3Handle *h if((ok = inoperm(&ino, au, AREAD)) != Nfs3Ok) return ok; + if(debug) print("readdir cookie %#llux ino.size %#llux\n", + (u64int)cookie, (u64int)ino.size); + if(cookie >= ino.size){ *peof = 1; *pcount = 0; @@ -604,8 +607,8 @@ ext2readdir(Fsys *fsys, SunAuthUnix *au, Nfs3Handle *h nblock = (ino.size+fs->blocksize-1) / fs->blocksize; i = cookie/fs->blocksize; off = cookie%fs->blocksize; - done = 0; - for(; iblocksize; else @@ -642,16 +645,16 @@ ext2readdir(Fsys *fsys, SunAuthUnix *au, Nfs3Handle *h e.name = de.name; e.namelen = de.namlen; e.cookie = (u64int)i*fs->blocksize + (p - b->data); + if(debug) print("%.*s %#llux\n", utfnlen(e.name, e.namelen), e.name, (u64int)e.cookie); if(nfs3entrypack(dp, dep, &ndp, &e) < 0){ - done = 1; + outofspace = 1; break; } dp = ndp; } - off = 0; blockput(b); } - if(i==nblock) + if(i==nblock && !outofspace) *peof = 1; *pcount = dp - data;