- From: Worik Macky Turei Stanton <worik@noggon.co.nz>
- Date: 23 Mar 2001 09:42:11 +1200
- To: www-lib@w3.org
Friends
I am executing the following code...
// Must set a channel on the host attached to the net object
// that we are listening on if one is not alredy set
if(!HTHost_channel(HTNet_host(net))){
HTChannel * c = HTChannel_new(INVSOC, NULL, YES);
HTHost_setChannel(HTNet_host(net), c);
}
if(HTHost_accept(r, net, "127.0.0.1") == HT_ERROR){
When the channel is created it is created with an INVSOC because it
does not have a socket yet.
When the accept call in HTDoAccept in HTTCP.c gets a socket it calls...
HTNet_setSocket(accepting, status);
Where status is the accepting socket.
Then calls HTChannel_setSocket(net->host->channel, sockfd);
Then in that function....
int old_hash = HASH(channel->sockfd);
int new_hash = sockfd < 0 ? 0 : HASH(sockfd);
HTList * list = channels[old_hash];
if (list) HTList_removeObject(list, channel);
For old_hash = HASH(channel->sockfd); HASH(-1), equiv. to
HASH(INVSOC), returns -1.
Hence HTList * list = channels[old_hash]; is channels[-1].
Segfault.
Surly there should be a sanity check on the old socket...
if(channel->sockfd){
old_hash = HASH(channel->sockfd);
}
or a sanity check on old_hash
if(old_hash >= 0){
list = channels[old_hash];
}
Worik
--
Worik Macky Turei Stanton
worik@noggon.co.nz
Aotearoa
This line would not have seven words if only it had eight words less.
Received on Thursday, 22 March 2001 16:39:00 UTC