ID:               41121
 Updated by:       [EMAIL PROTECTED]
 Reported By:      mahesh dot vemula at in dot ibm dot com
-Status:           Bogus
+Status:           Open
 Bug Type:         Compile Failure
 Operating System: RHEL 4
 PHP Version:      5CVS-2007-04-17 (snap)
 New Comment:

HI Ilia,
        Again as with 41118 I reviewed this one prior to Mahesh
raising the defect and having reviewed your comments above I still
believe this defect reports a valid issue in the PHP code.

As the value for low and high could be variables your suggestion that 
the request should be re-coded as range(2147483646.0, 2147483647.0)  
implies all user scripts would need to include range checks on
calculated high and low values in order that the correct range()
request could be issued to avoid the bad behaviour reported by this
defect, i.e script loops until storage is exhausted. This seems
unnecessary and unacceptable to me. 

After reading the description of range() in the php manual I would 
expect 

        range(2147483646, 2147483647)

to create an array of int's with 2 entries as follows: 

array(2) {
   [0]=>
  int(2147483646)
  [1]=>
  int(2147483647)
}

I certainly would not expect an array with 2G entries. If the users
input causes overflow then that should be detected and reported.  

However, both the low and high values specified in the range() request
above are within the range which can be expressed as a 32 bit signed 
integer;  2147483647 is the MAX_INTEGER value. 

Further if I code something like range(2147483400, 2147483600, 100) 
where both high and low are clearly within range of valid int's I get 
the same bad behaviour, i.e  the PHP code loops creating a huge 
array because the logic in array.c does not detect overflow.

Please find here:
  
       http://www.pastebin.ca/447902

a patch to array.c based on latest PHP 52 branch from CVS which fixes 
the code to produce the output I would expect as per the description
in the PHP manual. 

The following testcase runs clean with the fix; without the fix a 
number of use cases cause bad/unexpected behaviour.

<?php
// posotive steps
var_dump(range(2147483400, 2147483600, 100));
var_dump( range(2147483646, 2147483648, 1 ) ); // OK
var_dump( range(2147483646, 2147483657, 1 ) ); // Loops without fix 
var_dump( range(2147483630, 2147483646, 5 ) ); // Loops without fix 
 
// negative steps  
var_dump( range(-2147483645, -2147483648, 1 ) ); // OK 
var_dump( range(-2147483645, -2147483649, 1 ) ); // OK 
var_dump( range(-2147483630, -2147483646, 5 ) ); // Loops without fix 

// low > high
var_dump(range(2147483647, 2147483645, 1 )); // Loops without fix 
var_dump(range(2147483648, 2147483645, 1 )); //OK 
 
?>

I am therefore re-opening the defect so that my propsed fix can be
considered for inclusion.

Regards,
        Andy 


Andy Wharmby
IBM United Kingdom Limited
E-mail: [EMAIL PROTECTED]



Previous Comments:
------------------------------------------------------------------------

[2007-04-17 14:18:41] [EMAIL PROTECTED]

Thank you for taking the time to write to us, but this is not
a bug. Please double-check the documentation available at
http://www.php.net/manual/ and the instructions on how to report
a bug at http://bugs.php.net/how-to-report.php

The 2147483647 overflows resulting in a negative value directing PHP to

create an array of an enourmous number of elements. To achieve the 
desired result you need to pass the parameters are doubles

Ex. var_dump( range(2147483646.0, 2147483647.0) );

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

[2007-04-17 14:14:06] mahesh dot vemula at in dot ibm dot com

Description:
------------
range() function throws a fatal error message when low = 2147483646,
high = 2147483647 & step is default (i.e 1). These values gives range of
1 step and the values are valid integers. 

Environment:
Operating System: RHEL 4
Linux Kernel : Linux 2.6.9
PHP Version: PHP 5.2 (Built on Apr 17, 2007 from snaps.php.net)
PHP Configure Setup: ./configure

I will be attaching a patch for this as soon as possible.


Reproduce code:
---------------
<?php
var_dump( range(2147483646, 2147483647) );
?>


Expected result:
----------------
array(2) {
  [0]=>
  int(2147483646)
  [1]=>
  int(2147483647)
}


Actual result:
--------------
Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to
allocate 34 bytes) in %s on line %d


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


-- 
Edit this bug report at http://bugs.php.net/?id=41121&edit=1

Reply via email to