Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 17 Sep 1997 10:06:47 +0200 (SAT)
From:      Graham Wheeler <gram@cdsec.com>
To:        phk@critter.freebsd.dk (Poul-Henning Kamp)
Cc:        hackers@freebsd.org
Subject:   Re: Memory leak in getservbyXXX?
Message-ID:  <199709170806.KAA02083@cdsec.com>
In-Reply-To: <7153.874473906@critter.freebsd.dk> from "Poul-Henning Kamp" at Sep 17, 97 07:25:06 am

next in thread | previous in thread | raw e-mail | index | archive | help
(I've stopped cc-ing to freebsd-bugs on the assumption that the bug is mine).

Unfortunately the problem hasn't gone away. This morning the program
was spinning again, along with about ten child processes. This is really
weird, especially as all the child processes do is a gethostbyaddr(), 
write the result to a (pipe) file descriptor, and exit.

Here is some code, if this sheds any light (these are all virtual methods):

int ChildProcess::Spawn()
{   
    if (ChildManager::Register(this) >= 0)
    {
	if ((pid = fork()) == 0)
	{
	    exit(Run());
	}
	else if (pid>0)
	{
	    state = Running;
	    starttime = Time();
	    return 0;
	}
    }
    state = Failed;
    return -1;
}

// PipeChildProcess inherits from ChildProcess

int PipeChildProcess::Spawn()
{
    if (socketpair(AF_UNIX, SOCK_STREAM, 0, pfd) < 0)
    {
	state = Failed;
	return -1;
    }   
    int rtn = ChildProcess::Spawn();
    if (rtn < 0)
	close(pfd[0]);
    else
	pipefd = pfd[0];
    close(pfd[1]);
    return rtn;
}   
								 
int PipeChildProcess::Run()  
{   
    close(pfd[0]);
    pipefd = pfd[1];
    // set standard descriptors to be pipe
    for (int i = 0; i < 3; i++)
	if (i != pipefd)
	    if (dup2(pipefd, i) < 0)
	        return -1;
										    return Exec();
}   

// DNSLookupProcess inherits from PipeChildProcess

int DNSLookupProcess::Exec()
{
    unsigned char *cp = (unsigned char *)&addr; 
    printf("%c%c%c%c", cp[0], cp[1], cp[2], cp[3]);
    struct in_addr a;
    a.s_addr = addr;
    struct hostent *h = gethostbyaddr((char*)&a, 4, AF_INET);
    if (h)
    {
	printf("%s", h->h_name);
	return 0;
    }
    return (-1);
}   
							    
-- 
Dr Graham Wheeler                          E-mail: gram@cdsec.com
Citadel Data Security                      Phone:  +27(21)23-6065/6/7
Internet/Intranet Network Specialists      Mobile: +27(83)-253-9864
Firewalls/Virtual Private Networks         Fax:    +27(21)24-3656
Data Security Products                     WWW:    http://www.cdsec.com/






Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199709170806.KAA02083>