On 06/04/2012 12:48 PM, Matijn Woudt wrote:
On Mon, Jun 4, 2012 at 8:38 PM, jas<jason.ger...@gmail.com>  wrote:
On 06/04/2012 11:33 AM, Matijn Woudt wrote:


On Mon, Jun 4, 2012 at 6:54 PM, jas<jason.ger...@gmail.com>    wrote:

Not sure if this is a bug or not...

I have run into an error when performing a conditional using iplong() and
the ~ bitwise operator

$ip = '0.0.0.0';
$mask = '24';

$end = (ip2long($ip) || (~ip2long($mask))) + 1;

PHP Fatal error:  Unsupported operand types

I even tried to typecast the mask to (int)


The error is probably not where you suspect it to be. ip2long will
return false for ip2long($mask), because $mask is not a valid IP
address. The ~ operator is not supported for false.

- Matijn


Strange... this works

$ip = '10.0.2.0';
$mask = '24';

Anything using 0.0.0.0 fails using the bitmask to calculate valid CIDR
ranges.


Yes, because with $ip being 0.0.0.0, the result of ip2long($ip) will
be zero. Zero evaluates to false when PHP is going to parse the ||
operator, and because of that, it continues to parse the rest.
When the result of ip2long($ip) is greater that zero, in case of some
other valid IP, it will evaluate to true and PHP will not even execute
the rest after the || because the result will be true anyway.
Did you mean to use a single | operator, as a bitwise OR?

- Matijn

With any ACL rule using iptables, hosts.allow/hosts.deny, routers where 0.0.0.0/24 is specified (all of the internet ipv4 addresses) this is a valid range using CIDR notation.

It seems like a bug to me

--
PHP General Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to