1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58
|
# $Id: 12-compression.t 704 2008-02-06 21:30:59Z olaf $ -*-perl-*-
# build DNS packet which has an endless loop in compression
# check it against XS and PP implementation of dn_expand
# both should return (undef,undef) as a sign that the packet
# is invalid
#
use Test::More tests => 5;
use strict;
use Net::DNS;
# simple query packet
my $pkt = Net::DNS::Packet->new( 'www.example.com','a' )->data;
# replace 'com' with pointer to 'example', thus causing
# endless loop for compressed string:
# www.example.example.example.example...
my $pos = pack( 'C', index( $pkt,"\007example" ));
$pkt =~s{\003com}{\xc0$pos\001x};
# start at 'www'
my $start_offset = index( $pkt,"\003www" );
# fail in case the implementation is buggy and loops forever
$SIG{ ALRM } = sub { BAIL_OUT( "endless loop?" ) };
alarm(15);
my ($name,$offset);
# XS implementation
SKIP: {
skip("No dn_expand_xs available",1) if ! $Net::DNS::HAVE_XS;
my ($name,$offset) = eval { Net::DNS::Packet::dn_expand( \$pkt,$start_offset ) };
ok( !defined($name) && !defined($offset), 'XS detected invalid packet' );
}
$Net::DNS::HAVE_XS = 0;
undef $name; undef $offset;
($name,$offset) = eval { Net::DNS::Packet::dn_expand( \$pkt,$start_offset ) };
ok( !defined($name) && !defined($offset), 'PP detected invalid packet' );
# rt.cpan.org 27391
my $packet = Net::DNS::Packet->new("bad..example.com");
my $corrupt = $packet->data;
my $result = Net::DNS::Packet->new(\$corrupt);
is (($result->question)[0]->qtype(),"A","Type correct");
is (($result->question)[0]->qclass(),"IN","Type correct");
#rt.cpan.org #26957
undef $packet;
$packet = Net::DNS::Packet->new();
my $input= "123456789112345678921234567893123456789412345678951234567896123456789.example.com";
# We truncate labels:
my $compressed="123456789112345678921234567893123456789412345678951234567896123.example.com";
my $compname=$packet->dn_comp($input,0);
is((Net::DNS::Packet::dn_expand(\$compname,0))[0],$compressed,"Long labels chopped")
|