colder Tue May 20 21:46:51 2008 UTC Added files: (Branch: PHP_5_3) /php-src/ext/spl/tests fileobject_004.phpt
Modified files: /php-src/ext/spl spl_directory.c spl_directory.h Log: MFH: Fix path lookup when include_path is used http://cvs.php.net/viewvc.cgi/php-src/ext/spl/spl_directory.c?r1=1.45.2.27.2.23.2.20&r2=1.45.2.27.2.23.2.21&diff_format=u Index: php-src/ext/spl/spl_directory.c diff -u php-src/ext/spl/spl_directory.c:1.45.2.27.2.23.2.20 php-src/ext/spl/spl_directory.c:1.45.2.27.2.23.2.21 --- php-src/ext/spl/spl_directory.c:1.45.2.27.2.23.2.20 Sun May 18 12:17:43 2008 +++ php-src/ext/spl/spl_directory.c Tue May 20 21:46:50 2008 @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: spl_directory.c,v 1.45.2.27.2.23.2.20 2008/05/18 12:17:43 colder Exp $ */ +/* $Id: spl_directory.c,v 1.45.2.27.2.23.2.21 2008/05/20 21:46:50 colder Exp $ */ #ifdef HAVE_CONFIG_H # include "config.h" @@ -109,6 +109,9 @@ if (intern->u.file.open_mode) { efree(intern->u.file.open_mode); } + if (intern->orig_path) { + efree(intern->orig_path); + } } spl_filesystem_file_free_line(intern TSRMLS_CC); break; @@ -257,6 +260,8 @@ intern->file_name_len--; } + intern->orig_path = estrndup(intern->u.file.stream->orig_path, strlen(intern->u.file.stream->orig_path)); + intern->file_name = estrndup(intern->file_name, intern->file_name_len); intern->u.file.open_mode = estrndup(intern->u.file.open_mode, intern->u.file.open_mode_len); @@ -985,14 +990,22 @@ { spl_filesystem_object *intern = (spl_filesystem_object*)zend_object_store_get_object(getThis() TSRMLS_CC); char buff[MAXPATHLEN]; + char *filename; php_set_error_handling(EH_THROW, spl_ce_RuntimeException TSRMLS_CC); if (intern->type == SPL_FS_DIR && !intern->file_name && intern->u.dir.entry.d_name[0]) { spl_filesystem_object_get_file_name(intern TSRMLS_CC); } + + if (intern->orig_path) { + filename = intern->orig_path; + } else { + filename = intern->file_name; + } + - if (intern->file_name && VCWD_REALPATH(intern->file_name, buff)) { + if (filename && VCWD_REALPATH(filename, buff)) { #ifdef ZTS if (VCWD_ACCESS(buff, F_OK)) { RETVAL_FALSE; @@ -1866,6 +1879,8 @@ spl_filesystem_object *intern = (spl_filesystem_object*)zend_object_store_get_object(getThis() TSRMLS_CC); zend_bool use_include_path = 0; char *p1, *p2; + char *tmp_path; + int tmp_path_len; php_set_error_handling(EH_THROW, spl_ce_RuntimeException TSRMLS_CC); @@ -1881,18 +1896,29 @@ } if (spl_filesystem_file_open(intern, use_include_path, 0 TSRMLS_CC) == SUCCESS) { - p1 = strrchr(intern->file_name, '/'); + tmp_path_len = strlen(intern->u.file.stream->orig_path); + + if (tmp_path_len && IS_SLASH_AT(intern->u.file.stream->orig_path, tmp_path_len-1)) { + tmp_path_len--; + } + + tmp_path = estrndup(intern->u.file.stream->orig_path, tmp_path_len); + + p1 = strrchr(tmp_path, '/'); #if defined(PHP_WIN32) || defined(NETWARE) - p2 = strrchr(intern->file_name, '\\'); + p2 = strrchr(tmp_path, '\\'); #else p2 = 0; #endif if (p1 || p2) { - intern->_path_len = (p1 > p2 ? p1 : p2) - intern->file_name; + intern->_path_len = (p1 > p2 ? p1 : p2) - tmp_path; } else { intern->_path_len = 0; } - intern->_path = estrndup(intern->file_name, intern->_path_len); + + efree(tmp_path); + + intern->_path = estrndup(intern->u.file.stream->orig_path, intern->_path_len); } php_set_error_handling(EH_NORMAL, NULL TSRMLS_CC); http://cvs.php.net/viewvc.cgi/php-src/ext/spl/spl_directory.h?r1=1.12.2.5.2.4.2.9&r2=1.12.2.5.2.4.2.10&diff_format=u Index: php-src/ext/spl/spl_directory.h diff -u php-src/ext/spl/spl_directory.h:1.12.2.5.2.4.2.9 php-src/ext/spl/spl_directory.h:1.12.2.5.2.4.2.10 --- php-src/ext/spl/spl_directory.h:1.12.2.5.2.4.2.9 Sun May 18 12:17:43 2008 +++ php-src/ext/spl/spl_directory.h Tue May 20 21:46:50 2008 @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: spl_directory.h,v 1.12.2.5.2.4.2.9 2008/05/18 12:17:43 colder Exp $ */ +/* $Id: spl_directory.h,v 1.12.2.5.2.4.2.10 2008/05/20 21:46:50 colder Exp $ */ #ifndef SPL_DIRECTORY_H #define SPL_DIRECTORY_H @@ -65,6 +65,7 @@ spl_other_handler *oth_handler; char *_path; int _path_len; + char *orig_path; char *file_name; int file_name_len; SPL_FS_OBJ_TYPE type; http://cvs.php.net/viewvc.cgi/php-src/ext/spl/tests/fileobject_004.phpt?view=markup&rev=1.1 Index: php-src/ext/spl/tests/fileobject_004.phpt +++ php-src/ext/spl/tests/fileobject_004.phpt --TEST-- SPL: SplFileObject realpath and include_path --SKIPIF-- <?php if (!extension_loaded("spl")) print "skip"; ?> --FILE-- <?php set_include_path('tests'); chdir(dirname(dirname(__FILE__))); // ext/spl $fo = new SplFileObject('fileobject_004.phpt', 'r', true); var_dump($fo->getPath()); var_dump($fo->getFilename()); var_dump($fo->getRealPath()); ?> ==DONE== --EXPECTF-- string(%d) "%sspl%stests" string(19) "fileobject_004.phpt" string(%d) "%sspl%stests%sfileobject_004.phpt" ==DONE== -- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php