r4229 bugfix: IPv6 was broken with PHP older than 5.2
authorAlexey Andriyanov <alan@al-an.info>
Tue, 15 Feb 2011 11:51:05 +0000 (11:51 +0000)
committerAlexey Andriyanov <alan@al-an.info>
Tue, 15 Feb 2011 11:51:05 +0000 (11:51 +0000)
all(hopefully) implicit conversions from IPv6Address class into string using magic __toString class method was replaced by exclicit toBin() method calls.

affected functions:
 renderSeparator
 getPageNumOfIPv6
 scanIPv6Space
 bindIPv6ToObject
 getIPv6AddressNetworkId
 updateV6Address
 updateIPv6Bond
 unbindIPv6FromObject
 createIPv6Prefix
 IPv6NetworkCmp

IPv6Address class:
 new field-proxy function toBin()
 magic method __toString was substituted by temporary backtrace-showing code to find hidden calls to magic method before the release occurs.

wwwroot/inc/IPv6.php
wwwroot/inc/config.php
wwwroot/inc/database.php
wwwroot/inc/functions.php
wwwroot/inc/interface.php

index 87dd128e222313d14a2d47bf1c9c9c697d8533e6..2e46065df6d000c74956b7a022bf6da7493710fa 100644 (file)
@@ -14,12 +14,20 @@ function __construct ($bin_str = self::zero_address)
        $this->words = $bin_str;
 }
 
-// object in string context interpolates as 16-byte binary string 
-function __toString ()
+// returns 16-byte binary string
+function getBin ()
 {
        return $this->words;
 }
 
+// FIXME: remove this debug procedure before release
+function __toString ()
+{
+       echo '<pre>';
+       debug_print_backtrace();
+       exit;
+}
+
 private static function set_word_value (&$haystack, $nword, $hexvalue)
 {
        // check that $hexvalue is like /^[0-9a-fA-F]*$/
index 2a7dd8f73fbf6221b62da31f4f3ac1e864fb2b09..819832f0a7499be31536d531795bc6c553f24a1e 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 
-define ('CODE_VERSION', '0.19.0');
+define ('CODE_VERSION', '0.19.0'); //0.19.1: FIXME: remove __toString from IPv6Address before the release of 0.19.1!
 
 $max_dict_key = array
 (
index d0f46f84f7e2b7af61827d7c566fd82a9fe6c174..2c3c9cb8fe8b23849a5555a14f207537c9bc50b7 100644 (file)
@@ -1442,8 +1442,8 @@ function scanIPv6Space ($pairlist)
        foreach ($pairlist as $pair)
        {
                $wheres[] = "ip >= ? AND ip <= ?";
-               $qparams[] = (string) $pair['first'];
-               $qparams[] = (string) $pair['last'];
+               $qparams[] = $pair['first']->getBin();
+               $qparams[] = $pair['last']->getBin();
        }
        if (! count ($wheres))  // this is normal for a network completely divided into smaller parts
                return $ret;
@@ -1456,7 +1456,7 @@ function scanIPv6Space ($pairlist)
        while ($row = $result->fetch (PDO::FETCH_ASSOC))
        {
                $ip_bin = new IPv6Address ($row['ip']);
-               $key = (string)$ip_bin;
+               $key = $ip_bin->getBin();
                if (!isset ($ret[$key]))
                        $ret[$key] = constructIPv6Address ($ip_bin);
                $ret[$key]['name'] = $row['name'];
@@ -1475,7 +1475,7 @@ function scanIPv6Space ($pairlist)
        foreach ($allRows as $row)
        {
                $ip_bin = new IPv6Address ($row['ip']);
-               $key = (string)$ip_bin;
+               $key = $ip_bin->getBin();
                if (!isset ($ret[$key]))
                        $ret[$key] = constructIPv6Address ($ip_bin);
                $oinfo = spotEntity ('object', $row['object_id']);
@@ -1536,12 +1536,12 @@ function bindIpToObject ($ip = '', $object_id = 0, $name = '', $type = '')
        );
 }
 
-function bindIPv6ToObject ($ip = '', $object_id = 0, $name = '', $type = '')
+function bindIPv6ToObject ($ip, $object_id = 0, $name = '', $type = '')
 {
        return usePreparedInsertBlade
        (
                'IPv6Allocation',
-               array ('ip' => $ip, 'object_id' => $object_id, 'name' => $name, 'type' => $type)
+               array ('ip' => $ip->getBin(), 'object_id' => $object_id, 'name' => $name, 'type' => $type)
        );
 }
 
@@ -1566,7 +1566,7 @@ function getIPv4AddressNetworkId ($dottedquad, $masklen = 32)
 function getIPv6AddressNetworkId ($ip, $masklen = 128)
 {
        $query = 'select id from IPv6Network where ip <= ? AND last_ip >= ? and mask < ? order by mask desc limit 1';
-       $result = usePreparedSelectBlade ($query, array ((string)$ip, (string)$ip, $masklen));
+       $result = usePreparedSelectBlade ($query, array ($ip->getBin(), $ip->getBin(), $masklen));
        if ($row = $result->fetch (PDO::FETCH_ASSOC))
                return $row['id'];
        return NULL;
@@ -1603,14 +1603,14 @@ function updateV4Address ($ip = 0, $name = '', $reserved = 'no')
 
 function updateV6Address ($ip, $name = '', $reserved = 'no')
 {
-       usePreparedDeleteBlade ('IPv6Address', array ('ip' => $ip));
+       usePreparedDeleteBlade ('IPv6Address', array ('ip' => $ip->getBin()));
        // INSERT may appear not necessary.
        if ($name == '' and $reserved == 'no')
                return '';
        $ret = usePreparedInsertBlade
        (
                'IPv6Address',
-               array ('name' => $name, 'reserved' => $reserved, 'ip' => $ip)
+               array ('name' => $name, 'reserved' => $reserved, 'ip' => $ip->getBin())
        );
        return $ret !== FALSE ? '' : (__FUNCTION__ . 'query failed');
 }
@@ -1624,7 +1624,7 @@ function updateBond ($ip='', $object_id=0, $name='', $type='')
        );
 }
 
-function updateIPv6Bond ($ip='', $object_id=0, $name='', $type='')
+function updateIPv6Bond ($ip, $object_id=0, $name='', $type='')
 {
        return usePreparedUpdateBlade
        (
@@ -1636,7 +1636,7 @@ function updateIPv6Bond ($ip='', $object_id=0, $name='', $type='')
                ),
                array
                (
-                       'ip' => $ip,
+                       'ip' => $ip->getBin(),
                        'object_id' => $object_id,
                )
        );
@@ -1656,7 +1656,7 @@ function unbindIPv6FromObject ($ip, $object_id)
        return usePreparedDeleteBlade
        (
                'IPv6Allocation',
-               array ('ip' => $ip, 'object_id' => $object_id)
+               array ('ip' => $ip->getBin(), 'object_id' => $object_id)
        );
 }
 
