[freeside-commits] branch master updated. 84f6470e43578bfdc0f57f3083e5924572e88a57

Mark Wells mark at 420.am
Wed Jan 15 12:19:06 PST 2014


The branch, master has been updated
       via  84f6470e43578bfdc0f57f3083e5924572e88a57 (commit)
      from  dbc37c25095f050ac6284d399e25b2668fa00609 (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
commit 84f6470e43578bfdc0f57f3083e5924572e88a57
Author: Mark Wells <mark at freeside.biz>
Date:   Wed Jan 15 12:18:58 2014 -0800

    fix address ranges for sites with old NetAddr::IP versions, #26868

diff --git a/FS/FS/addr_range.pm b/FS/FS/addr_range.pm
index 3cf746f..1a8484f 100644
--- a/FS/FS/addr_range.pm
+++ b/FS/FS/addr_range.pm
@@ -149,10 +149,10 @@ sub end {
       $self->set('start', $end);
       ($end, $start) = ($start, $end);
     }
-    # bigints are PROBABLY not needed here...but if someone wants to exclude
-    # all the address space not assigned to them, for example, that could be
-    # a pretty large part of IPv4.
-    $self->set('length', $end->bigint - $start->bigint + 1);
+    # fails if $end - $start > 2^31
+    # so don't do that
+    # (fixed in NetAddr::IP 4.050 but we can't rely on that, apparently)
+    $self->set('length', $end - $start + 1);
     return $end->addr;
   }
   my $end = $start + $self->get('length') - 1;
@@ -173,7 +173,7 @@ sub contains {
 
   my $start = NetAddr::IP->new($self->start, 0);
 
-  return ($addr >= $start and $addr->bigint - $start->bigint < $self->length) 
+  return ($addr >= $start and $addr < ( $start + $self->length) )
           ? 1 : 0;
 } 
 
@@ -186,7 +186,7 @@ Returns a readable string showing the address range.
 sub as_string {
   my $self = shift;
   my $start = NetAddr::IP->new($self->start, 0);
-  my $end   = $start + $self->length;
+  my $end   = $start + $self->length - 1;
 
   if ( $self->length == 1 ) {
     # then just the address
@@ -248,11 +248,10 @@ sub any_contains {
 L<NetAddr::IP> objects have netmasks.  They also have overloaded operators
 for addition and subtraction, but those have range limitations when comparing
 addresses.  (An IPv4 address is effectively a uint32; the difference
-between two IPv4 addresses is the same range, but signed.)  Therefore,
-the distance between two addresses should be calculated using the 
-C<bigint> method ($addr2->bigint - $addr1->bigint), which returns the 
-address as a L<Math::BigInt> object, and also conveniently discards the 
-netmask.
+between two IPv4 addresses is the same range, but signed.)  In later versions
+of the library the C<bigint> method can be used as a workaround, but 
+otherwise it's not safe to subtract two addresses that might differ in the
+first bit of the first octet.
 
 =head1 BUGS
 
diff --git a/httemplate/edit/process/addr_range.html b/httemplate/edit/process/addr_range.html
index 6b05d23..5df0559 100644
--- a/httemplate/edit/process/addr_range.html
+++ b/httemplate/edit/process/addr_range.html
@@ -13,6 +13,11 @@
         $cgi->param('end', $end->addr);
         $cgi->param('start', $start->addr);
       }
+      if ( $start + 0x7FFFFFFF <= $end ) {
+        # then this is going to overflow
+        return "Address ranges must be < 2^31 - 1 addresses long."
+      }
+
       $cgi->param('length', $end - $start + 1);
     } else {
       $cgi->param('length', 1);

-----------------------------------------------------------------------

Summary of changes:
 FS/FS/addr_range.pm                     |   21 ++++++++++-----------
 httemplate/edit/process/addr_range.html |    5 +++++
 2 files changed, 15 insertions(+), 11 deletions(-)




More information about the freeside-commits mailing list