gvisor/fs: getdents returns 0 if offset is equal to FileMaxOffset

FileMaxOffset is a special case when lseek(d, 0, SEEK_END) has been called.

PiperOrigin-RevId: 254498777
This commit is contained in:
Andrei Vagin 2019-06-21 17:24:11 -07:00 committed by gVisor bot
parent 6f933a934f
commit ab6774cebf
1 changed files with 10 additions and 3 deletions

View File

@ -948,9 +948,6 @@ func direntReaddir(ctx context.Context, d *Dirent, it DirIterator, root *Dirent,
if dirCtx.Serializer == nil {
panic("Dirent.Readdir: serializer must not be nil")
}
if d.frozen {
return d.readdirFrozen(root, offset, dirCtx)
}
// Check that this is actually a directory before emitting anything.
// Once we have written entries for "." and "..", future errors from
@ -959,6 +956,16 @@ func direntReaddir(ctx context.Context, d *Dirent, it DirIterator, root *Dirent,
return 0, syserror.ENOTDIR
}
// This is a special case for lseek(fd, 0, SEEK_END).
// See SeekWithDirCursor for more details.
if offset == FileMaxOffset {
return offset, nil
}
if d.frozen {
return d.readdirFrozen(root, offset, dirCtx)
}
// Collect attrs for "." and "..".
dot, dotdot := d.GetDotAttrs(root)