Project

General

Profile

Actions

Bug #21165

closed

引数なしで起動するとSegmentatino Fault

Added by taca (Takahiro Kambe) 3 days ago. Updated 1 day ago.

Status:
Closed
Assignee:
Target version:
-
ruby -v:
ruby 3.4.2 (2025-02-15 revision d2930f8e7a) +PRISM [x86_64-netbsd]
[ruby-dev:<unknown>]

Description

引数なしでrubyを起動すると、Segmentation Faultで落ちます。(そういう使い方をすることは稀だったため、気づいていませんでした。)

https://mail-index.netbsd.org/pkgsrc-changes/2025/02/09/msg317142.html
https://mail-index.netbsd.org/pkgsrc-users/2025/02/28/msg041167.html

  • Prismを使用していると発生します。
  • pkgsrcの外でビルドした場合でも再現します。

原因は prism.c のpm_parse_stream_read()の第3引数の関数ポインターの名前がfgets
なっていて、pm_parse_stream_read()では、これを使って関数呼び出しをしています。
ところが、何故か標準ライブラリのfgets(3)を呼び出してしまって落ちていたというのが真相
でした。

引数で渡された関数ポインターを使って呼び出すのが本来の動作とは思いますが、敢えて標準
ライブラリと同じ名前を使用するのは、このような意図しない挙動を引き起こす可能性がある
ので、避けるべきではないかと思います。

添付のパッチで問題は解消しました。

% uname -rsmp
NetBSD 10.1_STABLE amd64 x86_64
% sh configure --enable-pthread --without-git
...
% make
...
% gdb ruby
...
(gdb) run
Starting program: /var/tmp/ruby-3.4.2/ruby 
[New LWP 1009 of process 2755]
`RubyGems' were not loaded.
`error_highlight' was not loaded.
`did_you_mean' was not loaded.
`syntax_suggest' was not loaded.

Thread 1 "" received signal SIGSEGV, Segmentation fault.
rb_econv_close (ec=0x4) at transcode.c:1735
1735        if (ec->replacement_allocated) {
(gdb) where
#0  rb_econv_close (ec=0x4) at transcode.c:1735
#1  0x00000001dc969c5c in clear_readconv (fptr=0x7dfcda961040) at io.c:5636
#2  clear_codeconv (fptr=0x7dfcda961040) at io.c:5655
#3  io_encoding_set (fptr=fptr@entry=0x7dfcda961040, v1=v1@entry=4, 
    v2=v2@entry=4, opt=opt@entry=4) at io.c:11759
#4  0x00000001dc96c0ec in rb_io_set_encoding (argc=<optimized out>, 
    argc@entry=1, argv=argv@entry=0x7f7ffff88a30, io=138524952599320)
    at io.c:13519
#5  0x00000001dc97b0d6 in rb_stdio_set_default_encoding () at io.c:13540
#6  0x00000001dca70987 in process_options (argc=0, argc@entry=1, 
    argv=<optimized out>, opt=opt@entry=0x7f7ffff89380) at ruby.c:2561
#7  0x00000001dca71f60 in ruby_process_options (argc=argc@entry=1, 
    argv=argv@entry=0x7f7ffff895a8) at ruby.c:228
#8  0x00000001dc923a61 in ruby_options (argc=argc@entry=1, 
    argv=argv@entry=0x7f7ffff895a8) at eval.c:117
#9  0x00000001dcbded22 in rb_main (argv=0x7f7ffff895a8, argc=1) at ./main.c:43
#10 main (argc=<optimized out>, argv=<optimized out>) at ./main.c:68


Files

patch-prism_prism.c (2.7 KB) patch-prism_prism.c taca (Takahiro Kambe), 03/01/2025 04:07 PM
Actions

Also available in: Atom PDF

Like0
Like0Like0