mirror of
https://github.com/netbirdio/gvisor.git
synced 2026-05-22 17:12:49 -07:00
Fix EOFs when reading from empty canon->noncanon PTY
when switching from canonical to non-canonical mode, only mark inQueue as readable if there is input to be read
This commit is contained in:
@@ -154,7 +154,7 @@ func (l *lineDiscipline) setTermios(task *kernel.Task, args arch.SyscallArgument
|
||||
if oldCanonEnabled && !l.termios.LEnabled(linux.ICANON) {
|
||||
l.inQueue.mu.Lock()
|
||||
l.inQueue.pushWaitBufLocked(l)
|
||||
l.inQueue.readable = true
|
||||
l.inQueue.readable = len(l.inQueue.readBuf) > 0
|
||||
l.inQueue.mu.Unlock()
|
||||
l.termiosMu.Unlock()
|
||||
l.replicaWaiter.Notify(waiter.ReadableEvents)
|
||||
|
||||
@@ -1152,6 +1152,23 @@ TEST_F(PtyTest, SwitchNoncanonToCanonNoNewlineBig) {
|
||||
ExpectFinished(replica_);
|
||||
}
|
||||
|
||||
// If the canonical input buffer is empty, and we switch to non-canonical
|
||||
// mode, the input buffer should not be readable.
|
||||
TEST_F(PtyTest, SwitchCanonToNoncanonEmptyInput) {
|
||||
constexpr char kInput[] = "";
|
||||
ASSERT_THAT(WriteFd(master_.get(), kInput, sizeof(kInput)),
|
||||
SyscallSucceedsWithValue(sizeof(kInput)));
|
||||
|
||||
DisableCanonical();
|
||||
|
||||
// Nothing available yet.
|
||||
char buf[2] = {};
|
||||
ASSERT_THAT(PollAndReadFd(replica_.get(), buf, 2, kTimeoutShort),
|
||||
PosixErrorIs(ETIMEDOUT, ::testing::StrEq("Poll timed out")));
|
||||
|
||||
ExpectFinished(replica_);
|
||||
}
|
||||
|
||||
// Tests that we can write over the 4095 noncanonical limit, then read out
|
||||
// everything.
|
||||
TEST_F(PtyTest, NoncanonBigWrite) {
|
||||
|
||||
Reference in New Issue
Block a user