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;