[ruby-dev:52153] [Ruby master Bug#21165] 引数なしで起動するとSegmentatino Fault

Issue #21165 has been reported by taca (Takahiro Kambe). ---------------------------------------- Bug #21165: 引数なしで起動するとSegmentatino Fault https://bugs.ruby-lang.org/issues/21165 * Author: taca (Takahiro Kambe) * Status: Open * ruby -v: ruby 3.4.2 (2025-02-15 revision d2930f8e7a) +PRISM [x86_64-netbsd] * Backport: 3.1: UNKNOWN, 3.2: UNKNOWN, 3.3: UNKNOWN, 3.4: UNKNOWN ---------------------------------------- 引数なしで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) -- https://bugs.ruby-lang.org/

Issue #21165 has been updated by alanwu (Alan Wu). Assignee set to prism ---------------------------------------- Bug #21165: 引数なしで起動するとSegmentatino Fault https://bugs.ruby-lang.org/issues/21165#change-112156 * Author: taca (Takahiro Kambe) * Status: Open * Assignee: prism * ruby -v: ruby 3.4.2 (2025-02-15 revision d2930f8e7a) +PRISM [x86_64-netbsd] * Backport: 3.1: UNKNOWN, 3.2: UNKNOWN, 3.3: UNKNOWN, 3.4: UNKNOWN ---------------------------------------- 引数なしで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) -- https://bugs.ruby-lang.org/
participants (2)
-
alanwu (Alan Wu)
-
taca (Takahiro Kambe)