#35891 [WFx]: Erroneous code thru eval() causes memory leak
| From: | taneli at crasman dot fi | Date: | Wed, 04 Jan 2006 13:58:41 +0000 |
| Subject: | #35891 [WFx]: Erroneous code thru eval() causes memory leak | ||
| References: | 1 | Groups: | php.bugs |
| Request: | Send a blank email to php-bugs+get-91459@lists.php.net to get a copy of this message | ||
ID: 35891
User updated by: taneli at crasman dot fi
Reported By: taneli at crasman dot fi
Status: Wont fix
Bug Type: Scripting Engine problem
Operating System: Linux
PHP Version: 5.1.1, 4.4.1
New Comment:
That would be just fine if there was a method to check PHP's syntax
(other than "php -l") and/or the entire script would terminate properly
(the script continues to run even if eval()'ed code contains a parse
error).
Of course, I don't see why a *parse* error should leave any engine to
an unstable state. Apparently this is reason why user error handlers
were disabled for the more serious errors?
Previous Comments:
------------------------------------------------------------------------
[2006-01-04 14:51:54] tony2001@php.net
This is expected.
After parse error (wherever it happens) the engine is in unstable state
and is unable to gracefully free all the memory allocated before.
Just don't do it [tm].
------------------------------------------------------------------------
[2006-01-04 13:59:02] taneli at crasman dot fi
Also present in PHP 4.4.1.
BTW: Worst CAPTCHA images, ever.
------------------------------------------------------------------------
[2006-01-04 13:53:57] taneli at crasman dot fi
Description:
------------
Running unparsable code - which shouldn't be done, of course, but -
causes a memory leak. Proper, parsable code does not cause memory
leaks.
Reproduce code:
---------------
<?{
echo "Erroneous code eval():\n";
echo "Memory used before: " . memory_get_usage() . "\n";
for ($i = 0; $i < 1000; $i++)
{
eval('$foo = 1; $bar = 2; asdf');
echo "Loop $i, memory used: " . memory_get_usage() . "\n";
}
echo "Memory used after: " . memory_get_usage() . "\n";
echo "\nProper code eval():\n";
echo "Memory used before: " . memory_get_usage() . "\n";
for ($i = 0; $i < 1000; $i++)
{
eval('$foo = 1; $bar = 2;');
echo "Loop $i, memory used: " . memory_get_usage() . "\n";
}
echo "Memory used after: " . memory_get_usage() . "\n";
}?>
Expected result:
----------------
Erroneous code eval():
Memory used before: 42568
Loop 1, memory used: 42568
...
Loop 999, memory used: 42568
Memory used after: 42568
Proper code eval():
Memory used before: 42568
Loop 1, memory used: 42568
...
Loop 999, memory used: 42568
Memory used after: 42568
Actual result:
--------------
Erroneous code eval():
Memory used before: 42568
Loop 0, memory used: 49960
Loop 1, memory used: 57040
Loop 2, memory used: 64088
Loop 3, memory used: 71136
...
Loop 999, memory used: 7073088
Memory used after: 7073064
Proper code eval():
Memory used before: 7073064
Loop 0, memory used: 7073376
...
Loop 999, memory used: 7073376
Memory used after: 7073352
------------------------------------------------------------------------
--
Edit this bug report at http://bugs.php.net/?id=35891&edit=1