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