On 20 Aug 2024, at 13.11, Rich Felker <dalias@libc.org> wrote:

What guarantee do we have that nothing other than a tty in this state
will return EIO for the ioctl? The implementation on the kernel side
suggests that, if they tried to put any other device in such a state
by replacing its ioctl function the same way, it would also give EIO
for these ioctls.

Yeah, EIO is unconditionally signalled for any (expect TIOCSPGRP) ioctl call when a tty is hung.
While a TIOCGWINSZ ioctl call that returns EIO will very likely be a tty, there is indeed no such guarantee.

I'm hopeful there's some good fix here where we don't have to have
either of these bad behaviors, but returning true for isatty() of a
device that is absolutely not a tty is a much worse behavior than
returning false for a device that is/was a tty when it was opened but
that's been replaced by the kernel with a defunct device.

I have proposed a change to the ioctl handling in the kernel:

https://lore.kernel.org/linux-serial/20241121111506.4717-1-gpdev@gpost.dk/

If merged, the issue should be fixed going forward.

/Gil