Follow @Openwall on Twitter for new release announcements and other news
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <20150131040121.GB23507@brightrain.aerifal.cx>
Date: Fri, 30 Jan 2015 23:01:21 -0500
From: Rich Felker <dalias@...c.org>
To: musl@...ts.openwall.com
Subject: Re: isatty false positives and device state clobbering

On Fri, Jan 30, 2015 at 10:29:53PM -0500, Rich Felker wrote:
> OSS seems to use the range 0x5401 to 0x5408, so some possible
> candidates for strategy 2 seem to be:
> 
> #define TIOCGPGRP       0x540F
> #define TIOCOUTQ        0x5411
> #define TIOCGWINSZ      0x5413
> #define FIONREAD        0x541B
> 
> Perhaps TIOCGPGRP is best if it works for ttys that aren't the
> controlling tty for a process group, since it corresponds to a
> standard POSIX feature and would need to be present on any system
> where the tcgetpgrp() is implemented via ioctl. The others are
> nonstandard but widely supported extensions for querying terminal
> buffer state and window size.
> 
> It's also worth checking whether these are defined differently on any
> particular archs (e.g. mips, uhg) and whether the definitions there
> might clash with OSS ioctl numbers, in which case selecting a
> different one would be preferable.

I think TIOCGPGRP looks safe against clashes:

$ grep TIOCGPGRP arch/*/bits/ioctl.h
arch/arm/bits/ioctl.h:#define TIOCGPGRP 0x540F
arch/i386/bits/ioctl.h:#define TIOCGPGRP        0x540F
arch/microblaze/bits/ioctl.h:#define TIOCGPGRP  0x540F
arch/mips/bits/ioctl.h:#define TIOCGPGRP        _IOR('t', 119, int)
arch/or1k/bits/ioctl.h:#define TIOCGPGRP        0x540F
arch/powerpc/bits/ioctl.h:#define TIOCGPGRP     _IOR('t', 119, int)
arch/sh/bits/ioctl.h:#define TIOCGPGRP           _IOR('t', 119, int)
arch/x32/bits/ioctl.h:#define TIOCGPGRP 0x540F
arch/x86_64/bits/ioctl.h:#define TIOCGPGRP      0x540F

Unfortunately, per POSIX:

    The tcgetpgrp() function shall fail if:

    [ENOTTY]
    The calling process does not have a controlling terminal, or the
    file is not the controlling terminal.

Whether it actually does or not, this function (and the underlying
ioctl, if it's implemented as an ioctl) is supposed to return ENOTTY
when the caller does not have a controlling terminal. So it doesn't
seem like it can provide the functionality we need.

Fortunately, TIOCGWINSZ, FIONREAD, and TIOCOUTQ also _seem_ to avoid
clashes (although mips has some wacky numbering for them that would
probably warrant further checks -- use of 'F' and 't' ioctl classes
instead of 'T') so it's probably a matter of checking that these are
supported on other systems we might care about (BSD Linux emulation?)
and picking one.

Rich

Powered by blists - more mailing lists

Confused about mailing lists and their use? Read about mailing lists on Wikipedia and check out these guidelines on proper formatting of your messages.