Closed
Description
The following test case produces a segfault with ghc-9.4.5
on Mac. The version of process
is 1.6.16.0
.
import Control.Monad
import System.Process
main :: IO ()
main = void $ createProcess $ CreateProcess
{ child_group = Nothing
, child_user = Nothing
, close_fds = False
, cmdspec = RawCommand "env" []
, create_group = True
, create_new_console = False
, cwd = Nothing
, delegate_ctlc = False
, detach_console = False
, env = Just [("PATH", "/bin:/usr/bin")]
, new_session = False
, std_err = Inherit
, std_in = Inherit
, std_out = Inherit
, use_process_jobs = False
}
I used the copy of ghc
installed by stack
:
$ ~/.stack/programs/x86_64-osx/ghc-9.4.5/bin/runghc TestCase.hs
Segmentation fault: 11
$ ~/.stack/programs/x86_64-osx/ghc-9.4.5/bin/ghc-pkg list process
~/.stack/programs/x86_64-osx/ghc-9.4.5/lib/ghc-9.4.5/lib/package.conf.d
process-1.6.16.0
It's crashing in strlen
:
$ lldb TestCase
(lldb) target create "TestCase"
Current executable set to '~/portal-suite/devtools/gabe/test/TestCase' (x86_64).
(lldb) r
Process 65154 launched: '~/portal-suite/devtools/gabe/test/TestCase' (x86_64)
Process 65154 stopped
* thread #1, name = 'ghc_ticker', queue = 'com.apple.main-thread', stop reason = EXC_BAD_ACCESS (code=1, address=0x0)
frame #0: 0x00007ff8189646b2 libsystem_platform.dylib`_platform_strlen + 18
libsystem_platform.dylib`:
-> 0x7ff8189646b2 <+18>: pcmpeqb (%rdi), %xmm0
0x7ff8189646b6 <+22>: pmovmskb %xmm0, %esi
0x7ff8189646ba <+26>: andq $0xf, %rcx
0x7ff8189646be <+30>: orq $-0x1, %rax
Target 0: (TestCase) stopped.
(lldb) p $rdi
(unsigned long) $0 = 0
(lldb) bt
* thread #1, name = 'ghc_ticker', queue = 'com.apple.main-thread', stop reason = EXC_BAD_ACCESS (code=1, address=0x0)
* frame #0: 0x00007ff8189646b2 libsystem_platform.dylib`_platform_strlen + 18
frame #1: 0x000000010000d0ae TestCase`find_executable + 142
frame #2: 0x000000010000c873 TestCase`do_spawn_fork + 99
frame #3: 0x000000010000c6bd TestCase`runInteractiveProcess + 429
frame #4: 0x0000000100010ce1 TestCase`Lc5h0_info + 113
Although the backtrace says it's in find_executable
, I think it's actually in find_in_search_path
which has been inlined by the C compiler:
static char *find_in_search_path(char *working_dir, char *search_path, const char *filename) {
int workdir_len = strlen(working_dir);
It doesn't crash when the Haskell cwd
value is a Just
.
Metadata
Metadata
Assignees
Labels
No labels