@@ -3205,8 +3205,8 @@ function createIPv6Prefix ($range = '', $name = '', $taglist = array())
                'IPv6Network',
                array
                (
-                       'ip' => $network_addr,
-                       'last_ip' => $broadcast_addr,
+                       'ip' => $network_addr->getBin(),
+                       'last_ip' => $broadcast_addr->getBin(),
                        'mask' => $mask,
                        'name' => $name
                )
index 072afcb411a8a4f36c256dac221fafd8a98e5c7e..f69b8927931a42e2f87c5d5d8a78c33d0863f5bb 100644 (file)
@@ -1919,7 +1919,7 @@ function IPv4NetworkCmp ($netA, $netB)
 
 function IPv6NetworkCmp ($netA, $netB)
 {
-       return strcmp ($netA['ip_bin'], $netB['ip_bin']);
+       return strcmp ($netA['ip_bin']->getBin(), $netB['ip_bin']->getBin());
 }
 
 // Modify the given tag tree so, that each level's items are sorted alphabetically.
index a496e370caee95eafee5d651f7d6392ed7e620b7..cba874082faa7c3481330eacfd0002cae3f169cd 100644 (file)
@@ -3185,11 +3185,11 @@ function renderEmptyIPv6 ($ip, $hl_ip)
 function renderSeparator ($first, $after, $hl_ip)
 {
        $self = __FUNCTION__;
-       if (strcmp ($first, $after) >= 0)
+       if (strcmp ($first->getBin(), $after->getBin()) >= 0)
                return;
        if ($first->next() == $after)
                renderEmptyIPv6 ($first, $hl_ip);
-       elseif (isset ($hl_ip) && strcmp ($hl_ip, $first) >= 0 && strcmp ($hl_ip, $after) < 0)
+       elseif (isset ($hl_ip) && strcmp ($hl_ip->getBin(), $first->getBin()) >= 0 && strcmp ($hl_ip->getBin(), $after->getBin()) < 0)
        { // $hl_ip is inside the range $first - ($after-1)
                $self ($first, $hl_ip, $hl_ip);
                renderEmptyIPv6 ($hl_ip, $hl_ip);
@@ -3204,7 +3204,7 @@ function getPageNumOfIPv6 ($list, $ip, $maxperpage)
 {
        if (intval ($maxperpage) <= 0 || count ($list) <= $maxperpage)
                return 0;
-       $bin_ip = (string)$ip;
+       $bin_ip = $ip->getBin();
        $keys = array_keys ($list);
        for ($i = 1; $i <= count ($keys); $i++)
                if (strcmp ($keys[$i-1], $bin_ip) >= 0)