Skip to content

Socket code dies with SIGPIPE

GHC socket / IO handle code dies with SIGPIPE.

Debian Etch

$ uname -a
Linux alien 2.6.19.1y #7 Mon Dec 25 20:48:36 EET 2006 i686 GNU/Linux

$ cat /etc/debian_version 
4.0

$ ghc --version
The Glorious Glasgow Haskell Compilation System, version 6.6

Test program and strace output are here:

http://linux.ee/~mzz/ghcpipebug/

run: tttd
	strace ./tttd &
	sleep 1
	echo -n | nc -q 0 127.0.0.1 3372; echo -n | nc -q 0 127.0.0.1 3372
	sleep 1

tttd: tttd.hs
	ghc -o $@ $+ -package network

clean:
	rm -f tttd *.hi *.o
import Control.Concurrent
import Network
import System.IO

-- it won't SIGPIPE, when you comment second hPrint
player h hOther otherTh = evil >> hClose h
    where evil = hPrint h 13 >> hPrint h 42

doAccept sock =
     do (h1, _, _) <- accept sock
        (h2, _, _) <- accept sock
        hSetBuffering h1 LineBuffering
        hSetBuffering h2 LineBuffering
        forkIO $ myThreadId >>= forkIO . player h2 h1 >>= player h1 h2
        threadDelay 500000
        hPutStrLn stderr "OK?"

main = withSocketsDo $ listenOn (PortNumber $ fromIntegral 3372) >>= doAccept
select(0, [], [], NULL, {0, 0})         = 0 (Timeout)
write(4, "13\n", 3)                     = 3
gettimeofday({1169512958, 393628}, NULL) = 0
select(0, [], [], NULL, {0, 0})         = 0 (Timeout)
write(5, "13\n", 3)                     = 3
write(5, "42\n", 3)                     = 3
close(5)                                = 0
gettimeofday({1169512958, 393914}, NULL) = 0
select(0, [], [], NULL, {0, 0})         = 0 (Timeout)
write(4, "42\n", 3)                     = -1 EPIPE (Broken pipe)
--- SIGPIPE (Broken pipe) @ 0 (0) ---
+++ killed by SIGPIPE +++
Process 3541 detached
Trac metadata
Trac field Value
Version 6.6
Type Bug
TypeOfFailure OtherFailure
Priority normal
Resolution Unresolved
Component hslibs/net
Test case
Differential revisions
BlockedBy
Related
Blocking
CC
Operating system
Architecture
To upload designs, you'll need to enable LFS and have an admin enable hashed storage. More information