From 89c034566ea39c586236041f2e3b9a6acf380a03 Mon Sep 17 00:00:00 2001 From: Nathan Wang Date: Thu, 1 Feb 2024 03:51:13 +0000 Subject: [PATCH] Do not return ErrWouldBlock when writing nothing to PTY replica output Previously, writing an empty string to the PTY replica output queue would return linux.ErrWouldBlock. This PR fixes this behavior to not return an error. --- pkg/sentry/fsimpl/devpts/line_discipline.go | 7 ++----- test/syscalls/linux/pty.cc | 19 +++++++++++++++++++ 2 files changed, 21 insertions(+), 5 deletions(-) diff --git a/pkg/sentry/fsimpl/devpts/line_discipline.go b/pkg/sentry/fsimpl/devpts/line_discipline.go index 1f880265d..714554c8c 100644 --- a/pkg/sentry/fsimpl/devpts/line_discipline.go +++ b/pkg/sentry/fsimpl/devpts/line_discipline.go @@ -271,11 +271,8 @@ func (l *lineDiscipline) outputQueueWrite(ctx context.Context, src usermem.IOSeq if err != nil { return 0, err } - if n > 0 { - l.masterWaiter.Notify(waiter.ReadableEvents) - return n, nil - } - return 0, linuxerr.ErrWouldBlock + l.masterWaiter.Notify(waiter.ReadableEvents) + return n, nil } // replicaOpen is called when a replica file descriptor is opened. diff --git a/test/syscalls/linux/pty.cc b/test/syscalls/linux/pty.cc index b2ee0bcc9..d82cdf475 100644 --- a/test/syscalls/linux/pty.cc +++ b/test/syscalls/linux/pty.cc @@ -1384,6 +1384,25 @@ TEST_F(PtyTest, PartialBadBuffer) { EXPECT_THAT(munmap(addr, 2 * kPageSize), SyscallSucceeds()) << addr; } +// Test that writing nothing to the PTY replica's output queue does not return an error. +TEST_F(PtyTest, ReplicaWriteNothingCanonical) { + constexpr char kInput[] = ""; + EXPECT_THAT(WriteFd(replica_.get(), kInput, strlen(kInput)), + SyscallSucceedsWithValue(strlen(kInput))); + + ExpectFinished(master_); +} + +TEST_F(PtyTest, ReplicaWriteNothingNonCanonical) { + DisableCanonical(); + + constexpr char kInput[] = ""; + EXPECT_THAT(WriteFd(replica_.get(), kInput, strlen(kInput)), + SyscallSucceedsWithValue(strlen(kInput))); + + ExpectFinished(master_); +} + TEST_F(PtyTest, SimpleEcho) { constexpr char kInput[] = "Mr. Eko"; EXPECT_THAT(WriteFd(master_.get(), kInput, strlen(kInput)),