Skip to content

v0.4.4 regression: bash SIGSEGV in set_signal_handler after setsid() #48

@Bahtya

Description

@Bahtya

问题描述

v0.4.4 新增的 setsid() + controlling terminal 支持导致 bash 崩溃。

复现

Hermux 中调用:

session_id = vproc_ffi_create_session();
vpid = vproc_ffi_create_process(session_id, "/path/to/bash", argv, envp, pts, pts, pts);

bash 启动后立即 SIGSEGV,终端空白。

Crash 详情

signal=SIGSEGV (11) si_addr=0x0

调用栈:

#02 pc 00096494  bash (set_signal_handler+116)
#03 pc 00096114  bash
#04 pc 000962f8  bash (termsig_handler+316)
#05 pc 00095d7c  bash (termsig_sighandler+172)

进程以 exit code 127 退出。

根因分析

si_addr=0x0 表明是 NULL pointer dereference。bash 在 set_signal_handler 中操作 controlling terminal 相关数据时触发。v0.4.3 没有此问题。

可能原因:

  • setsid() 在 vproc 协程上下文中不能正常工作(协程不是真正的 OS 进程,setsid 可能返回错误或产生未定义行为)
  • setsid() 成功后 bash 尝试 tcsetpgrp()/TIOCSCTTY 操作,但协程环境的 terminal 语义不完整

影响

  • v0.4.3:bash 正常工作,但显示 "no job control" 警告
  • v0.4.4:bash 崩溃,终端完全不可用

建议

setsid() 可能不适合在协程环境中直接调用。job control 的修复可能需要在 vproc 层面模拟 terminal session 语义,而不是依赖 Linux 的 setsid() 系统调用。

相关

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions