#1149: Socket handles are not properly closed after hDuplicate
--------------------------------------------+-------------------------------
Reporter: [EMAIL PROTECTED] | Owner:
Type: bug | Status: new
Priority: normal | Milestone:
Component: libraries/network | Version: 6.6
Severity: normal | Keywords:
Difficulty: Unknown | Testcase:
Architecture: x86 | Os: Linux
--------------------------------------------+-------------------------------
After accepting a handle using Network's accept, then using hDuplicate
from GHC.Handle to get
separate read/write channels, hClose on both Handles does not appear to
properly close the socket.
{{{
$ cat >bug.hs
import GHC.Handle (hDuplicate)
import Network
import System.IO
main = serve 1234
serve port
= withSocketsDo $
do gate <- listenOn (PortNumber port)
accept_clients gate
where accept_clients gate
= do (h,host,port) <- accept gate
let h_in = h
h_out = h
h_out <- hDuplicate h
hClose h_in
hClose h_out
accept_clients gate
}}}
compile, run, and connect:
{{{
$ ghc --make -o bug -v bug.hs
Glasgow Haskell Compiler, Version 6.6, for Haskell 98, compiled by GHC
version 6
.6
Using package config file: /usr/lib/ghc-6.6/package.conf
wired-in package base mapped to base-2.0
wired-in package rts mapped to rts-1.0
wired-in package haskell98 mapped to haskell98-1.0
wired-in package template-haskell mapped to template-haskell-2.0
Hsc static flags: -static
*** Chasing dependencies:
Chasing modules from: bug.hs
Stable obj: []
Stable BCO: []
compile: input file bug.hs
Created temporary directory: /tmp/ghc2719_0
*** Checking old interface for main:Main:
[1 of 1] Compiling Main ( bug.hs, bug.o )
*** Parser:
*** Renamer/typechecker:
*** Desugar:
Result size = 95
*** Simplify:
Result size = 117
Result size = 99
*** Tidy Core:
Result size = 99
*** CorePrep:
Result size = 123
*** Stg2Stg:
*** CodeGen:
*** CodeOutput:
*** Assembler:
gcc -I. -c /tmp/ghc2719_0/ghc2719_0.s -o bug.o
*** Deleting temp files:
Deleting: /tmp/ghc2719_0/ghc2719_0.s
Upsweep completely successful.
*** Deleting temp files:
Deleting:
link: linkables are ...
LinkableM (Thu Feb 15 09:30:11 GMT 2007) main:Main
[DotO bug.o]
Linking bug ...
*** Linker:
gcc -v -o bug -DDONT_WANT_WIN32_DLL_SUPPORT bug.o
-L/usr/lib/network-2.0/ghc-6.6
-L/usr/lib/ghc-6.6 -lHSnetwork-2.0 -lHSparsec -lHSbase -lHSbase_cbits
-lHSrts -
lm -lgmp -ldl -lrt -u base_GHCziBase_Izh_static_info -u
base_GHCziBase_Czh_stati
c_info -u base_GHCziFloat_Fzh_static_info -u
base_GHCziFloat_Dzh_static_info -u
base_GHCziPtr_Ptr_static_info -u base_GHCziWord_Wzh_static_info -u
base_GHCziInt
_I8zh_static_info -u base_GHCziInt_I16zh_static_info -u
base_GHCziInt_I32zh_stat
ic_info -u base_GHCziInt_I64zh_static_info -u
base_GHCziWord_W8zh_static_info -u
base_GHCziWord_W16zh_static_info -u base_GHCziWord_W32zh_static_info -u
base_GH
CziWord_W64zh_static_info -u base_GHCziStable_StablePtr_static_info -u
base_GHCz
iBase_Izh_con_info -u base_GHCziBase_Czh_con_info -u
base_GHCziFloat_Fzh_con_inf
o -u base_GHCziFloat_Dzh_con_info -u base_GHCziPtr_Ptr_con_info -u
base_GHCziPtr
_FunPtr_con_info -u base_GHCziStable_StablePtr_con_info -u
base_GHCziBase_False_
closure -u base_GHCziBase_True_closure -u
base_GHCziPack_unpackCString_closure -
u base_GHCziIOBase_stackOverflow_closure -u
base_GHCziIOBase_heapOverflow_closur
e -u base_GHCziIOBase_NonTermination_closure -u
base_GHCziIOBase_BlockedOnDeadMV
ar_closure -u base_GHCziIOBase_BlockedIndefinitely_closure -u
base_GHCziIOBase_D
eadlock_closure -u base_GHCziIOBase_NestedAtomically_closure -u
base_GHCziWeak_r
unFinalizzerBatch_closure -u
base_GHCziConc_ensureIOManagerIsRunning_closure
Using built-in specs.
Target: i486-linux-gnu
Configured with: ../src/configure -v --enable-
languages=c,c++,fortran,objc,obj-c
++,treelang --prefix=/usr --enable-shared --with-system-zlib
--libexecdir=/usr/l
ib --without-included-gettext --enable-threads=posix --enable-nls
--program-suff
ix=-4.1 --enable-__cxa_atexit --enable-clocale=gnu --enable-libstdcxx-
debug --en
able-mpfr --with-tune=i686 --enable-checking=release i486-linux-gnu
Thread model: posix
gcc version 4.1.2 20061115 (prerelease) (Debian 4.1.1-21)
/usr/lib/gcc/i486-linux-gnu/4.1.2/collect2 --eh-frame-hdr -m elf_i386
-dynamic-
linker /lib/ld-linux.so.2 -o bug -u base_GHCziBase_Izh_static_info -u
base_GHCzi
Base_Czh_static_info -u base_GHCziFloat_Fzh_static_info -u
base_GHCziFloat_Dzh_s
tatic_info -u base_GHCziPtr_Ptr_static_info -u
base_GHCziWord_Wzh_static_info -u
base_GHCziInt_I8zh_static_info -u base_GHCziInt_I16zh_static_info -u
base_GHCzi
Int_I32zh_static_info -u base_GHCziInt_I64zh_static_info -u
base_GHCziWord_W8zh_
static_info -u base_GHCziWord_W16zh_static_info -u
base_GHCziWord_W32zh_static_i
nfo -u base_GHCziWord_W64zh_static_info -u
base_GHCziStable_StablePtr_static_inf
o -u base_GHCziBase_Izh_con_info -u base_GHCziBase_Czh_con_info -u
base_GHCziFlo
at_Fzh_con_info -u base_GHCziFloat_Dzh_con_info -u
base_GHCziPtr_Ptr_con_info -u
base_GHCziPtr_FunPtr_con_info -u base_GHCziStable_StablePtr_con_info -u
base_GH
CziBase_False_closure -u base_GHCziBase_True_closure -u
base_GHCziPack_unpackCSt
ring_closure -u base_GHCziIOBase_stackOverflow_closure -u
base_GHCziIOBase_heapO
verflow_closure -u base_GHCziIOBase_NonTermination_closure -u
base_GHCziIOBase_B
lockedOnDeadMVar_closure -u base_GHCziIOBase_BlockedIndefinitely_closure
-u base
_GHCziIOBase_Deadlock_closure -u base_GHCziIOBase_NestedAtomically_closure
-u ba
se_GHCziWeak_runFinalizzerBatch_closure -u
base_GHCziConc_ensureIOManagerIsRunni
ng_closure /usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../lib/crt1.o
/usr/lib/gcc
/i486-linux-gnu/4.1.2/../../../../lib/crti.o /usr/lib/gcc/i486-linux-
gnu/4.1.2/c
rtbegin.o -L/usr/lib/network-2.0/ghc-6.6 -L/usr/lib/ghc-6.6
-L/usr/lib/gcc/i486-
linux-gnu/4.1.2 -L/usr/lib/gcc/i486-linux-gnu/4.1.2 -L/usr/lib/gcc/i486-
linux-gn
u/4.1.2/../../../../lib -L/lib/../lib -L/usr/lib/../lib bug.o
-lHSnetwork-2.0 -l
HSparsec -lHSbase -lHSbase_cbits -lHSrts -lm -lgmp -ldl -lrt -lgcc --as-
needed -
lgcc_s --no-as-needed -lc -lgcc --as-needed -lgcc_s --no-as-needed
/usr/lib/gcc/
i486-linux-gnu/4.1.2/crtend.o /usr/lib/gcc/i486-linux-
gnu/4.1.2/../../../../lib/
crtn.o
link: done
*** Deleting temp files:
Deleting:
*** Deleting temp dirs:
Deleting: /tmp/ghc2719_0
$ ./bug &
$ nc -vv localhost 1234
localhost.localdomain [127.0.0.1] 1234 (?) open
[hangs indefinitely]
}}}
If the hDuplicate line above is removed:
{{{
$ nc -vv localhost 1234
localhost.localdomain [127.0.0.1] 1234 (?) open
sent 0, rcvd 0
}}}
Am using:
{{{
$ gcc -v
Using built-in specs.
Target: i486-linux-gnu
Configured with: ../src/configure -v --enable-
languages=c,c++,fortran,objc,obj-c++,treelang --prefix=/usr --enable-
shared --with-system-zlib --libexecdir=/usr/lib --without-included-gettext
--enable-threads=posix --enable-nls --program-suffix=-4.1 --enable-
__cxa_atexit --enable-clocale=gnu --enable-libstdcxx-debug --enable-mpfr
--with-tune=i686 --enable-checking=release i486-linux-gnu
Thread model: posix
gcc version 4.1.2 20061115 (prerelease) (Debian 4.1.1-21)
$ uname -a
Linux 2.6.18-4-686 #1 SMP Fri Feb 2 15:10:49 UTC 2007 i686 GNU/Linux
}}}
--
Ticket URL: <http://hackage.haskell.org/trac/ghc/ticket/1149>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler_______________________________________________
Glasgow-haskell-bugs mailing list
[email protected]
http://www.haskell.org/mailman/listinfo/glasgow-haskell-bugs