diff --git a/IP.pm b/IP.pm index 0b0166f..37b5479 100644 --- a/IP.pm +++ b/IP.pm @@ -1,6 +1,6 @@ #!/usr/bin/perl -w -# $Id: IP.pm,v 1.15 2003/10/22 23:20:27 lem Exp $ +# $Id: IP.pm,v 1.16 2003/11/27 20:03:53 lem Exp $ package NetAddr::IP; @@ -48,7 +48,7 @@ our @ISA = qw(Exporter); -our $VERSION = '3.18'; +our $VERSION = '3.19'; ############################################# # These are the overload methods, placed here @@ -343,6 +343,26 @@ return ~vec('', 0, $bits); } + # Validates that a mask is composed + # of a contiguous set of bits +sub _contiguous ($$) +{ + my $mask = shift; + my $octets = shift; + +# return 1 unless defined $mask and defined $octets; + + $octets /= 8; + + for my $o (0 .. $octets) + { + return unless grep { vec($mask, $o, 8) == $_ } + (255, 254, 252, 248, 240, 224, 192, 128, 0); + } + + return 1; +} + sub _to_quad ($) { my $vec = shift; return vec($vec, 0, 8) . '.' . @@ -834,7 +854,8 @@ my $self = $bits == 32 ? _v4($ip, $mask, $hasmask) : _v6($ip, $mask, $hasmask); - return undef unless $self; + return unless $self; + return unless _contiguous $self->{mask}, $self->{bits}; return bless $self, $class; } @@ -1493,7 +1514,7 @@ =head1 HISTORY -$Id: IP.pm,v 1.15 2003/10/22 23:20:27 lem Exp $ +$Id: IP.pm,v 1.16 2003/11/27 20:03:53 lem Exp $ =over @@ -2053,6 +2074,11 @@ Fixed some bugs pointed out by David Lloyd, having to do with the module packaging and version requirements. Thanks David! +=item 3.19 + +Fixed a bug pointed out by Andrew D. Clark, regarding proper parsing +of IP ranges with non-contiguous masks. Thanks Andrew! + =back =head1 AUTHOR diff --git a/META.yml b/META.yml index 09d3b97..66046b6 100644 --- a/META.yml +++ b/META.yml @@ -1,7 +1,7 @@ # http://module-build.sourceforge.net/META-spec.html #XXXXXXX This is a prototype!!! It will change in the future!!! XXXXX# name: NetAddr-IP -version: 3.18 +version: 3.19 version_from: IP.pm installdirs: site requires: diff --git a/Makefile.PL b/Makefile.PL index 2a4593a..b9e4b53 100644 --- a/Makefile.PL +++ b/Makefile.PL @@ -2,7 +2,7 @@ # See lib/ExtUtils/MakeMaker.pm for details of how to influence # the contents of the Makefile that is written. -# $Id: Makefile.PL,v 1.7 2003/10/22 23:20:27 lem Exp $ +# $Id: Makefile.PL,v 1.8 2003/11/27 20:01:45 lem Exp $ my $checker = 0; diff --git a/t/v4-range.t b/t/v4-range.t index 9531367..14af22f 100644 --- a/t/v4-range.t +++ b/t/v4-range.t @@ -1,43 +1,50 @@ use NetAddr::IP; -# $Id: v4-range.t,v 1.2 2002/10/31 04:30:36 lem Exp $ +use Test::More; + +# $Id: v4-range.t,v 1.3 2003/11/27 20:04:02 lem Exp $ my @ranges = ( [ '10.0.0.0/8', '10.0.0.0', '10.255.255.255' ], [ '192.168.0.0/16', '192.168.0.0', '192.168.255.255' ], ); -print "1..", (3 * scalar @ranges), "\n"; +my @weird = ( + [ '128.111.12.0', '128.111.12.129' ], + ); -my $count = 1; +plan tests => 6 * @ranges + 2 * @weird + 28; for my $r (@ranges) { my $r1 = new NetAddr::IP $r->[1] . '-' . $r->[2]; - - if ($r1 and $r1 eq $r->[0]) { - print "ok $count\n"; - } - else { - print "not ok $count\n"; - } - ++ $count; + isa_ok($r1, 'NetAddr::IP'); + is($r1, $r->[0], "Correct interpretation (with space)"); $r1 = new NetAddr::IP $r->[1] . ' - ' . $r->[2]; - if ($r1 and $r1 eq $r->[0]) { - print "ok $count\n"; - } - else { - print "not ok $count\n"; - } - ++ $count; + isa_ok($r1, 'NetAddr::IP'); + is($r1, $r->[0], "Correct interpretation (w/o space)"); $r1 = new NetAddr::IP $r->[0]; - if ($r1 and $r1->range eq $r->[1] . ' - ' . $r->[2]) { - print "ok $count\n"; - } - else { - print "not ok $count\n"; - } - ++ $count; + isa_ok($r1, 'NetAddr::IP'); + is($r1->range, $r->[1] . ' - ' . $r->[2], "Correct reverse"); } +for my $r (@weird) +{ + my $r1 = new NetAddr::IP $r->[0] . '-' . $r->[1]; + ok(! defined $r1, "Weird range w/o space produces undef"); + $r1 = new NetAddr::IP $r->[0] . ' - ' . $r->[1]; + ok(! defined $r1, "Weird range with space produces undef"); +} + +for my $o (254, 252, 248, 240, 224, 192, 128) +{ + my $r1 = new NetAddr::IP '0.0.0.0 - ' . $o . '.0.0.0'; + ok(! defined $r1, "Weird $o range, first octet"); + $r1 = new NetAddr::IP '0.0.0.0 - 0.' . $o . '.0.0'; + ok(! defined $r1, "Weird $o range, second octet"); + $r1 = new NetAddr::IP '0.0.0.0 - 0.0.' . $o . '.0'; + ok(! defined $r1, "Weird $o range, third octet"); + $r1 = new NetAddr::IP '0.0.0.0 - 0.0.0.' . $o; + ok(! defined $r1, "Weird $o range, fourth octet"); +}