Project

General

Profile

Actions

Bug #5475

closed

Feature #5041: Set FD_CLOEXEC for all fds (except 0, 1, 2)

r33507以降SolarisでPTYが使えない

Added by ngoto (Naohisa Goto) almost 10 years ago. Updated almost 10 years ago.

Status:
Closed
Priority:
Normal
Assignee:
-
Target version:
-
ruby -v:
-
Backport:
[ruby-dev:44688]

Description

r33507以降、SolarisでPTYがまともに使えません。
% ruby -rpty -e 'PTY.spawn("/bin/cat") { |r,w,id| p r; p w; p id }'
を実行すると、
-e:1:in spawn': can't get Master/Slave device (RuntimeError)
from -e:1:in
'
のようになります。

make test-all では、TestIO_ConsoleはほとんどのテストがSkipされてしまいます。
TestPTYも同様に多数のSkipおよび以下のErrorが出ます。一部を抜粋します。

36) Skipped:
test_echo(TestIO_Console) [/XXX/test/io/console/test_io_console.rb:171]:
can't get Master/Slave device
(中略)
46) Skipped:
test_winsize(TestIO_Console) [/XXX/test/io/console/test_io_console.rb:171]:
can't get Master/Slave device

47) Skipped:
test_argv0(TestPTY) [/XXX/test/test_pty.rb:49]:
can't get Master/Slave device
(中略)
80) Error:
test_pty_check_default(TestPTY):
RuntimeError: can't get Master/Slave device
/XXX/test/test_pty.rb:170:in spawn'
/XXX/test/test_pty.rb:170:in
test_pty_check_default'
(以下略)

デバッガで追ってみると、ext/pty/pty.c:296 の grantpt(masterfd) が -1 となり、
errno は EACCES (Solaris10では13) でした。
そして、r33507で新規に導入された ext/pty/pty.c:294 の rb_fd_set_cloexec(masterfd); で masterfd に FD_CLOEXEC フラグを設定しているのが原因のようです。

Solarisでは、grantpt(3) 内部で /usr/lib/pt_chmod という setuid root されたヘルパープログラムを呼んでデバイスファイルのパーミッション設定を行っていますが、FD_CLOEXECをptyのmasterfdに設定すると、ヘルパープログラムを呼ぶ際に自動でcloseされてしまうため、ヘルパープログラムにclose済みのファイルデスクリプタが渡され、エラーになるのだろうと推測します。

Actions

Also available in: Atom PDF