|
php.net | support | documentation | report a bug | advanced search | search howto | statistics | random bug | login |
[2006-10-10 10:15 UTC] ivoras at yahoo dot com
Description:
------------
PHP compiled with debugging reports memory leaks. It technically really IS a memory leak in the script code, but should that influence the scripting engine?
Reproduce code:
---------------
<?php
$f = fopen('aaa', 'w+');
fwrite($f, "bcde\n");
?>
Expected result:
----------------
A working program
Actual result:
--------------
[Tue Oct 10 12:10:55 2006] Script: 'bla.php'
/usr/ports/lang/php5/work/php-5.1.6/main/main.c(1708) : Freeing 0x085ACCA4 (26 bytes), script=bla.php
=== Total 1 memory leaks detected ===
PatchesPull RequestsHistoryAllCommentsChangesGit/SVN commits
|
|||||||||||||||||||||||||||||||||||||
Copyright © 2001-2025 The PHP GroupAll rights reserved. |
Last updated: Thu Oct 30 05:00:01 2025 UTC |
Tried 6.2-release with same results. It looks like it happens when including files with require_once. Error message: > php b.php [Wed Dec 6 15:18:51 2006] Script: 'b.php' /usr/ports/lang/php5/work/php-5.2.0/main/main.c(1729) : Freeing 0x0861FAFC (40 bytes), script=b.php [Wed Dec 6 15:18:51 2006] Script: 'b.php' /usr/ports/lang/php5/work/php-5.2.0/main/fopen_wrappers.c(543) : Freeing 0x0861FB48 (40 bytes), script=b.php The example script, "b.php" is: <?php require_once('a.php'); class B extends A { function __construct($par) { echo "Hello from B constructor\n"; } } ?> a.php is: <?php class A { function __construct($param) { echo "A::constructor"; } } ?> The code for main.c (part of PHP interpreter) is: 1717 /* Only lookup the real file path and add it to the included_files list if already opened 1718 * otherwise it will get opened and added to the included_files list in zend_execute_scripts 1719 */ 1720 if (primary_file->filename && 1721 primary_file->opened_path == NULL && 1722 primary_file->type != ZEND_HANDLE_FILENAME) { 1723 int realfile_len; 1724 int dummy = 1; 1725 1726 if (expand_filepath(primary_file->filename, realfile TSRMLS_CC)) { 1727 realfile_len = strlen(realfile); 1728 zend_hash_add(&EG(included_files), realfile, realfile_len+1, (void *)&dummy, sizeof(int), NULL); 1729 primary_file->opened_path = estrndup(realfile, realfile_len); 1730 } 1731 } The code for fopen_wrappers is: 513 /* {{{ expand_filepath 514 */ 515 PHPAPI char *expand_filepath(const char *filepath, char *real_path TSRMLS_DC) 516 { 517 cwd_state new_state; 518 char cwd[MAXPATHLEN]; 519 char *result; 520 521 if (IS_ABSOLUTE_PATH(filepath, strlen(filepath))) { 522 cwd[0] = '\0'; 523 } else{ 524 result = VCWD_GETCWD(cwd, MAXPATHLEN); 525 if (!result) { 526 cwd[0] = '\0'; 527 } 528 } 529 530 new_state.cwd = strdup(cwd); 531 new_state.cwd_length = strlen(cwd); 532 533 if(virtual_file_ex(&new_state, filepath, NULL, 1)) { 534 free(new_state.cwd); 535 return NULL; 536 } 537 538 if(real_path) { 539 int copy_len = new_state.cwd_length>MAXPATHLEN-1?MAXPATHLEN-1:new_state.cwd_length; 540 memcpy(real_path, new_state.cwd, copy_len); 541 real_path[copy_len]='\0'; 542 } else { 543 real_path = estrndup(new_state.cwd, new_state.cwd_length); 544 } 545 free(new_state.cwd); 546 547 return real_path; 548 } 549 /* }}} */