Page MenuHomeFreeBSD

D43457.id132774.diff
No OneTemporary

D43457.id132774.diff

diff --git a/sys/kern/tty_pts.c b/sys/kern/tty_pts.c
--- a/sys/kern/tty_pts.c
+++ b/sys/kern/tty_pts.c
@@ -271,12 +271,7 @@
return (0);
case FIONREAD:
tty_lock(tp);
- if (psc->pts_flags & PTS_FINISHED) {
- /* Force read() to be called. */
- *(int *)data = 1;
- } else {
- *(int *)data = ttydisc_getc_poll(tp);
- }
+ *(int *)data = ttydisc_getc_poll(tp);
tty_unlock(tp);
return (0);
case FIODGNAME:
diff --git a/tests/sys/kern/Makefile b/tests/sys/kern/Makefile
--- a/tests/sys/kern/Makefile
+++ b/tests/sys/kern/Makefile
@@ -39,6 +39,7 @@
PLAIN_TESTS_C+= subr_unit_test
ATF_TESTS_C+= sysctl_kern_proc
ATF_TESTS_C+= sys_getrandom
+ATF_TESTS_C+= tty_pts
ATF_TESTS_C+= unix_dgram
ATF_TESTS_C+= unix_passfd_dgram
TEST_METADATA.unix_passfd_dgram+= is_exclusive="true"
@@ -87,6 +88,8 @@
CFLAGS.mqueue_test+= -I${SRCTOP}/tests
LIBADD.mqueue_test+= rt
+LIBADD.tty_pts+= atf_c util
+
ATF_TESTS_C+= libkern_crc32
SRCS.libkern_crc32+= libkern_crc32.c
.PATH: ${SRCTOP}/sys/libkern
diff --git a/tests/sys/kern/tty_pts.c b/tests/sys/kern/tty_pts.c
new file mode 100644
--- /dev/null
+++ b/tests/sys/kern/tty_pts.c
@@ -0,0 +1,64 @@
+/*-
+ * Copyright (c) 2024 Kyle Evans <kevans@FreeBSD.org>
+ *
+ * SPDX-License-Identifier: BSD-2-Clause
+ */
+
+#include <sys/types.h>
+#include <sys/ioctl.h>
+
+#include <termios.h>
+
+#include <atf-c.h>
+#include <libutil.h>
+
+/* Just a little more concise. */
+#define newpty(masterp, slavep) openpty((masterp), (slavep), NULL, NULL, NULL)
+
+ATF_TC_WITHOUT_HEAD(fionread);
+ATF_TC_BODY(fionread, tc)
+{
+ char rbuf[32];
+ char buf[] = "Hello";
+ int master, slave;
+ int bytes;
+
+ ATF_REQUIRE_EQ(0, newpty(&master, &slave));
+
+ /* Should be empty to begin with. */
+ ATF_REQUIRE_EQ(0, ioctl(master, FIONREAD, &bytes));
+ ATF_REQUIRE_EQ(0, bytes);
+
+ ATF_REQUIRE_EQ(sizeof(buf) - 1, write(slave, buf, sizeof(buf) - 1));
+ ATF_REQUIRE_EQ(0, ioctl(master, FIONREAD, &bytes));
+ ATF_REQUIRE_EQ(sizeof(buf) - 1, bytes);
+
+ /* Drain what we have available, should result in 0 bytes again. */
+ ATF_REQUIRE_EQ(sizeof(buf) - 1, read(master, rbuf, sizeof(rbuf)));
+ ATF_REQUIRE_EQ(0, ioctl(master, FIONREAD, &bytes));
+ ATF_REQUIRE_EQ(0, bytes);
+
+ /*
+ * Write once more, then close the slave side with data still in the
+ * buffer.
+ */
+ ATF_REQUIRE_EQ(sizeof(buf) - 1, write(slave, buf, sizeof(buf) - 1));
+ ATF_REQUIRE_EQ(0, ioctl(master, FIONREAD, &bytes));
+ ATF_REQUIRE_EQ(sizeof(buf) - 1, bytes);
+
+ ATF_REQUIRE_EQ(0, close(slave));
+
+ /*
+ * The tty's output queue is discarded upon close, so we shouldn't have
+ * anything else to read().
+ */
+ ATF_REQUIRE_EQ(0, ioctl(master, FIONREAD, &bytes));
+ ATF_REQUIRE_EQ(0, bytes);
+ ATF_REQUIRE_EQ(0, read(master, rbuf, sizeof(rbuf)));
+}
+
+ATF_TP_ADD_TCS(tp)
+{
+ ATF_TP_ADD_TC(tp, fionread);
+ return (atf_no_error());
+}

File Metadata

Mime Type
text/plain
Expires
Thu, Aug 6, 7:02 AM (10 h, 29 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
36092850
Default Alt Text
D43457.id132774.diff (2 KB)

Event Timeline