Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 18 May 1997 18:57:01 -0500 (CDT)
From:      john@starfire.mn.org
To:        FreeBSD-gnats-submit@FreeBSD.ORG
Subject:   bin/3622: gethostbyname fails for file descriptors above 255
Message-ID:  <199705182357.SAA10521@starfire.mn.org>
Resent-Message-ID: <199705190000.RAA21732@hub.freebsd.org>

next in thread | raw e-mail | index | archive | help

>Number:         3622
>Category:       bin
>Synopsis:       gethostbyname fails for file descriptors above 255
>Confidential:   no
>Severity:       serious
>Priority:       high
>Responsible:    freebsd-bugs
>State:          open
>Class:          sw-bug
>Submitter-Id:   current-users
>Arrival-Date:   Sun May 18 17:00:01 PDT 1997
>Last-Modified:
>Originator:     John Lind
>Organization:
Starfire Consulting Services, SkyPoint Communications, Inc.
>Release:        FreeBSD 2.2.1-RELEASE i386
>Environment:

	

>Description:

gethostbyname() fails for a perfectly good domain name once a program
already has file descriptors 0-255 open.  I have not yet tracked
this down to find if it is specific to gethostbyname, or if it
may be the underlying infrastructure, or possibly even into the kernel
(in which case the category specified for this report will be wrong).

>How-To-Repeat:

The following program will reproduce the problem.  Sample output
is given.  Note that the same lookup is performed successfully
253 times before it fails.
--- sample output
www.freebsd.org: Unknown host
RLIMIT_NOFILE rlim_cur 2088
252: 255, /tmp/testghbn.02985
--- program source for testghlim.c
#include <stdio.h>
#include <unistd.h>
#include <netdb.h>
#include <sys/types.h>
#include <sys/time.h>
#include <sys/resource.h>

int
test_ghbn(const char *dhn)
{
    struct hostent *h;
    extern int h_errno;

    if( (h = gethostbyname(dhn)) == NULL ) {
	herror(dhn);
	return 1;
    }
    return 0;
}

char *progname;

void usage()
{
    fprintf(stderr,"Usage: %s host.domain.name\n");
    exit(99);
}

main(int argc, char **argv)
{
    int idx;
    int fd;
    struct rlimit info;
    char tfn[32];
    char *hostdn;

    progname = *argv;

    if (argc < 2)
	usage();

    hostdn = argv[1];

    getrlimit(RLIMIT_NOFILE,&info);
    info.rlim_cur = info.rlim_max;
    setrlimit(RLIMIT_NOFILE,&info);
    getrlimit(RLIMIT_NOFILE,&info);
    printf("RLIMIT_NOFILE rlim_cur %d\n",info.rlim_cur);

    for (idx=0; idx < 300; idx++) {
	strcpy(tfn,"/tmp/testghbn.XXXXX");
	fd = mkstemp(tfn);
	unlink(tfn);
	if (test_ghbn(hostdn)) {
		printf("%d: %d, %s\n", idx, fd, tfn);
		break;
		}
	}
    exit(0);
    }

>Fix:
	
	No known fix at this time.  As I urgently need this to work to
	get Apache 1.1.3 or 1.2b10 running for a multi-homed web site
	of about 300 virtual hosts, I will begin attempting to build
	debugging versions of the standard library routines as soon
	as I find something to eat...

>Audit-Trail:
>Unformatted:



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