tlibdiskfs: fix ext2 directory reading bug (Mike Mammarella) - plan9port - [fork] Plan 9 from user space (HTM) git clone git://src.adamsgaard.dk/plan9port (DIR) Log (DIR) Files (DIR) Refs (DIR) README (DIR) LICENSE --- (DIR) commit 52abe8e13010b21ae13d05f1428caca05aa24bdf (DIR) parent 1a4b58ebd8421085ce3e8f9f3f513b12e4547271 (HTM) Author: Russ Cox <rsc@swtch.com> Date: Sat, 12 Jan 2008 11:04:41 -0500 libdiskfs: fix ext2 directory reading bug (Mike Mammarella) Diffstat: M src/libdiskfs/ext2.c | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) --- (DIR) diff --git a/src/libdiskfs/ext2.c b/src/libdiskfs/ext2.c t@@ -568,7 +568,7 @@ ext2readdir(Fsys *fsys, SunAuthUnix *au, Nfs3Handle *h, u32int count, u64int coo { u32int nblock; u32int i; - int off, done; + int off, outofspace; uchar *data, *dp, *dep, *p, *ep, *ndp; Dirent de; Inode ino; t@@ -588,6 +588,9 @@ ext2readdir(Fsys *fsys, SunAuthUnix *au, Nfs3Handle *h, u32int count, u64int coo 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; t@@ -604,8 +607,8 @@ ext2readdir(Fsys *fsys, SunAuthUnix *au, Nfs3Handle *h, u32int count, u64int coo nblock = (ino.size+fs->blocksize-1) / fs->blocksize; i = cookie/fs->blocksize; off = cookie%fs->blocksize; - done = 0; - for(; i<nblock && !done; i++){ + outofspace = 0; + for(; i<nblock && !outofspace; i++, off=0){ if(i==nblock-1) want = ino.size % fs->blocksize; else t@@ -642,16 +645,16 @@ ext2readdir(Fsys *fsys, SunAuthUnix *au, Nfs3Handle *h, u32int count, u64int coo 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;