Subject: | Net::DNS::RR::name doesn't return final . |
The attached small program demonstrates that Net::DNS::RR::name,
applied to a DNSKEY record, does not return the trailing '.'.
The program will display a query to dlv.isc.org. and its response, both
of which have the trailing '.'. It will then walk the vector of
answers and print those where the '.' is missing.
You will see that string() does include the trailing '.', but name()
does not. This is unexpected. Either the code needs to be fixed, or
if this is intended, the documentation should reflect this behavior.
Although compensation for the missing dot seems to be pervasive in the
sources, I believe that the dot should be returned, as it is part of
the proper name of the resource.
The test code is a stripped-down version of a larger program; there's a
small amount of residue remaining.
Environment:
perl -V
Summary of my perl5 (revision 5 version 8 subversion 8) configuration:
Platform:
osname=linux, osvers=2.6.9-55.0.9.elsmp, archname=i386-linux-thread-
multi
uname='linux hs20-bc2-2.build.redhat.com 2.6.9-55.0.9.elsmp #1 smp
tue sep 25 02:16:15 edt 2007 i686 i686 i386 gnulinux '
config_args='-des -Doptimize=-O2 -g -pipe -Wall -Wp,-
D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-
size=4 -m32 -march=i386 -mtune=generic -fasynchronous-unwind-tables -
Dversion=5.8.8 -Dmyhostname=localhost -Dperladmin=root@localhost -
Dcc=gcc -Dcf_by=Red Hat, Inc. -Dinstallprefix=/usr -Dprefix=/usr -
Darchname=i386-linux -Dvendorprefix=/usr -Dsiteprefix=/usr -
Duseshrplib -Dusethreads -Duseithreads -Duselargefiles -Dd_dosuid -
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 -
Dinc_version_list=5.8.7 5.8.6 5.8.5 -Dscriptdir=/usr/bin'
hint=recommended, useposix=true, d_sigaction=define
usethreads=define use5005threads=undef useithreads=define
usemultiplicity=define
useperlio=define d_sfio=undef uselargefiles=define usesocks=undef
use64bitint=undef use64bitall=undef uselongdouble=undef
usemymalloc=n, bincompat5005=undef
Compiler:
cc='gcc', ccflags ='-D_REENTRANT -D_GNU_SOURCE -fno-strict-
aliasing -pipe -Wdeclaration-after-statement -I/usr/local/include -
D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -I/usr/include/gdbm',
optimize='-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -
fstack-protector --param=ssp-buffer-size=4 -m32 -march=i386 -
mtune=generic -fasynchronous-unwind-tables',
cppflags='-D_REENTRANT -D_GNU_SOURCE -fno-strict-aliasing -pipe -
Wdeclaration-after-statement -I/usr/local/include -I/usr/include/gdbm'
ccversion='', gccversion='4.1.2 20070626 (Red Hat 4.1.2-13)',
gccosandvers=''
intsize=4, longsize=4, ptrsize=4, doublesize=8, byteorder=1234
d_longlong=define, longlongsize=8, d_longdbl=define, longdblsize=12
ivtype='long', ivsize=4, nvtype='double', nvsize=8, Off_t='off_t',
lseeksize=8
alignbytes=4, prototype=define
Linker and Libraries:
ld='gcc', ldflags =' -L/usr/local/lib'
libpth=/usr/local/lib /lib /usr/lib
libs=-lresolv -lnsl -lgdbm -ldb -ldl -lm -lcrypt -lutil -lpthread -
lc
perllibs=-lresolv -lnsl -ldl -lm -lcrypt -lutil -lpthread -lc
libc=/lib/libc-2.5.so, so=so, useshrplib=true, libperl=libperl.so
gnulibc_version='2.5'
Dynamic Linking:
dlsrc=dl_dlopen.xs, dlext=so, d_dlsymun=undef, ccdlflags='-Wl,-E -
Wl,-rpath,/usr/lib/perl5/5.8.8/i386-linux-thread-multi/CORE'
cccdlflags='-fPIC', lddlflags='-shared -O2 -g -pipe -Wall -Wp,-
D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-
size=4 -m32 -march=i386 -mtune=generic -fasynchronous-unwind-tables -
L/usr/local/lib'
Characteristics of this binary (from libperl):
Compile-time options: MULTIPLICITY PERL_IMPLICIT_CONTEXT
PERL_MALLOC_WRAP USE_ITHREADS USE_LARGE_FILES
USE_PERLIO USE_REENTRANT_API
Built under linux
Compiled at Nov 12 2007 21:36:08
@INC:
/usr/lib/perl5/site_perl/5.8.8/i386-linux-thread-multi
/usr/lib/perl5/site_perl/5.8.7/i386-linux-thread-multi
/usr/lib/perl5/site_perl/5.8.6/i386-linux-thread-multi
/usr/lib/perl5/site_perl/5.8.5/i386-linux-thread-multi
/usr/lib/perl5/site_perl/5.8.8
/usr/lib/perl5/site_perl/5.8.7
/usr/lib/perl5/site_perl/5.8.6
/usr/lib/perl5/site_perl/5.8.5
/usr/lib/perl5/site_perl
/usr/lib/perl5/vendor_perl/5.8.8/i386-linux-thread-multi
/usr/lib/perl5/vendor_perl/5.8.7/i386-linux-thread-multi
/usr/lib/perl5/vendor_perl/5.8.6/i386-linux-thread-multi
/usr/lib/perl5/vendor_perl/5.8.5/i386-linux-thread-multi
/usr/lib/perl5/vendor_perl/5.8.8
/usr/lib/perl5/vendor_perl/5.8.7
/usr/lib/perl5/vendor_perl/5.8.6
/usr/lib/perl5/vendor_perl/5.8.5
/usr/lib/perl5/vendor_perl
/usr/lib/perl5/5.8.8/i386-linux-thread-multi
/usr/lib/perl5/5.8.8
.
Subject: | Net_DNS_bug |
#!/usr/bin/perl
use strict;
use warnings;
use Net::DNS;
my $DLV = 'dlv.isc.org.';
my $q = Net::DNS::Resolver->new;
$q->udppacketsize(4096);
my $p = Net::DNS::Packet->new( $DLV, 'DNSKEY', 'IN' );
$p->header->ad(1);
$p->header->cd(0);
print( "Resolver:\n",$q->string,
"\nPacket:\n", $p->string );
$p = $q->send($p);
print( "\nDNS Reply:\n", $p->string ) if( $p );
die( "No data received from DNS\n" )
unless( $p && $p->header->rcode eq 'NOERROR' &&
$p->header->ancount && $p->header->ad );
for my $k ($p->answer) {
next unless( $k->type eq 'DNSKEY' && $k->is_sep && $k->name =~ m/\Q$DLV\E?/ );
print( "Answer = ", $k->string, "\nname( ) = ", $k->name, "\n", ' ' x (9+length($DLV)), "^---Note missing .\n" ) if( $k->name ne $DLV );
}