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)),