[haskeline] #123: poor interaction with programs that fork or exec
haskeline
haskeline at projects.haskell.org
Sun Jan 6 05:39:27 GMT 2013
#123: poor interaction with programs that fork or exec
------------------------+---------------------------------------------------
Reporter: MtnViewMark | Owner:
Type: defect | Status: new
Priority: major | Milestone:
Version: | Keywords:
------------------------+---------------------------------------------------
Haskeline under either `defaultBehavior` or `preferTerm` opens `/dev/tty`.
If the program then either forks or execs, this file is left open in the
new process (for fork), or for the replacing executable (for exec).
Management of open files is a common issue for programs that fork and/or
exec. For those files that the program doesn't want to survive past the
fork/exec, the usual method is to a) close such files in the child right
after forking, and b) set the `FD_CLOEXEC` flag on the file descriptors so
they are closed on exec (see '''System.Posix.IO''')
Haskeline doesn't give programs enough leverage to do either of these for
the `/dev/tty` file that it opens (and perhaps the history file as well,
if that is left open). In forks that aren't expected to interact with the
user, `/dev/tty` is left open. This may leave a connection to a particular
terminal open well after the terminal is released by by the original
process. In execs the situation can lead to a security breach: The program
may have arranged for stdin/stdout/stderr to refer to a new terminal or
other files before execing. Haskeline's surviving open of `/dev/tty` gives
the exec'd program access to the original terminal.
I can see two approaches to fixing this:
* Offer a way to create a terminal based `Behavior` but on a supplied
terminal `Handle` or `Fd`.
* Expose a way access the terminal `Handle`s Haskeline is using.
In either case, it is almost certainly wrong for such files to survive an
exec, and so Haskeline should ensure that all opened files have had
{{{
setCloseOnExec :: Fd -> IO ()
setCloseOnExec fd = setFdOption fd CloseOnExec True
}}}
called on their underlying file descriptors.
--
Ticket URL: <http://trac.haskell.org/haskeline/ticket/123>
haskeline <http://example.org/>
My example project
More information about the Haskeline
mailing list