Version in base suite: 1.50-1 Version in overlay suite: 1.56-0+deb13u1 Base version: libnet-dns-perl_1.56-0+deb13u1 Target version: libnet-dns-perl_1.57-0+deb13u1 Base file: /srv/ftp-master.debian.org/ftp/pool/main/libn/libnet-dns-perl/libnet-dns-perl_1.56-0+deb13u1.dsc Target file: /srv/ftp-master.debian.org/policy/pool/main/libn/libnet-dns-perl/libnet-dns-perl_1.57-0+deb13u1.dsc Changes | 18 +++++++- META.json | 6 +- META.yml | 6 +- debian/changelog | 9 ++++ lib/Net/DNS.pm | 4 - lib/Net/DNS/Parameters.pm | 13 ++++-- lib/Net/DNS/RR/DNSKEY.pm | 3 - lib/Net/DNS/RR/DS.pm | 3 - lib/Net/DNS/RR/OPT.pm | 87 ++++++++++++++++++++++++++----------------- lib/Net/DNS/RR/RRSIG.pm | 18 ++++---- lib/Net/DNS/RR/TSIG.pm | 34 ++++++++-------- lib/Net/DNS/Resolver/UNIX.pm | 5 +- t/05-OPT.t | 40 +++++++++---------- t/05-TSIG.t | 7 +-- 14 files changed, 155 insertions(+), 98 deletions(-) dpkg-source: warning: cannot verify inline signature for /srv/release.debian.org/tmp/tmptv6p_cz6/libnet-dns-perl_1.56-0+deb13u1.dsc: no acceptable signature found dpkg-source: warning: cannot verify inline signature for /srv/release.debian.org/tmp/tmptv6p_cz6/libnet-dns-perl_1.57-0+deb13u1.dsc: no acceptable signature found diff -Nru libnet-dns-perl-1.56/Changes libnet-dns-perl-1.57/Changes --- libnet-dns-perl-1.56/Changes 2026-07-17 10:09:44.000000000 +0000 +++ libnet-dns-perl-1.57/Changes 2026-09-01 11:38:07.000000000 +0000 @@ -1,16 +1,30 @@ -$Id: Changes 2058 2026-07-17 10:09:31Z willem $ -*-text-*- +$Id: Changes 2061 2026-09-01 11:37:52Z willem $ -*-text-*- -**** 1.56 Jul 18, 2027 +**** 1.57 Sep 1, 2026 + + Resync with IANA DNS parameters registry. + EDNS: Add support for MQTYPE-QUERY option. + +Fix rt.cpan.org #181125 + Unbounded recursion when re-encoding message with misplaced TSIG + +Fix rt.cpan.org #180773 + UNIX resolver can fail in taint mode + + +**** 1.56 Jul 18, 2026 Fix rt.cpan.org #180088 Documentation issue for Net::DNS::RR::RRSIG::verify() Fix rt.cpan.org #179946 Denial of Service via long DNS compression chains + [CVE-2026-64194] Fix rt.cpan.org #179945 Remote code injection via EDNS EXTENDED ERROR + [CVE-2026-64193] Fix rt.cpan.org #179692/#176900 UNIX.pm: Unreachable code warning using Apache/mod_perl diff -Nru libnet-dns-perl-1.56/META.json libnet-dns-perl-1.57/META.json --- libnet-dns-perl-1.56/META.json 2026-07-17 10:10:11.000000000 +0000 +++ libnet-dns-perl-1.57/META.json 2026-09-01 12:09:56.000000000 +0000 @@ -6,7 +6,7 @@ "Michael Fuhr" ], "dynamic_config" : 1, - "generated_by" : "ExtUtils::MakeMaker version 7.70, CPAN::Meta::Converter version 2.150010", + "generated_by" : "ExtUtils::MakeMaker version 7.78, CPAN::Meta::Converter version 2.150015", "license" : [ "mit" ], @@ -79,6 +79,6 @@ } }, "release_status" : "stable", - "version" : "1.56", - "x_serialization_backend" : "JSON::PP version 4.16" + "version" : "1.57", + "x_serialization_backend" : "JSON::PP version 4.18" } diff -Nru libnet-dns-perl-1.56/META.yml libnet-dns-perl-1.57/META.yml --- libnet-dns-perl-1.56/META.yml 2026-07-17 10:10:11.000000000 +0000 +++ libnet-dns-perl-1.57/META.yml 2026-09-01 12:09:56.000000000 +0000 @@ -18,7 +18,7 @@ IO::File: '1.14' IO::Socket::IP: '0.38' dynamic_config: 1 -generated_by: 'ExtUtils::MakeMaker version 7.70, CPAN::Meta::Converter version 2.150010' +generated_by: 'ExtUtils::MakeMaker version 7.78, CPAN::Meta::Converter version 2.150015' license: mit meta-spec: url: http://module-build.sourceforge.net/META-spec-v1.4.html @@ -55,5 +55,5 @@ perl: '5.008009' strict: '1.03' warnings: '1.0501' -version: '1.56' -x_serialization_backend: 'CPAN::Meta::YAML version 0.018' +version: '1.57' +x_serialization_backend: 'CPAN::Meta::YAML version 0.020' diff -Nru libnet-dns-perl-1.56/debian/changelog libnet-dns-perl-1.57/debian/changelog --- libnet-dns-perl-1.56/debian/changelog 2026-08-21 17:24:30.000000000 +0000 +++ libnet-dns-perl-1.57/debian/changelog 2026-09-05 14:32:19.000000000 +0000 @@ -1,3 +1,12 @@ +libnet-dns-perl (1.57-0+deb13u1) trixie; urgency=medium + + * Team upload. + * Import upstream version 1.57. + - Unbounded recursion when re-encoding message with misplaced TSIG + (CVE-2026-81928) + + -- Salvatore Bonaccorso Sat, 05 Sep 2026 16:32:19 +0200 + libnet-dns-perl (1.56-0+deb13u1) trixie-security; urgency=high * Team upload. diff -Nru libnet-dns-perl-1.56/lib/Net/DNS/Parameters.pm libnet-dns-perl-1.57/lib/Net/DNS/Parameters.pm --- libnet-dns-perl-1.56/lib/Net/DNS/Parameters.pm 2026-07-17 10:09:44.000000000 +0000 +++ libnet-dns-perl-1.57/lib/Net/DNS/Parameters.pm 2026-09-01 11:38:07.000000000 +0000 @@ -3,13 +3,13 @@ ################################################ ## ## Domain Name System (DNS) Parameters -## (last updated 2026-07-06) +## (last updated 2026-08-24) ## ################################################ use strict; use warnings; -our $VERSION = (qw$Id: Parameters.pm 2054 2026-07-10 09:37:11Z willem $)[2]; +our $VERSION = (qw$Id: Parameters.pm 2059 2026-08-28 10:04:18Z willem $)[2]; use integer; use Carp; @@ -121,6 +121,8 @@ DSYNC => 66, # RFC9859 HHIT => 67, # RFC9886 BRID => 68, # RFC9886 + UNECE => 69, # draft-woodcock-faltstrom-external-registry-rrtypes-00 + ISO => 70, # draft-woodcock-faltstrom-external-registry-rrtypes-00 SPF => 99, # RFC7208 UINFO => 100, # IANA-Reserved UID => 101, # IANA-Reserved @@ -221,12 +223,13 @@ 'SERVER-TAG' => 17, # draft-bellis-dnsop-edns-tags-01 'REPORT-CHANNEL' => 18, # RFC9567 ZONEVERSION => 19, # RFC9660 - 'MQTYPE-QUERY' => 20, # RFC-ietf-dnssd-multi-qtypes-14 - 'MQTYPE-RESPONSE' => 21, # RFC-ietf-dnssd-multi-qtypes-14 + 'MQTYPE-QUERY' => 20, # RFC10029 + 'MQTYPE-RESPONSE' => 21, # RFC10029 'EDE-EXTRA-TEXT-LANGUAGE' => 22, # draft-muks-dns-filtering-05 'FILTERING-CONTACT' => 23, # draft-muks-dns-filtering-05 'FILTERING-ORGANIZATION' => 24, # draft-muks-dns-filtering-05 'FILTERING-DB' => 25, # draft-muks-dns-filtering-05 + 'STRUCTURED-ERROR' => 26, # RFC-ietf-dnsop-structured-dns-error-27 'UMBRELLA-IDENT' => 20292, # https://developer.cisco.com/docs/cloud-security/#!integrating-network-devic DEVICEID => 26946, # https://developer.cisco.com/docs/cloud-security/#!network-devices-getting-s ); @@ -252,6 +255,7 @@ my @ednsflagbyname = ( DO => 0x8000, # RFC4035 RFC3225 RFC6840 CO => 0x4000, # RFC9824 + DE => 0x2000, # draft-ietf-dnsop-delext-08 ); push @ednsflagbyname, map { /^\d/ ? $_ : lc($_) } @ednsflagbyname; our %ednsflagbyname = @ednsflagbyname; @@ -309,6 +313,7 @@ 32 => 'Over Quota', # draft-muks-dns-ede-rate-limited-02 33 => 'Negative Trust Anchor', # draft-farrokhi-dnsop-ede-nta-00 34 => 'New Delegation Only', # draft-ietf-deleg-10 + 35 => 'Blocked by Upstream DNS Server', # RFC-ietf-dnsop-structured-dns-error-27 ); our %dnserrorbyval = @dnserrorbyval; diff -Nru libnet-dns-perl-1.56/lib/Net/DNS/RR/DNSKEY.pm libnet-dns-perl-1.57/lib/Net/DNS/RR/DNSKEY.pm --- libnet-dns-perl-1.56/lib/Net/DNS/RR/DNSKEY.pm 2026-07-17 10:09:44.000000000 +0000 +++ libnet-dns-perl-1.57/lib/Net/DNS/RR/DNSKEY.pm 2026-09-01 11:38:07.000000000 +0000 @@ -2,7 +2,7 @@ use strict; use warnings; -our $VERSION = (qw$Id: DNSKEY.pm 2042 2025-12-24 10:23:11Z willem $)[2]; +our $VERSION = (qw$Id: DNSKEY.pm 2059 2026-08-28 10:04:18Z willem $)[2]; use base qw(Net::DNS::RR); @@ -249,6 +249,7 @@ 'ED25519' => 15, # [RFC8080] 'ED448' => 16, # [RFC8080] 'SM2SM3' => 17, # [RFC9563] + 'MLDSA44' => 18, # [draft-westerbaan-dnssec-mldsa] 'ECC-GOST12' => 23, # [RFC9558] 'INDIRECT' => 252, # [RFC4034] diff -Nru libnet-dns-perl-1.56/lib/Net/DNS/RR/DS.pm libnet-dns-perl-1.57/lib/Net/DNS/RR/DS.pm --- libnet-dns-perl-1.56/lib/Net/DNS/RR/DS.pm 2026-07-17 10:09:44.000000000 +0000 +++ libnet-dns-perl-1.57/lib/Net/DNS/RR/DS.pm 2026-09-01 11:38:07.000000000 +0000 @@ -2,7 +2,7 @@ use strict; use warnings; -our $VERSION = (qw$Id: DS.pm 2042 2025-12-24 10:23:11Z willem $)[2]; +our $VERSION = (qw$Id: DS.pm 2059 2026-08-28 10:04:18Z willem $)[2]; use base qw(Net::DNS::RR); @@ -222,6 +222,7 @@ 'ED25519' => 15, # [RFC8080] 'ED448' => 16, # [RFC8080] 'SM2SM3' => 17, # [RFC9563] + 'MLDSA44' => 18, # [draft-westerbaan-dnssec-mldsa] 'ECC-GOST12' => 23, # [RFC9558] 'INDIRECT' => 252, # [RFC4034] diff -Nru libnet-dns-perl-1.56/lib/Net/DNS/RR/OPT.pm libnet-dns-perl-1.57/lib/Net/DNS/RR/OPT.pm --- libnet-dns-perl-1.56/lib/Net/DNS/RR/OPT.pm 2026-07-17 10:09:44.000000000 +0000 +++ libnet-dns-perl-1.57/lib/Net/DNS/RR/OPT.pm 2026-09-01 11:38:07.000000000 +0000 @@ -2,7 +2,7 @@ use strict; use warnings; -our $VERSION = (qw$Id: OPT.pm 2054 2026-07-10 09:37:11Z willem $)[2]; +our $VERSION = (qw$Id: OPT.pm 2059 2026-08-28 10:04:18Z willem $)[2]; use base qw(Net::DNS::RR); @@ -16,7 +16,7 @@ use integer; use Carp; -use Net::DNS::Parameters qw(:rcode :ednsoption); +use Net::DNS::Parameters qw(:ednsoption); use constant UTIL => scalar eval { require Scalar::Util; Scalar::Util->can('isdual') }; @@ -204,7 +204,7 @@ my @value; if ( length $value ) { @value = eval { $package->_decompose($value) } if $structured; - @value = {BASE16 => unpack 'H*', $value} unless scalar @value; + @value = {BASE16 => pack 'U0a*', unpack 'H*', $value} unless scalar @value; warn $@ if $@; } else { @value = $structured ? {'OPTION-LENGTH' => 0} : ''; @@ -265,20 +265,20 @@ if ( ref($value) eq 'HASH' ) { my @tags = sort keys %$value; - my $tail = pop @tags; for ( $$value{BASE16} ) { $_ = pack( 'U0a*', $_ ) if defined } # mark as UTF-8 - my @body = map { my @x = ( qq("$_":), _JSONify( $$value{$_} ) ); $x[-1] .= ','; @x } @tags; - push @body, ( qq("$tail":), _JSONify( $$value{$tail} ) ); - $body[0] = '{' . $body[0]; - $body[-1] .= '}'; - return @body; + my @list = map { my @x = ( qq("$_":), _JSONify( $$value{$_} ) ); $x[-1] .= ','; @x } @tags; + return '{}' unless @list; + $list[0] =~ s/^/\{/; + $list[-1] =~ s/,?$/\}/; + return @list; } if ( ref($value) eq 'ARRAY' ) { - my @array = @$value; - my @tail = map { _JSONify($_) } grep {defined} pop @array; - my @body = map { my @x = _JSONify($_); $x[-1] .= ','; @x } @array; - return ( '[', @body, @tail, ']' ); + my @list = map { my @x = _JSONify($_); $x[-1] .= ','; @x } @$value; + return '[]' unless @list; + $list[0] =~ s/^/\[/; + $list[-1] =~ s/,?$/\]/; + return @list; } my $string = "$value"; ## stringify, then use isdual() as discriminant @@ -286,8 +286,8 @@ for ($string) { unless ( utf8::is_utf8($value) ) { return $_ if /^-?\d+$/; # integer (string representation) - return $_ if /^-?\d+\.\d+$/; # non-integer - return $_ if /^-?\d+(\.\d+)?e[+-]\d\d?$/i; + return $_ if /^-?\d+\.\d*$/; # non-integer + return $_ if /^-?\d+(\.\d*)?[Ee][+-]?\d+$/; # with exponent } s/\\/\\\\/g; # escaped escape s/^"(.*)"$/$1/; # strip enclosing quotes @@ -298,14 +298,24 @@ ## no critic ProhibitMultiplePackages -package Net::DNS::RR::OPT::NSID; # RFC5001 +package Net::DNS::RR::OPT::UPDATE_LEASE; # RFC9664 +my @field2 = qw(LEASE KEY-LEASE); sub _compose { - my ( undef, @argument ) = map { ref($_) ? %$_ : $_ } @_; - return pack 'H*', pop @argument; + my ( undef, @argument ) = @_; + for ( ref( $argument[0] ) ) { + @argument = @{$argument[0]} if /ARRAY/; + @argument = @{$argument[0]}{@field2} if /HASH/; + } + return pack 'NN*', grep {defined} @argument; } -sub _decompose { return pack 'U0a*', unpack 'H*', pop @_ } # mark as UTF-8 +sub _decompose { + my @time = grep {defined} unpack 'N*', pop @_; + my ( %object, $i ); + $object{$field2[$i++]} = $_ foreach @time; + return \%object; +} package Net::DNS::RR::OPT::DAU; # RFC6975 @@ -326,7 +336,6 @@ package Net::DNS::RR::OPT::CLIENT_SUBNET; # RFC7871 - my %family = qw(1 Net::DNS::RR::A 2 Net::DNS::RR::AAAA); my @field8 = qw(FAMILY SOURCE-PREFIX SCOPE-PREFIX ADDRESS); @@ -359,13 +368,11 @@ } sub _decompose { - my $argument = pop @_; - return {'EXPIRE-TIMER' => unpack 'N', $argument}; + return {'EXPIRE-TIMER' => unpack 'N', pop @_}; } package Net::DNS::RR::OPT::COOKIE; # RFC7873 - my @field10 = qw(CLIENT SERVER); sub _compose { @@ -392,8 +399,7 @@ } sub _decompose { - my $argument = pop @_; - return {'TIMEOUT' => unpack 'n', $argument}; + return {'TIMEOUT' => unpack 'n', pop @_}; } @@ -439,7 +445,7 @@ sub _compose { my ( undef, @arg ) = @_; - my %arg = ref( $arg[0] ) ? %{$arg[0]} : @arg; + my %arg = ( 'INFO-CODE' => 0, ref( $arg[0] ) ? %{$arg[0]} : @arg ); my $text = join '', Net::DNS::RR::OPT::_JSONify( $arg{'EXTRA-TEXT'} || '' ); return pack 'na*', $arg{'INFO-CODE'}, Net::DNS::Text->new($text)->raw; } @@ -447,13 +453,13 @@ sub _decompose { my ( $code, $text ) = unpack 'na*', pop @_; my $error = $Net::DNS::Parameters::dnserrorbyval{$code}; - my @error = defined($error) ? ( 'ERROR' => $error ) : (); + my @error = defined($error) ? ( 'ERROR-TEXT' => $error ) : (); my $extra = Net::DNS::Text->decode( \$text, 0, length $text ); for ( $extra->value ) { - last unless /^[\[\{]/; - s/[`]([^`]*)[`]/$1/g; ## suppress backticks - s/([\$\@])/\\$1/g; ## Here be dragons! - my $REGEX = q/("[^"]*"|[\[\]{}:,]|[-0-9.Ee+]+)|\s+|(.)/; + last unless /^\s*[\{]/; + s/([\$\@])/\\$1/g; ## suppress interpolation within quoted strings + ## extract JSON lexical tokens, discard unmatched characters + my $REGEX = q/("[^"]*")|([-+]?\d+\.?\d*(?:[Ee][-+]?\d+)?)|::|([{}:,\[\]])|./; my @split = grep { defined && length } split /$REGEX/o; my $value = eval join( ' ', 'no integer;', map { s/^:$/=>/; $_ } @split ); return {'INFO-CODE' => $code, @error, 'EXTRA-TEXT' => $value} if ref($value); @@ -476,7 +482,6 @@ package Net::DNS::RR::OPT::ZONEVERSION; # RFC9660 - my @field19 = qw(LABELCOUNT TYPE VERSION); sub _compose { @@ -489,12 +494,28 @@ } sub _decompose { - my %object; my ( $l, $t, $v ) = unpack 'C2H*', pop @_; + my %object; @object{@field19} = ( $l, $t, pack 'U0a*', $v ); # mark hex data as UTF-8 return \%object; } + +package Net::DNS::RR::OPT::MQTYPE_RESPONSE; # RFC10029 + +sub _compose { + my ( undef, @mqtype ) = map { ref($_) ? @$_ : $_ } @_; + return pack 'n*', map { Net::DNS::Parameters::typebyname($_) } @mqtype; +} + +sub _decompose { + my @mqtype = unpack 'n*', pop @_; + return [map { Net::DNS::Parameters::typebyval($_) } @mqtype]; +} + +package Net::DNS::RR::OPT::MQTYPE_QUERY; # RFC10029 +our @ISA = qw(Net::DNS::RR::OPT::MQTYPE_RESPONSE); + ######################################## diff -Nru libnet-dns-perl-1.56/lib/Net/DNS/RR/RRSIG.pm libnet-dns-perl-1.57/lib/Net/DNS/RR/RRSIG.pm --- libnet-dns-perl-1.56/lib/Net/DNS/RR/RRSIG.pm 2026-07-17 10:09:44.000000000 +0000 +++ libnet-dns-perl-1.57/lib/Net/DNS/RR/RRSIG.pm 2026-09-01 11:38:07.000000000 +0000 @@ -2,7 +2,7 @@ use strict; use warnings; -our $VERSION = (qw$Id: RRSIG.pm 2057 2026-07-16 10:05:04Z willem $)[2]; +our $VERSION = (qw$Id: RRSIG.pm 2059 2026-08-28 10:04:18Z willem $)[2]; use base qw(Net::DNS::RR); @@ -32,7 +32,8 @@ my @algorithms; my @deprecated; if (DNSSEC) { - foreach my $class ( map {"Net::DNS::SEC::$_"} qw(Private DSA RSA ECDSA EdDSA Digest SM2) ) { + my @module = qw(Private DSA RSA ECDSA EdDSA MLDSA Digest); + foreach my $class ( map {"Net::DNS::SEC::$_"} @module ) { my @index = eval join '', qw(r e q u i r e), " $class; ${class}::_index()"; ## no critic push @algorithms, map { ( $_ => $class ) } @index; push @deprecated, eval "${class}::_deprecate()"; ## no critic @@ -352,6 +353,7 @@ 'ED25519' => 15, # [RFC8080] 'ED448' => 16, # [RFC8080] 'SM2SM3' => 17, # [RFC9563] + 'MLDSA44' => 18, # [draft-westerbaan-dnssec-mldsa] 'ECC-GOST12' => 23, # [RFC9558] 'INDIRECT' => 252, # [RFC4034] @@ -572,8 +574,8 @@ use Net::DNS::SEC; $sigrr = Net::DNS::RR::RRSIG->create( \@rrset, $keypath, - sigex => 20251230010101, - sigin => 20251201010101 + sigex => 20261230010101, + sigin => 20261201010101 ); $sigrr->verify( \@rrset, $keyrr ) || die $sigrr->vrfyerrstr; @@ -698,8 +700,8 @@ $sigrr = Net::DNS::RR::RRSIG->create( \@rrsetref, $keypath, - sigex => 20251230010101, - sigin => 20251201010101 + sigex => 20261230010101, + sigin => 20261201010101 ); $sigrr->print; @@ -725,8 +727,8 @@ The optional remaining arguments consist of ( name => value ) pairs as follows: - sigex => 20251230010101, # signature expiration - sigin => 20251201010101, # signature inception + sigex => 20261230010101, # signature expiration + sigin => 20261201010101, # signature inception sigval => 30, # validity window (days) ttl => 3600 diff -Nru libnet-dns-perl-1.56/lib/Net/DNS/RR/TSIG.pm libnet-dns-perl-1.57/lib/Net/DNS/RR/TSIG.pm --- libnet-dns-perl-1.56/lib/Net/DNS/RR/TSIG.pm 2026-07-17 10:09:44.000000000 +0000 +++ libnet-dns-perl-1.57/lib/Net/DNS/RR/TSIG.pm 2026-09-01 11:38:07.000000000 +0000 @@ -2,7 +2,7 @@ use strict; use warnings; -our $VERSION = (qw$Id: TSIG.pm 2003 2025-01-21 12:06:06Z willem $)[2]; +our $VERSION = (qw$Id: TSIG.pm 2060 2026-08-31 11:29:36Z willem $)[2]; use base qw(Net::DNS::RR); @@ -34,7 +34,9 @@ sub _decode_rdata { ## decode rdata from wire-format octet string my ( $self, $data, $offset ) = @_; - my $limit = $offset + $self->{rdlength}; + my $limit = $offset + delete $self->{rdlength}; + croak('misplaced or corrupt TSIG') unless $limit == length $$data; + ( $self->{algorithm}, $offset ) = Net::DNS::DomainName->decode( $data, $offset ); # Design decision: Use 32 bits, which will work until the end of time()! @@ -52,7 +54,6 @@ $self->{other} = unpack "\@$offset xx a$other_size", $$data; $offset += $other_size + 2; - croak('misplaced or corrupt TSIG') unless $limit == length $$data; my $raw = substr $$data, 0, $self->{offset}++; $self->{rawref} = \$raw; return; @@ -62,16 +63,17 @@ sub _encode_rdata { ## encode rdata as wire-format octet string my $self = shift; - my $offset = shift; - my $undef = shift; - my $message = shift; - my $macbin = $self->macbin; + my $offset = shift; + my $undef = shift; + my $message = shift; + my $algorithm = $self->{algorithm} || return ''; + my $macbin = $self->macbin; unless ($macbin) { my $sigdata = $self->sig_data($message); # form data to be signed $macbin = $self->macbin( $self->_mac_function($sigdata) ); } - my $rdata = $self->{algorithm}->canonical; + my $rdata = $algorithm->canonical; # Design decision: Use 32 bits, which will work until the end of time()! $rdata .= pack 'xxN n', $self->time_signed, $self->fudge; @@ -115,9 +117,10 @@ sub string { ## override RR method - my $self = shift; - my $owner = $self->{owner}->string; - my $type = $self->type; + my $self = shift; + my $name = $self->{owner}->string; + my $type = $self->type; + return "; $name $type ; no data" unless $self->{algorithm}; my $algorithm = $self->algorithm; my $time_signed = $self->time_signed; my $fudge = $self->fudge; @@ -127,12 +130,12 @@ my $other = $self->other; return <<"QQ"; -; $owner $type +; $name $type ; algorithm: $algorithm ; time signed: $time_signed fudge: $fudge ; signature: $signature ; original id: $original_id -; $error $other +; error: $error $other QQ } @@ -251,8 +254,7 @@ local $message->{additional} = \@unsigned; # remake header image my @part = qw(question answer authority additional); my @size = map { scalar @{$message->{$_}} } @part; - if ( my $rawref = $self->{rawref} ) { - delete $self->{rawref}; + if ( my $rawref = delete $self->{rawref} ) { my $hbin = pack 'n6', $self->original_id, $message->{status}, @size; $message = join '', $hbin, substr $$rawref, length $hbin; } else { @@ -746,7 +748,7 @@ The generated key must be added to the /etc/named.conf configuration or a separate file introduced by the $INCLUDE directive: - key "host1-host2.example. { + key "host1-host2.example." { algorithm hmac-sha256; secret "Secret+known+only+by+participating+entities="; }; diff -Nru libnet-dns-perl-1.56/lib/Net/DNS/Resolver/UNIX.pm libnet-dns-perl-1.57/lib/Net/DNS/Resolver/UNIX.pm --- libnet-dns-perl-1.56/lib/Net/DNS/Resolver/UNIX.pm 2026-07-17 10:09:44.000000000 +0000 +++ libnet-dns-perl-1.57/lib/Net/DNS/Resolver/UNIX.pm 2026-09-01 11:38:07.000000000 +0000 @@ -2,7 +2,7 @@ use strict; use warnings; -our $VERSION = (qw$Id: UNIX.pm 2053 2026-07-07 10:18:23Z willem $)[2]; +our $VERSION = (qw$Id: UNIX.pm 2059 2026-08-28 10:04:18Z willem $)[2]; =head1 NAME @@ -44,9 +44,10 @@ close $pipe; return @retval; } else { + local %ENV = ( PATH => '/bin:/usr/bin' ); local $SIG{__WARN__} = sub { }; warn 'child process fails without warning'; - eval { exec $prog, @arg }; + eval { exec {$prog} $prog, @arg }; exit; ## uncoverable statement } } diff -Nru libnet-dns-perl-1.56/lib/Net/DNS.pm libnet-dns-perl-1.57/lib/Net/DNS.pm --- libnet-dns-perl-1.56/lib/Net/DNS.pm 2026-07-17 10:09:44.000000000 +0000 +++ libnet-dns-perl-1.57/lib/Net/DNS.pm 2026-09-01 11:38:07.000000000 +0000 @@ -4,9 +4,9 @@ use warnings; our $VERSION; -$VERSION = '1.56'; +$VERSION = '1.57'; $VERSION = eval {$VERSION}; -our $SVNVERSION = (qw$Id: DNS.pm 2058 2026-07-17 10:09:31Z willem $)[2]; +our $SVNVERSION = (qw$Id: DNS.pm 2061 2026-09-01 11:37:52Z willem $)[2]; =head1 NAME diff -Nru libnet-dns-perl-1.56/t/05-OPT.t libnet-dns-perl-1.57/t/05-OPT.t --- libnet-dns-perl-1.56/t/05-OPT.t 2026-07-17 10:09:44.000000000 +0000 +++ libnet-dns-perl-1.57/t/05-OPT.t 2026-09-01 11:38:07.000000000 +0000 @@ -1,10 +1,10 @@ #!/usr/bin/perl -# $Id: 05-OPT.t 1996 2024-12-16 13:05:08Z willem $ -*-perl-*- +# $Id: 05-OPT.t 2059 2026-08-28 10:04:18Z willem $ -*-perl-*- # use strict; use warnings; -use Test::More tests => 89; +use Test::More tests => 94; use TestToolkit; use Net::DNS; @@ -77,16 +77,9 @@ } -my $edns = Net::DNS::Packet->new()->edns; - -foreach my $option ( keys %Net::DNS::Parameters::ednsoptionbyval ) { - $edns->option( $option => {'BASE16' => '076578616d706c6500'} ); -} - - my @testcase = ( - ["LLQ" => {"BASE16" => "000100000000000000000000000000000000"}], - [["NSID" => {"OPTION-DATA" => "rawbytes"}], ["NSID" => {"IDENTIFIER" => "7261776279746573"}]], + ["UPDATE-LEASE" => [86400, 604800]], + ["NSID" => {"OPTION-DATA" => "rawbytes"}], ["4" => {"OPTION-DATA" => ""}], ["DAU" => ( 8, 10, 13, 14, 15, 16 )], ["DHU" => ( 1, 2, 4 )], @@ -97,18 +90,23 @@ [["COOKIE" => ["7261776279746573", ""]], ["COOKIE" => "7261776279746573"]], ["TCP-KEEPALIVE" => 200], [["PADDING" => {"OPTION-DATA" => ""}], ["PADDING" => 0], ["PADDING" => ""]], - ["PADDING" => {"OPTION-DATA" => "rawbytes"}], - ["PADDING" => 100], - ["CHAIN" => {"BASE16" => "076578616d706c6500"}], - ["KEY-TAG" => ( 29281, 30562, 31092, 25971 )], - ["EXTENDED-ERROR" => ( "INFO-CODE" => 0, "EXTRA-TEXT" => '{"JSON":"EXAMPLE"}' )], - ["EXTENDED-ERROR" => ( "INFO-CODE" => 0, "EXTRA-TEXT" => '{JSON: unparsable}' )], - ["EXTENDED-ERROR" => ( "INFO-CODE" => 123 )], - ["REPORT-CHANNEL" => ( "AGENT-DOMAIN" => "example." )], + ["PADDING" => {"OPTION-DATA" => "rawbytes"}], + ["PADDING" => 100], + ["CHAIN" => {"BASE16" => "076578616d706c6500"}], + ["KEY-TAG" => ( 29281, 30562, 31092, 25971 )], + ["EXTENDED-ERROR" => ( "INFO-CODE" => 123 )], + ["EXTENDED-ERROR" => ( "INFO-CODE" => 0, "EXTRA-TEXT" => '{JSON: unparsable}' )], + ["EXTENDED-ERROR" => ( "INFO-CODE" => 0, "EXTRA-TEXT" => '{"JSON":"EXAMPLE"}' )], + ["STRUCTURED-ERROR" => {"OPTION-LENGTH" => 0}], + ["REPORT-CHANNEL" => ( "AGENT-DOMAIN" => "example." )], [["ZONEVERSION" => ""], ["ZONEVERSION" => {"OPTION-DATA" => ""}], ["ZONEVERSION" => []]], - ["ZONEVERSION" => [2, 0, "12345678"]], + ["ZONEVERSION" => [2, 0, "12345678"]], + ["MQTYPE-QUERY" => ( 43, 48 )], ); + +my $edns = Net::DNS::Packet->new()->edns; + foreach (@testcase) { my ( $canonical, @alternative ) = ref( $$_[0] ) eq 'ARRAY' ? @$_ : $_; my ( $option, @value ) = @$canonical; @@ -137,6 +135,8 @@ is( Net::DNS::RR::OPT::_JSONify('1e+20'), '1e+20', '_JSONify string with exponent' ); is( Net::DNS::RR::OPT::_JSONify('abcde'), '"abcde"', '_JSONify non-numeric string' ); is( Net::DNS::RR::OPT::_JSONify('\\092'), '"\\\\092"', '_JSONify escape character' ); +is( Net::DNS::RR::OPT::_JSONify( [] ), '[]', '_JSONify empty array' ); +is( Net::DNS::RR::OPT::_JSONify( {} ), '{}', '_JSONify empty hash' ); my @json = Net::DNS::RR::OPT::_JSONify( {'BASE16' => '1234'} ); is( "@json", qq[{"BASE16": "1234"}], 'short BASE16 string' ); diff -Nru libnet-dns-perl-1.56/t/05-TSIG.t libnet-dns-perl-1.57/t/05-TSIG.t --- libnet-dns-perl-1.56/t/05-TSIG.t 2026-07-17 10:09:44.000000000 +0000 +++ libnet-dns-perl-1.57/t/05-TSIG.t 2026-09-01 11:38:07.000000000 +0000 @@ -1,5 +1,5 @@ #!/usr/bin/perl -# $Id: 05-TSIG.t 1980 2024-06-02 10:16:33Z willem $ -*-perl-*- +# $Id: 05-TSIG.t 2060 2026-08-31 11:29:36Z willem $ -*-perl-*- # use strict; @@ -22,7 +22,7 @@ exit; } -plan tests => 63; +plan tests => 64; sub mysign { @@ -44,6 +44,7 @@ my $typecode = unpack 'xn', Net::DNS::RR->new( type => $type )->encode; is( $typecode, $code, "$type RR type code = $code" ); +ok( Net::DNS::RR->new( type => $type )->string, 'minimal rr->string' ); my $hash = {keybin => pack( 'H*', '66616b65206b6579' )}; @{$hash}{@attr} = @data; @@ -51,7 +52,7 @@ for my $rr ( Net::DNS::RR->new( name => $name, type => $type, %$hash ) ) { my $string = $rr->string; - like( $rr->string, "/$$hash{algorithm}/", 'got expected rr->string' ); + like( $rr->string, "/$$hash{algorithm}/", 'populated rr->string' ); foreach (@attr) { is( $rr->$_, $hash->{$_}, "expected result from rr->$_()" );