Edit report at https://bugs.php.net/bug.php?id=51606&edit=1

 ID:               51606
 Updated by:       php-bugs@lists.php.net
 Reported by:      arobins at csg dot uwaterloo dot ca
 Summary:          Memory Leak in odbc_result with long varchar columns
-Status:           Feedback
+Status:           No Feedback
 Type:             Bug
 Package:          ODBC related
 Operating System: Windows 2003
 PHP Version:      5.2.13

 New Comment:

No feedback was provided. The bug is being suspended because
we assume that you are no longer experiencing the problem.
If this is not the case and you are able to provide the
information that was requested earlier, please do so and
change the status of the bug back to "Open". Thank you.


Previous Comments:
------------------------------------------------------------------------
[2010-11-06 16:41:14] fel...@php.net

Please try using this snapshot:

  http://snaps.php.net/php5.3-latest.tar.gz
 
For Windows:

  http://windows.php.net/snapshots/



------------------------------------------------------------------------
[2010-04-19 21:56:01] arobins at csg dot uwaterloo dot ca

Description:
------------
When assigning the value returned from odbc_result to a variable and the result 
value size is less than the current odbc_longreadlen size, the full longreadlen 
memory amount is allocated instead of the smaller amount.

To fix this, if SQLGetData returns SQL_SUCCESS, we can use the length in vallen 
to reallocate the memory for field to vallen, i.e. inserting the lines 

} else if (rc == SQL_SUCCESS) {
        field = erealloc(field, result->values[field_ind].vallen);

after the rc == SQL_NO_DATA_FOUND check.  I've included a patch file, but I'm 
not sure if I created that correctly.  I've recompiled with this patch and the 
bug appears to be fixed.

Test script:
---------------
<?php
ini_set("memory_limit","1048576");
ini_set( "odbc.defaultlrl", "4096" );
$data = '0';
$db = odbc_connect('DSN', 'user', 'pass');
odbc_exec($db, 'CREATE TABLE Temp (contents long varchar)');
odbc_exec($db, 'INSERT INTO Temp (contents) VALUES (\'' . $data . '\')');
$rst = odbc_exec($db, 'select * from Temp');
$contentArray = Array();
for($i = 0; $i < 1024; $i++){
        odbc_fetch_row($rst,1);
        $contentArray[] = odbc_result($rst, 'contents');
}
odbc_free_result($rst);
echo count($contentArray);
?>

Expected result:
----------------
1024

Actual result:
--------------
Fatal error: Allowed memory size of 1048576 bytes exhausted (tried to allocate 
4096 bytes) in D:\memLeakTest.php on line 12



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



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

Reply via email to