--- getdents.c.orig 2003-12-04 19:11:38.000000000 +0200 +++ getdents.c 2003-12-04 19:38:06.000000000 +0200 @@ -117,7 +117,7 @@ size_t kbytes = nbytes; if (offsetof (DIRENT_TYPE, d_name) < offsetof (struct kernel_dirent64, d_name) - && nbytes <= sizeof (DIRENT_TYPE)) + && nbytes <= sizeof (kernel_dirent64)) { kbytes = nbytes + offsetof (struct kernel_dirent64, d_name) - offsetof (DIRENT_TYPE, d_name); @@ -175,8 +175,7 @@ outp->u.d_off = d_off; if ((sizeof (outp->u.d_ino) != sizeof (inp->k.d_ino) && outp->u.d_ino != d_ino) - || (sizeof (outp->u.d_off) != sizeof (inp->k.d_off) - && outp->u.d_off != d_off)) + ) { /* Overflow. If there was at least one entry before this one, return them without error, @@ -190,7 +189,10 @@ return -1; } - last_offset = d_off; + if( last_offset == -1 ) + last_offset = 0; + last_offset += old_reclen; + outp->u.d_reclen = new_reclen; outp->u.d_type = d_type; @@ -213,6 +215,7 @@ const size_t size_diff = (offsetof (DIRENT_TYPE, d_name) - offsetof (struct kernel_dirent, d_name)); + /* bug? (nbytes might be smaller than right side of minus) */ red_nbytes = MIN (nbytes - ((nbytes / (offsetof (DIRENT_TYPE, d_name) + 14)) * size_diff),