Subject: | ip_reverse incorrect result for many IPv6 addresses |
Date: | Sun, 18 Sep 2011 04:14:06 +0400 |
To: | bug-Net-IP [...] rt.cpan.org |
From: | Dmitry Kurochkin <dmitry.kurochkin [...] gmail.com> |
Hello.
Net::IP::ip_reverse() produces incorrect results for many IPv6
addresses, e.g.
ip_reverse("2001:4f8:3:36:0:0:0:235", 128, 6)
returns:
5.3.2.0.0.0.6.3.3.8.f.4.1.0.0.2.ip6.arpa.
While expected result is:
5.3.2.0.0.0.0.0.0.0.0.0.0.0.0.0.6.3.0.0.3.0.0.0.8.f.4.0.1.0.0.2.ip6.arpa.
Attached patch for Net::IP v1.25 fixes the problem. Note: I am not very
good at Perl so there may be a more elegant/efficient way to fix this.
Regards,
Dmitry
--- a/IP.pm 2006-05-24 22:35:23.000000000 +0400
+++ b/IP.pm 2011-09-18 04:09:19.338849625 +0400
@@ -1766,42 +1766,43 @@
$ERRNO = 101;
return;
}
if ($ip_version == 4) {
my @quads = split /\./, $ip;
my $no_quads = ($len / 8);
my @reverse_quads = reverse @quads;
while (@reverse_quads and $reverse_quads[0] == 0) {
shift(@reverse_quads);
}
return join '.', @reverse_quads, 'in-addr', 'arpa.';
}
elsif ($ip_version == 6) {
my @rev_groups = reverse split /:/, $ip;
my @result;
- foreach (@rev_groups) {
- my @revhex = reverse split //;
+ foreach my $a (@rev_groups) {
+ $a = sprintf "%04s", $a;
+ my @revhex = reverse split //, $a;
push @result, @revhex;
}
# This takes the zone above if it's not exactly on a nibble
my $first_nibble_index = $len ? 32 - (int($len / 4)) : 0;
return join '.', @result[ $first_nibble_index .. $#result ], 'ip6',
'arpa.';
}
}
#------------------------------------------------------------------------------
# Subroutine ip_normalize
# Purpose : Normalize data to a range of IP addresses
# Params : IP or prefix or range
# Returns : ip1, ip2 (if range) or undef (error)
sub ip_normalize {
my ($data) = shift;
my $ipversion;