Tcl Source Code

View Ticket
Login
Ticket UUID: 1555698
Title: socket name corruption
Type: Bug Version: obsolete: 8.4.14
Submitter: matben Created on: 2006-09-10 09:04:01
Subsystem: 24. Channel Commands Assigned To: andreas_kupries
Priority: 5 Medium Severity:
Status: Open Last Modified: 2007-09-21 20:27:49
Resolution: None Closed By:
    Closed on:
Description:
I was getting weird errors while experimenting with Pats 
dns package using the  code below. What it does is 
essentially open a tcp socket async to the dns port (53), 
gets some stuff, and invokes a callback while its socket is 
still open. In the callback I open another socket async but 
the writable handler is never invoked if I do dns::cleanup on 
the dns token (which closes socket). 
It turned out that the second socket created is identical to 
the already open one!!! 
The debug output looks essentially: 

---> cb ::dns::1 
... 
::dns::1(sock)        = sock12 
... 
        socket=sock12 

Two different open sockets with identical names!!! 
This happens consistently on MacOS 10.2.8 Tcl 8.4.9 
(sorry for not having a more recent one). 
I have tested WinXP using 8.4.12 (I guess) and it happened once, 
and then I couldn't reproduce it anymore. 

Ideas?    Mats 

package require dns 
proc cb {token} { 
   global s 
   puts "---> cb $token" 
   parray $token 
   set s [socket -async google.com 80] 
   fconfigure $s -blocking 0 
   fileevent $s writable writable 
   puts "\t socket=$s" 
   # Try with and without cleanup. 
   dns::cleanup $token 
}

proc writable {args} { 
   global s 
   puts "+++> writable s=$s" 
   close $s 
}

dns::resolve google.com -command cb -protocol tcp
User Comments: matben added on 2006-09-12 21:03:44:
Logged In: YES 
user_id=108900

Just got Daniels updated cvs to build on 10.2.8 and I can just 
confirm that the problem persists in 8.4.14 
(core-8-4-branch  20060912)

matben added on 2006-09-12 20:49:16:
Logged In: YES 
user_id=108900

The problem seems unrelated to the udp package since the test case is 
configured for tcp. The dns package then uses the standard tcp socket 
as:
    set s [socket $state(-nameserver) $state(-port)]
    fconfigure $s -blocking 0 -translation binary -buffering none

Pat: using your bug1555698-tcp.tcl I just get a lot of stack traces (after 
changing ripon to $host in CreateSocket):
[Mats-Bengtssons-dator:~/Desktop] matben% tclsh bug1555698-tcp.tcl 
google.com 80
created sock5 49817
can't get sockname: connection reset by peer
    while executing
"fconfigure $s -sockname"

On WinXP I could only see the problem once and then I never reproduced 
it.
MacOSX is using the standard unix socket code so I don't believe there is 
anything special with that. Unless it is the system socket stack.

patthoyts added on 2006-09-12 20:20:46:

File Added - 193149: bug1555698-tcp.tcl

patthoyts added on 2006-09-12 20:18:12:

File Added - 193148: bug1555698-udp.tcl

Logged In: YES 
user_id=202636

I cannot see any reason why the tcludp package should
produce name collisions as it creates socket names the same
way that tcl does, namely appending the filedescriptor
number to 'sock': sprintf(channelName, "sock%d",
statePtr->sock);
I cannot get this problem to occur on Windows XP using tcl
8.4.13 or tcl8.5a5 with/without udp-1.0.8. I'm attaching the
two test scripts (one just uses tcp sockets - try against a
web server, the other uses udp TIME service and needs a host
listening for TIME protocol on port 37 tcp and udp.)
Perhaps MacOSX will fail with these?

dkf added on 2006-09-11 20:33:00:
Logged In: YES 
user_id=79902

The Tcl core uses the socket's FD number to disambiguate
channel names. Since those are unique while each socket is
open (enforced by the OS) the underlying network package
must be using something else. Since I don't know the code
well, I don't know what's at fault. What package is the dns
package using for its low-level socket management?

matben added on 2006-09-11 19:28:23:
Logged In: YES 
user_id=108900

But I'm using tcp;
dns::resolve google.com -command cb -protocol tcp
Your thought was also mine for a while.

Mats

dkf added on 2006-09-10 18:37:40:
Logged In: YES 
user_id=79902

Arguably, the udp package in use (tcludp?) is at fault for
naming its sockets according to the pattern sock%d

On the other hand, duplicating the name like that perhaps
should lead to the other socket with that name being closed.

Attachments: