ID: 39105 User updated by: ivoras at yahoo dot com -Summary: Possible memory leak in estrndup() Reported By: ivoras at yahoo dot com -Status: No Feedback +Status: Open Bug Type: Filesystem function related Operating System: FreeBSD PHP Version: 5.1.6 New Comment:
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 /* }}} */ Previous Comments: ------------------------------------------------------------------------ [2006-10-18 01:00:00] php-bugs at lists dot php dot net No feedback was provided for this bug for over a week, so it is being suspended automatically. If you are able to provide the information that was originally requested, please do so and change the status of the bug back to "Open". ------------------------------------------------------------------------ [2006-10-10 10:45:27] [EMAIL PROTECTED] Please try using this CVS snapshot: http://snaps.php.net/php5.2-latest.tar.gz For Windows: http://snaps.php.net/win32/php5.2-win32-latest.zip ------------------------------------------------------------------------ [2006-10-10 10:15:13] 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 === ------------------------------------------------------------------------ -- Edit this bug report at http://bugs.php.net/?id=39105&edit=1