[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Bug#158321: libc6: Problem with name service switch on LDAP



Package: libc6
Version: 2.2.5-14
Severity: normal

I already filed this bug also for libnss-ldap, so other info are in
http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=157743 , but I
suspect is a libc problem.

The problem is that when using libnss-ldap to get hostname the
function gethostbyname is correctly working (so ping work) but the
function getaddrinfo is not working (so telnet, ssh are not working).

I wrote a little test program, gethost:

#define _GNU_SOURCE
#include <errno.h>       /* error definitions and routines */ 
#include <stdlib.h>      /* C standard library */
#include <unistd.h>      /* unix standard library */
#include <stdio.h>	 /* standard I/O library */
#include <string.h>      /* string functions */
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>

/* Help printing routine */
void usage(void);

int main(int argc, char *argv[])
{
/* 
 * Variables definition  
 */
    int i;
    int use = 0;
    struct hostent *host;
    struct in_addr addr;
    struct addrinfo hint;
    struct addrinfo *address;
    struct sockaddr_in *socket;
    /*
     * Input section: decode command line parameters 
     * Use getopt function
     */
    opterr = 0;	 /* don't want writing to stderr */
    while ( (i = getopt(argc, argv, "han")) != -1) {
	switch (i) {
	/* 
	 * Handling options 
	 */ 
	case 'h':   /* help option */
	    printf("Wrong -h option use\n");
	    usage();
	    return -1;
	    break;
	case 'a':   /* help option */
	    use = 1;
	    break;
	case 'n':   /* help option */
	    use = 0;
	    break;
	case '?':   /* unrecognized options */
	    printf("Unrecognized options -%c\n",optopt);
	    usage();
	default:    /* should not reached */
	    usage();
	}
    }
    if ((argc-optind)!= 1)  {
        printf("From %d arguments, removed %d options\n", argc, optind);
        usage();
    }
    if (use == 0) {
	host = gethostbyname(argv[optind]);
	printf("gethostbyname %s\n", argv[optind]);
	printf("Official host name %s\n", host->h_name);
	printf("Address Type %d\n", host->h_addrtype);
	printf("Address Lenght %d\n", host->h_length);
	addr.s_addr = *( (unsigned long *)host->h_addr);
	printf("Address  %s\n", inet_ntoa(addr));
    } else {
	hint.ai_flags = 0;
	hint.ai_family = PF_INET;
	hint.ai_socktype = 0;
	hint.ai_protocol = 0;
	hint.ai_addrlen = 0;
	hint.ai_addr = NULL;
	hint.ai_canonname = NULL;
	hint.ai_next = NULL;
	if (i = getaddrinfo(argv[optind], "telnet", &hint, &address)) {
	    printf("getaddrinfo %s = %s \n", argv[optind], gai_strerror(i));
	} else {
	    printf("Address flag %d\n", address->ai_flags);
	    printf("Address family %d\n", address->ai_family);
	    printf("Address socket type %d\n", address->ai_socktype);
	    printf("Address protocol %d\n", address->ai_protocol);
	    printf("Address lenght %d\n", address->ai_addrlen);
	    printf("Canonical name %s\n", address->ai_canonname);
	    socket = (struct sockaddr_in *) address->ai_addr;
	    printf("Address %s\n", inet_ntoa(socket->sin_addr));
	    printf("Port %d\n", htons(socket->sin_port));
	    printf("Family %d\n", socket->sin_family);
	    
	}
    }
    return 0;
}
void usage(void) {
    printf("Program gehost: test host name functions  \n");
    printf("Usage:\n");
    printf("  gethost [-h] address \n");
    printf("  -h	   print this help\n");
    
    exit(1);
}

So if I try gethostbyname:
[piccardi@havnor sources]$ ./gethost -n roke
gethostbyname roke
Official host name roke.chl.it
Address Type 2
Address Lenght 4
Address  194.177.127.152

everythig is fine, but if I try getddrinfo:
[piccardi@havnor sources]$ ./gethost -a roke
getaddrinfo roke = Name or service not known 


This is a strace result (I removed the initial part, when libraries
were loaded):

[piccardi@havnor sources]$ strace ./gethost -a roke
...
munmap(0x40014000, 61671)               = 0
socket(PF_INET, SOCK_DGRAM, IPPROTO_IP) = 3
connect(3, {sin_family=AF_INET, sin_port=htons(53), sin_addr=inet_addr("194.177.127.16")}}, 28) = 0
send(3, "/\365\1\0\0\1\0\0\0\0\0\0\4roke\3chl\2it\0\0\34\0\1", 29, 0) = 29
gettimeofday({1030351991, 768481}, NULL) = 0
poll([{fd=3, events=POLLIN, revents=POLLIN}], 1, 5000) = 1
recvfrom(3, "/\365\205\203\0\1\0\0\0\1\0\0\4roke\3chl\2it\0\0\34\0\1"..., 1024, 0, {sin_family=AF_INET, sin_port=htons(53), sin_addr=inet_addr("194.177.127.16")}}, [16]) = 86
close(3)                                = 0
socket(PF_INET, SOCK_DGRAM, IPPROTO_IP) = 3
connect(3, {sin_family=AF_INET, sin_port=htons(53), sin_addr=inet_addr("194.177.127.16")}}, 28) = 0
send(3, "/\366\1\0\0\1\0\0\0\0\0\0\4roke\0\0\34\0\1", 22, 0) = 22
gettimeofday({1030351991, 773826}, NULL) = 0
poll([{fd=3, events=POLLIN, revents=POLLIN}], 1, 5000) = 1
recvfrom(3, "/\366\201\203\0\1\0\0\0\1\0\0\4roke\0\0\34\0\1\0\0\6\0"..., 1024, 0, {sin_family=AF_INET, sin_port=htons(53), sin_addr=inet_addr("194.177.127.16")}}, [16]) = 97
close(3)                                = 0
open("/etc/ld.so.cache", O_RDONLY)      = 3
fstat64(3, {st_mode=S_IFREG|0644, st_size=61671, ...}) = 0
old_mmap(NULL, 61671, PROT_READ, MAP_PRIVATE, 3, 0) = 0x40014000
close(3)                                = 0
open("/lib/libnss_ldap.so.2", O_RDONLY) = 3
read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0@#\0\000"..., 1024) = 1024
fstat64(3, {st_mode=S_IFREG|0644, st_size=49084, ...}) = 0
brk(0x804c000)                          = 0x804c000
old_mmap(NULL, 90816, PROT_READ|PROT_EXEC, MAP_PRIVATE, 3, 0) = 0x40209000
mprotect(0x40215000, 41664, PROT_NONE)  = 0
old_mmap(0x40215000, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3, 0xb000) = 0x40215000
old_mmap(0x40216000, 37568, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x40216000
close(3)                                = 0
open("/usr/lib/libldap.so.2", O_RDONLY) = 3
read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0 y\0\000"..., 1024) = 1024
fstat64(3, {st_mode=S_IFREG|0644, st_size=209128, ...}) = 0
old_mmap(NULL, 208156, PROT_READ|PROT_EXEC, MAP_PRIVATE, 3, 0) = 0x40220000
mprotect(0x40252000, 3356, PROT_NONE)   = 0
old_mmap(0x40252000, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3, 0x32000) = 0x40252000
close(3)                                = 0
open("/usr/lib/liblber.so.2", O_RDONLY) = 3
read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0P\36\0\000"..., 1024) = 1024
fstat64(3, {st_mode=S_IFREG|0644, st_size=46788, ...}) = 0
old_mmap(NULL, 45816, PROT_READ|PROT_EXEC, MAP_PRIVATE, 3, 0) = 0x40253000
mprotect(0x4025e000, 760, PROT_NONE)    = 0
old_mmap(0x4025e000, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3, 0xb000) = 0x4025e000
close(3)                                = 0
open("/usr/lib/libdb-4.0.so", O_RDONLY) = 3
read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0\240+\1"..., 1024) = 1024
fstat64(3, {st_mode=S_IFREG|0644, st_size=608708, ...}) = 0
old_mmap(NULL, 612396, PROT_READ|PROT_EXEC, MAP_PRIVATE, 3, 0) = 0x4025f000
mprotect(0x402f3000, 6188, PROT_NONE)   = 0
old_mmap(0x402f3000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3, 0x93000) = 0x402f3000
close(3)                                = 0
open("/lib/libdl.so.2", O_RDONLY)       = 3
read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0D\27\0\000"..., 1024) = 1024
fstat64(3, {st_mode=S_IFREG|0644, st_size=7988, ...}) = 0
old_mmap(NULL, 10984, PROT_READ|PROT_EXEC, MAP_PRIVATE, 3, 0) = 0x402f5000
mprotect(0x402f7000, 2792, PROT_NONE)   = 0
old_mmap(0x402f7000, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3, 0x1000) = 0x402f7000
close(3)                                = 0
open("/lib/libnsl.so.1", O_RDONLY)      = 3
read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0 ;\0\000"..., 1024) = 1024
fstat64(3, {st_mode=S_IFREG|0644, st_size=69408, ...}) = 0
old_mmap(NULL, 80896, PROT_READ|PROT_EXEC, MAP_PRIVATE, 3, 0) = 0x402f8000
mprotect(0x40309000, 11264, PROT_NONE)  = 0
old_mmap(0x40309000, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3, 0x10000) = 0x40309000
old_mmap(0x4030a000, 7168, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x4030a000
close(3)                                = 0
open("/usr/lib/libsasl.so.7", O_RDONLY) = 3
read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0@ \0\000"..., 1024) = 1024
fstat64(3, {st_mode=S_IFREG|0644, st_size=40612, ...}) = 0
old_mmap(NULL, 44816, PROT_READ|PROT_EXEC, MAP_PRIVATE, 3, 0) = 0x4030c000
mprotect(0x40316000, 3856, PROT_NONE)   = 0
old_mmap(0x40316000, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3, 0x9000) = 0x40316000
close(3)                                = 0
open("/usr/lib/libssl.so.0.9.6", O_RDONLY) = 3
read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0 \201\0"..., 1024) = 1024
fstat64(3, {st_mode=S_IFREG|0644, st_size=177508, ...}) = 0
old_mmap(NULL, 178272, PROT_READ|PROT_EXEC, MAP_PRIVATE, 3, 0) = 0x40317000
mprotect(0x40340000, 10336, PROT_NONE)  = 0
old_mmap(0x40340000, 12288, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3, 0x29000) = 0x40340000
close(3)                                = 0
open("/usr/lib/libcrypto.so.0.9.6", O_RDONLY) = 3
read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0@\276\1"..., 1024) = 1024
fstat64(3, {st_mode=S_IFREG|0644, st_size=744068, ...}) = 0
brk(0x804d000)                          = 0x804d000
old_mmap(NULL, 760096, PROT_READ|PROT_EXEC, MAP_PRIVATE, 3, 0) = 0x40343000
mprotect(0x403f0000, 51488, PROT_NONE)  = 0
old_mmap(0x403f0000, 40960, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3, 0xac000) = 0x403f0000
old_mmap(0x403fa000, 10528, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x403fa000
close(3)                                = 0
open("/lib/libdb2.so.2", O_RDONLY)      = 3
read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0 _\0\000"..., 1024) = 1024
fstat64(3, {st_mode=S_IFREG|0644, st_size=262780, ...}) = 0
old_mmap(NULL, 265964, PROT_READ|PROT_EXEC, MAP_PRIVATE, 3, 0) = 0x403fd000
mprotect(0x4043d000, 3820, PROT_NONE)   = 0
old_mmap(0x4043d000, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3, 0x3f000) = 0x4043d000
close(3)                                = 0
open("/lib/libcrypt.so.1", O_RDONLY)    = 3
read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0\320\t\0"..., 1024) = 1024
fstat64(3, {st_mode=S_IFREG|0644, st_size=19136, ...}) = 0
old_mmap(NULL, 182044, PROT_READ|PROT_EXEC, MAP_PRIVATE, 3, 0) = 0x4043e000
mprotect(0x40443000, 161564, PROT_NONE) = 0
old_mmap(0x40443000, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3, 0x4000) = 0x40443000
old_mmap(0x40444000, 157468, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x40444000
close(3)                                = 0
open("/lib/libpam.so.0", O_RDONLY)      = 3
read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0\340\24"..., 1024) = 1024
fstat64(3, {st_mode=S_IFREG|0644, st_size=29420, ...}) = 0
old_mmap(NULL, 32428, PROT_READ|PROT_EXEC, MAP_PRIVATE, 3, 0) = 0x4046b000
mprotect(0x40472000, 3756, PROT_NONE)   = 0
old_mmap(0x40472000, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3, 0x6000) = 0x40472000
close(3)                                = 0
munmap(0x40014000, 61671)               = 0
brk(0x804e000)                          = 0x804e000
open("/etc/hosts", O_RDONLY)            = 3
fcntl64(3, F_GETFD)                     = 0
fcntl64(3, F_SETFD, FD_CLOEXEC)         = 0
fstat64(3, {st_mode=S_IFREG|0644, st_size=464, ...}) = 0
old_mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x40014000
read(3, "### etherconf DEBCONF AREA. DO N"..., 4096) = 464
read(3, "", 4096)                       = 0
close(3)                                = 0
munmap(0x40014000, 4096)                = 0
socket(PF_INET, SOCK_DGRAM, IPPROTO_IP) = 3
connect(3, {sin_family=AF_INET, sin_port=htons(53), sin_addr=inet_addr("194.177.127.16")}}, 28) = 0
send(3, "/\367\1\0\0\1\0\0\0\0\0\0\4roke\3chl\2it\0\0\1\0\1", 29, 0) = 29
gettimeofday({1030351991, 813964}, NULL) = 0
poll([{fd=3, events=POLLIN, revents=POLLIN}], 1, 5000) = 1
recvfrom(3, "/\367\205\203\0\1\0\0\0\1\0\0\4roke\3chl\2it\0\0\1\0\1"..., 1024, 0, {sin_family=AF_INET, sin_port=htons(53), sin_addr=inet_addr("194.177.127.16")}}, [16]) = 86
close(3)                                = 0
socket(PF_INET, SOCK_DGRAM, IPPROTO_IP) = 3
connect(3, {sin_family=AF_INET, sin_port=htons(53), sin_addr=inet_addr("194.177.127.16")}}, 28) = 0
send(3, "/\370\1\0\0\1\0\0\0\0\0\0\4roke\0\0\1\0\1", 22, 0) = 22
gettimeofday({1030351991, 816145}, NULL) = 0
poll([{fd=3, events=POLLIN, revents=POLLIN}], 1, 5000) = 1
recvfrom(3, "/\370\201\203\0\1\0\0\0\1\0\0\4roke\0\0\1\0\1\0\0\6\0\1"..., 1024, 0, {sin_family=AF_INET, sin_port=htons(53), sin_addr=inet_addr("194.177.127.16")}}, [16]) = 97
close(3)                                = 0
fstat64(1, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 2), ...}) = 0
old_mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x40014000
write(1, "getaddrinfo roke = Name or servi"..., 46getaddrinfo roke = Name or service not known 
) = 46
munmap(0x40014000, 4096)                = 0
_exit(0)                                = ?


>From what I see there it doesn't even try to connect to the LDAP
server, and for this reason I suspect is a libc problem not supporting
libnss-ldap for this function.


-- System Information
Debian Release: testing/unstable
Kernel Version: Linux havnor.chl.it 2.4.18 #1 Mon Jun 17 12:01:49 CEST 2002 i686 unknown unknown GNU/Linux




Reply to: