Subject: | Net∷Domain∷hostfqdn() produces different result from hostname -f |
Date: | Thu, 22 Aug 2019 12:02:39 +0100 |
To: | bug-libnet [...] rt.cpan.org |
From: | Laurence Rochfort <laurence.rochfort [...] oracle.com> |
This is a bug report for perl from laurence.rochfort@oracle.com,
generated with the help of perlbug 1.39 running under perl 5.16.3.
The function Net∷Domain∷hostfqdn() provides different results from hostname -f
Obvervations:
1) It doesn't respect hosts/DNS resolution ordering in nsswitch.conf and resolv.conf
2) Whether there's a shortname or FQDN in /etc/hostname alters the result
3) It looks to behave as if it assumes FQDNs should end in ".com" and will append .com if the hostname doesn't end with .com
4) It uses the search directive in /etc/resolv.conf as if it were a domain directive
5) It sometimes returns the shortname
Example:
$ cat /etc/hostname
spacewalk-27
$ cat /etc/hosts
127.0.0.1 spacewalk-27 spacewalk-27.vagrant.test
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
x.x.x.x spacewalk-27 spacewalk-27.vagrant.test
$ cat /etc/resolv.conf
; generated by /usr/sbin/dhclient-script
search uk.oracle.com vagrant.test
nameserver x.x.x.x
$ grep hosts /etc/nsswitch.conf
#hosts: db files nisplus nis dns
hosts: files dns myhostname
$ hostname -f
spacewalk-27.vagrant.test
$ perl -le 'use Socket; use POSIX; print ((gethostbyname((POSIX::uname)[1]))[0])'
spacewalk-27.vagrant.test
$ perl -le 'use Net::Domain (); print Net::Domain::hostfqdn'
spacewalk-27.vagrant.test.com
For reference:
man 1 hostname:
"
The function gethostname(2) is used to get the
hostname. When the hostname -a, -d, -f or -i is
called will gethostbyname(3) be called. The dif‐
ference in gethostname(2) and gethostbyname(3) is
that gethostbyname(3) is network aware, so it
consults /etc/nsswitch.conf and /etc/host.conf to
decide whether to read information in /etc/host‐
name or /etc/hosts
The recommended method of setting the FQDN is to
make the hostname be an alias for the fully qual‐
ified name using /etc/hosts, DNS, or NIS. For
example, if the hostname was "ursula", one might
have a line in /etc/hosts which reads
127.0.1.1 ursula.example.com ursula
Technically: The FQDN is the name getaddrinfo(3)
returns for the host name returned by gethost‐
name(2). The DNS domain name is the part after
the first dot.
Therefore it depends on the configuration of the
resolver (usually in /etc/host.conf) how you can
change it. Usually the hosts file is parsed
before DNS or NIS, so it is most common to change
the FQDN in /etc/hosts.
"
man 5 resolv.conf:
"
domain Local domain name.
Most queries for names within this domain
can use short names relative to the local
domain. If set to '.', the root domain is
considered. If no domain entry is present,
the domain is determined from the local
hostname returned by gethostname(2); the
domain part is taken to be everything after
the first '.'. Finally, if the hostname
does not contain a domain part, the root
domain is assumed.
search Search list for host-name lookup.
"
---
Flags:
category=library
severity=medium
---
Site configuration information for perl 5.16.3:
Configured by Red Hat, Inc. at Mon Jan 21 09:25:23 PST 2019.
Summary of my perl5 (revision 5 version 16 subversion 3) configuration:
Platform:
osname=linux, osvers=4.1.12-94.3.5.el7uek.x86_64, archname=x86_64-linux-thread-multi
uname='linux x86-ol7-builder-01.us.oracle.com 4.1.12-94.3.5.el7uek.x86_64 #2 smp wed may 24 08:36:18 pdt 2017 x86_64 x86_64 x86_64 gnulinux '
config_args='-des -Doptimize=-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -m64 -mtune=generic -Dccdlflags=-Wl,--enable-new-dtags -Dlddlflags=-shared -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -m64 -mtune=generic -Wl,-z,relro -DDEBUGGING=-g -Dversion=5.16.3 -Dmyhostname=localhost -Dperladmin=root@localhost -Dcc=gcc -Dcf_by=Red Hat, Inc. -Dprefix=/usr -Dvendorprefix=/usr -Dsiteprefix=/usr/local -Dsitelib=/usr/local/share/perl5 -Dsitearch=/usr/local/lib64/perl5 -Dprivlib=/usr/share/perl5 -Dvendorlib=/usr/share/perl5/vendor_perl -Darchlib=/usr/lib64/perl5 -Dvendorarch=/usr/lib64/perl5/vendor_perl -Darchname=x86_64-linux-thread-multi -Dlibpth=/usr/local/lib64 /lib64 /usr/lib64 -Duseshrplib -Dusethreads -Duseithreads -Dusedtrace=/usr/bin/dtrace -Duselargefiles -Dd_semctl_semun -Di_db -Ui_ndbm -Di_gdbm -Di_shadow -Di_syslog -Dman3ext=3pm -Duseperlio -Dinstallusrbinperl=n -Ubincompat5005 -Uversiononly -Dpager=/usr/bin/less -isr -Dd_gethostent_r_proto -Ud_endhostent_r_proto -Ud_sethostent_r_proto -Ud_endprotoent_r_proto -Ud_setprotoent_r_proto -Ud_endservent_r_proto -Ud_setservent_r_proto -Dscriptdir=/usr/bin -Dusesitecustomize'
hint=recommended, useposix=true, d_sigaction=define
useithreads=define, usemultiplicity=define
useperlio=define, d_sfio=undef, uselargefiles=define, usesocks=undef
use64bitint=define, use64bitall=define, uselongdouble=undef
usemymalloc=n, bincompat5005=undef
Compiler:
cc='gcc', ccflags ='-D_REENTRANT -D_GNU_SOURCE -fno-strict-aliasing -pipe -fstack-protector -I/usr/local/include -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64',
optimize='-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -m64 -mtune=generic',
cppflags='-D_REENTRANT -D_GNU_SOURCE -fno-strict-aliasing -pipe -fstack-protector -I/usr/local/include'
ccversion='', gccversion='4.8.5 20150623 (Red Hat 4.8.5-36.0.1)', gccosandvers=''
intsize=4, longsize=8, ptrsize=8, doublesize=8, byteorder=12345678
d_longlong=define, longlongsize=8, d_longdbl=define, longdblsize=16
ivtype='long', ivsize=8, nvtype='double', nvsize=8, Off_t='off_t', lseeksize=8
alignbytes=8, prototype=define
Linker and Libraries:
ld='gcc', ldflags =' -fstack-protector'
libpth=/usr/local/lib64 /lib64 /usr/lib64
libs=-lresolv -lnsl -lgdbm -ldb -ldl -lm -lcrypt -lutil -lpthread -lc -lgdbm_compat
perllibs=-lresolv -lnsl -ldl -lm -lcrypt -lutil -lpthread -lc
libc=, so=so, useshrplib=true, libperl=libperl.so
gnulibc_version='2.17'
Dynamic Linking:
dlsrc=dl_dlopen.xs, dlext=so, d_dlsymun=undef, ccdlflags='-Wl,--enable-new-dtags -Wl,-rpath,/usr/lib64/perl5/CORE'
cccdlflags='-fPIC', lddlflags='-shared -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -m64 -mtune=generic -Wl,-z,relro '
Locally applied patches:
Fedora Patch1: Removes date check, Fedora/RHEL specific
Fedora Patch3: support for libdir64
Fedora Patch4: use libresolv instead of libbind
Fedora Patch5: USE_MM_LD_RUN_PATH
Fedora Patch6: Skip hostname tests, due to builders not being network capable
Fedora Patch7: Dont run one io test due to random builder failures
Fedora Patch9: Fix find2perl to translate ? glob properly (RT#113054)
Fedora Patch10: Fix broken atof (RT#109318)
Fedora Patch13: Clear $@ before \"do\" I/O error (RT#113730)
Fedora Patch14: Do not truncate syscall() return value to 32 bits (RT#113980)
Fedora Patch15: Override the Pod::Simple::parse_file (CPANRT#77530)
Fedora Patch16: Do not leak with attribute on my variable (RT#114764)
Fedora Patch17: Allow operator after numeric keyword argument (RT#105924)
Fedora Patch18: Extend stack in File::Glob::glob, (RT#114984)
Fedora Patch19: Do not crash when vivifying $|
Fedora Patch20: Fix misparsing of maketext strings (CVE-2012-6329)
Fedora Patch21: Add NAME headings to CPAN modules (CPANRT#73396)
Fedora Patch22: Fix leaking tied hashes (RT#107000) [1]
Fedora Patch23: Fix leaking tied hashes (RT#107000) [2]
Fedora Patch24: Fix leaking tied hashes (RT#107000) [3]
Fedora Patch25: Fix dead lock in PerlIO after fork from thread (RT#106212)
Fedora Patch26: Make regexp safe in a signal handler (RT#114878)
Fedora Patch27: Update h2ph(1) documentation (RT#117647)
Fedora Patch28: Update pod2html(1) documentation (RT#117623)
Fedora Patch29: Document Math::BigInt::CalcEmu requires Math::BigInt (CPAN RT#85015)
RHEL Patch30: Use stronger algorithm needed for FIPS in t/op/crypt.t (RT#121591)
RHEL Patch31: Make *DBM_File desctructors thread-safe (RT#61912)
RHEL Patch32: Use stronger algorithm needed for FIPS in t/op/taint.t (RT#123338)
RHEL Patch33: Remove CPU-speed-sensitive test in Benchmark test
RHEL Patch34: Make File::Glob work with threads again
RHEL Patch35: Fix CRLF conversion in ASCII FTP upload (CPAN RT#41642)
RHEL Patch36: Do not leak the temp utf8 copy of namepv (CPAN RT#123786)
RHEL Patch37: Fix duplicating PerlIO::encoding when spawning threads (RT#31923)
RHEL Patch38: Add SSL support to Net::SMTP (CPAN RT#93823) [1]
RHEL Patch39: Add SSL support to Net::SMTP (CPAN RT#93823) [2]
RHEL Patch40: Add SSL support to Net::SMTP (CPAN RT#93823) [3]
RHEL Patch41: Add SSL support to Net::SMTP (CPAN RT#93823) [4]
RHEL Patch42: Do not overload \"..\" in Math::BigInt (CPAN RT#80182)
RHEL Patch43: Fix CVE-2018-18311 Integer overflow leading to buffer overflow
---
@INC for perl 5.16.3:
/usr/local/lib64/perl5
/usr/local/share/perl5
/usr/lib64/perl5/vendor_perl
/usr/share/perl5/vendor_perl
/usr/lib64/perl5
/usr/share/perl5
.
---
Environment for perl 5.16.3:
HOME=/home/vagrant
LANG=en_US.utf-8
LANGUAGE (unset)
LC_ALL=en_US.utf-8
LD_LIBRARY_PATH (unset)
LOGDIR (unset)
PATH=/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/vagrant/.local/bin:/home/vagrant/bin
PERL_BADLANG (unset)
SHELL=/bin/bash
--
Cheers,
Laurence.