From ab6774cebf5c618d0cae579e84bd39666857f78b Mon Sep 17 00:00:00 2001
From: Andrei Vagin <avagin@google.com>
Date: Fri, 21 Jun 2019 17:24:11 -0700
Subject: 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
---
 pkg/sentry/fs/dirent.go | 13 ++++++++++---
 1 file changed, 10 insertions(+), 3 deletions(-)

diff --git a/pkg/sentry/fs/dirent.go b/pkg/sentry/fs/dirent.go
index ca417d2bc..3cba259d9 100644
--- a/pkg/sentry/fs/dirent.go
+++ b/pkg/sentry/fs/dirent.go
@@ -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)
 
-- 
cgit v1.2.3