From: Etienne Kneuss Date: Tue, 8 Jul 2008 22:40:30 +0000 (+0000) Subject: - Fix filename in debug_info X-Git-Tag: BEFORE_HEAD_NS_CHANGE~1334 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=c621d4f63fd0562d8fde78eee868925bc7b36c76;p=php - Fix filename in debug_info - Fix #45345 (getPathInfo on the file instead of the dir) - Remove trailing / on input --- diff --git a/ext/spl/spl_directory.c b/ext/spl/spl_directory.c index b55e3d88b6..c57cd2a0e7 100755 --- a/ext/spl/spl_directory.c +++ b/ext/spl/spl_directory.c @@ -374,29 +374,47 @@ void spl_filesystem_info_set_filename(spl_filesystem_object *intern, zend_uchar intern->file_name = use_copy ? ezstrndup(type, path, len) : path; intern->file_name_len = len; - if (type == IS_UNICODE) { - p1.u = u_strrchr(path.u, '/'); - } else { - p1.s = strrchr(path.s, '/'); - } + while (1) { + if (type == IS_UNICODE) { + p1.u = u_strrchr(intern->file_name.u, '/'); + } else { + p1.s = strrchr(intern->file_name.s, '/'); + } #if defined(PHP_WIN32) || defined(NETWARE) - if (type == IS_UNICODE) { - p2.u = u_strrchr(path.u, '\\'); - } else { - p2.s = strrchr(path.s, '\\'); - } + if (type == IS_UNICODE) { + p2.u = u_strrchr(intern->file_name.u, '\\'); + } else { + p2.s = strrchr(intern->file_name.s, '\\'); + } #else - p2.v = 0; + p2.v = 0; #endif - if (p1.v || p2.v) { - if (type == IS_UNICODE) { - intern->_path_len = (p1.u > p2.u ? p1.u : p2.u) - path.u; + if (p1.v || p2.v) { + zstr slash_pos; + + if (type == IS_UNICODE) { + slash_pos.u = (p1.u > p2.u ? p1.u : p2.u); + if (IS_SLASH_AT(type, intern->file_name, intern->file_name_len)) { + intern->file_name_len = slash_pos.u - intern->file_name.u; + intern->file_name.u[intern->file_name_len] = 0; + continue; + } + intern->_path_len = slash_pos.u - intern->file_name.u; + } else { + slash_pos.s = (p1.s > p2.s ? p1.s : p2.s); + if (IS_SLASH_AT(type, intern->file_name, intern->file_name_len)) { + intern->file_name_len = slash_pos.s - intern->file_name.s; + intern->file_name.s[intern->file_name_len] = 0; + continue; + } + intern->_path_len = slash_pos.s - intern->file_name.s; + } } else { - intern->_path_len = (p1.s > p2.s ? p1.s : p2.s) - path.s; + intern->_path_len = 0; } - } else { - intern->_path_len = 0; + break; } + intern->_path_type = type; intern->_path = ezstrndup(type, path, intern->_path_len); } /* }}} */ @@ -542,6 +560,27 @@ static int spl_filesystem_is_invalid_or_dot(const char * d_name) /* {{{ */ } /* }}} */ +static zstr spl_filesystem_object_get_pathname(spl_filesystem_object *intern, int *len, zend_uchar *type TSRMLS_DC) { /* {{{ */ + switch (intern->type) { + case SPL_FS_INFO: + case SPL_FS_FILE: + *len = intern->file_name_len; + *type = intern->file_name_type; + return intern->file_name; + case SPL_FS_DIR: + if (intern->u.dir.entry.d_name[0]) { + spl_filesystem_object_get_file_name(intern TSRMLS_CC); + *len = intern->file_name_len; + *type = intern->file_name_type; + return intern->file_name; + } + } + *len = 0; + *type = IS_STRING; + return intern->file_name; /* dummy */ +} +/* }}} */ + static HashTable* spl_filesystem_object_get_debug_info(zval *obj, int *is_temp TSRMLS_DC) /* {{{{ */ { spl_filesystem_object *intern = (spl_filesystem_object*)zend_object_store_get_object(obj TSRMLS_CC); @@ -564,13 +603,23 @@ static HashTable* spl_filesystem_object_get_debug_info(zval *obj, int *is_temp T zend_hash_copy(rv, intern->std.properties, (copy_ctor_func_t) zval_add_ref, (void *) &tmp, sizeof(zval *)); - path = spl_filesystem_object_get_path(intern, &path_len, &path_type TSRMLS_CC); + path = spl_filesystem_object_get_pathname(intern, &path_len, &path_type TSRMLS_CC); pnstr = spl_gen_private_prop_name(spl_ce_SplFileInfo, "pathName", sizeof("pathName")-1, &pnlen TSRMLS_CC); add_u_assoc_zstrl_ex(&zrv, ZEND_STR_TYPE, pnstr, pnlen+1, path_type, path, path_len, 1); efree(pnstr.v); if (intern->file_name.v) { pnstr = spl_gen_private_prop_name(spl_ce_SplFileInfo, "fileName", sizeof("fileName")-1, &pnlen TSRMLS_CC); - add_u_assoc_zstrl_ex(&zrv, ZEND_STR_TYPE, pnstr, pnlen+1, intern->file_name_type, intern->file_name, intern->file_name_len, 1); + path = spl_filesystem_object_get_path(intern, &path_len, &path_type TSRMLS_CC); + if (path_len && path_len < intern->file_name_len) { + if (intern->file_name_type == IS_UNICODE) { + path.u = intern->file_name.u + path_len + 1; + } else { + path.s = intern->file_name.s + path_len + 1; + } + add_u_assoc_zstrl_ex(&zrv, ZEND_STR_TYPE, pnstr, pnlen+1, intern->file_name_type, path, intern->file_name_len - (path_len + 1), 1); + } else { + add_u_assoc_zstrl_ex(&zrv, ZEND_STR_TYPE, pnstr, pnlen+1, intern->file_name_type, intern->file_name, intern->file_name_len, 1); + } efree(pnstr.v); } if (intern->type == SPL_FS_DIR) { @@ -849,16 +898,13 @@ SPL_METHOD(DirectoryIterator, getBasename) SPL_METHOD(SplFileInfo, getPathname) { spl_filesystem_object *intern = (spl_filesystem_object*)zend_object_store_get_object(getThis() TSRMLS_CC); + zstr path; + zend_uchar path_type; + int path_len; - switch (intern->type) { - case SPL_FS_INFO: - case SPL_FS_FILE: - RETURN_ZSTRL(intern->file_name_type, intern->file_name, intern->file_name_len, ZSTR_DUPLICATE); - case SPL_FS_DIR: - if (intern->u.dir.entry.d_name[0]) { - spl_filesystem_object_get_file_name(intern TSRMLS_CC); - RETURN_ZSTRL(intern->file_name_type, intern->file_name, intern->file_name_len, ZSTR_DUPLICATE); - } + path = spl_filesystem_object_get_pathname(intern, &path_len, &path_type TSRMLS_CC); + if (path_len) { + RETURN_ZSTRL(path_type, path, path_len, ZSTR_DUPLICATE); } RETURN_BOOL(0); } @@ -1200,8 +1246,10 @@ SPL_METHOD(SplFileInfo, getPathInfo) if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|C", &ce) == SUCCESS) { zend_uchar path_type; int path_len; - zstr path = spl_filesystem_object_get_path(intern, &path_len, &path_type TSRMLS_CC); - spl_filesystem_object_create_info(intern, path_type, path, path_len, 1, ce, return_value TSRMLS_CC); + zstr path = spl_filesystem_object_get_pathname(intern, &path_len, &path_type TSRMLS_CC); + if (path_len) { + spl_filesystem_object_create_info(intern, path_type, path, path_len, 1, ce, return_value TSRMLS_CC); + } } php_set_error_handling(EH_NORMAL, NULL TSRMLS_CC); diff --git a/ext/spl/tests/dit_001.phpt b/ext/spl/tests/dit_001.phpt index 00918dc9b5..2a30608cc8 100755 --- a/ext/spl/tests/dit_001.phpt +++ b/ext/spl/tests/dit_001.phpt @@ -10,9 +10,11 @@ var_dump(is_string($d)); ?> ===DONE=== --EXPECTF-- -object(DirectoryIterator)#%d (3) { +object(DirectoryIterator)#%d (4) { %s"pathName"%s"SplFileInfo":private]=> - %s(1) "." + %s(%d) "./%s" + %s"fileName"%s"SplFileInfo":private]=> + %s(%d) "%s" %s"glob"%s"DirectoryIterator":private]=> bool(false) %s"subPathName"%s"RecursiveDirectoryIterator":private]=> diff --git a/ext/spl/tests/fileobject_003.phpt b/ext/spl/tests/fileobject_003.phpt index 84e5710bf6..ef38de85de 100755 --- a/ext/spl/tests/fileobject_003.phpt +++ b/ext/spl/tests/fileobject_003.phpt @@ -47,13 +47,13 @@ object(SplFileInfo)#%d (2) { [u"pathName":u"SplFileInfo":private]=> unicode(%d) "%s" [u"fileName":u"SplFileInfo":private]=> - unicode(%d) "%sfileobject_001a.txt" + unicode(%d) "fileobject_001a.txt" } object(SplFileInfo)#%d (2) { [u"pathName":u"SplFileInfo":private]=> unicode(%d) "%s" [u"fileName":u"SplFileInfo":private]=> - unicode(%d) "%sfileobject_001a.txt" + unicode(%d) "fileobject_001a.txt" } bool(false) bool(true) @@ -63,7 +63,7 @@ unicode(%d) "%sfileobject_001a.txt" bool(true) unicode(19) "fileobject_001a.txt" bool(true) -unicode(%d) "%stests" +string(%d) "%stests" bool(true) unicode(%d) "%sfileobject_001a.txt" unicode(19) "fileobject_001a.txt" @@ -73,13 +73,13 @@ object(SplFileInfo)#%d (2) { [u"pathName":u"SplFileInfo":private]=> unicode(%d) "%s" [u"fileName":u"SplFileInfo":private]=> - unicode(%d) "%s" + unicode(%d) "" } object(SplFileInfo)#%d (2) { [u"pathName":u"SplFileInfo":private]=> unicode(%d) "%s" [u"fileName":u"SplFileInfo":private]=> - unicode(%d) "%s" + unicode(%d) "" } bool(false) bool(true) @@ -89,7 +89,7 @@ unicode(%d) "%stests" bool(true) unicode(5) "tests" bool(true) -unicode(%d) "%sspl" +string(%d) "%sspl" bool(true) unicode(%d) "%stests" unicode(%d) "%stests" @@ -115,7 +115,7 @@ unicode(%d) "%stests" bool(true) unicode(%d) "tests" bool(true) -unicode(%d) "%sspl" +string(%d) "%sspl" bool(true) unicode(%d) "%stests" unicode(5) "tests" diff --git a/ext/spl/tests/fileobject_004.phpt b/ext/spl/tests/fileobject_004.phpt index e2a3575171..1ac6f6d95a 100644 --- a/ext/spl/tests/fileobject_004.phpt +++ b/ext/spl/tests/fileobject_004.phpt @@ -16,7 +16,7 @@ var_dump($fo->getRealPath()); ?> ==DONE== --EXPECTF-- -unicode(%d) "%sspl%stests" -unicode(19) "fileobject_004.phpt" -unicode(%d) "%sspl%stests%sfileobject_004.phpt" +%s(%d) "%sspl%stests" +%s(19) "fileobject_004.phpt" +%s(%d) "%sspl%stests%sfileobject_004.phpt" ==DONE== diff --git a/ext/spl/tests/fileobject_getfileinfo_basic.phpt b/ext/spl/tests/fileobject_getfileinfo_basic.phpt index ece6e28ad2..28f9e70c38 100644 --- a/ext/spl/tests/fileobject_getfileinfo_basic.phpt +++ b/ext/spl/tests/fileobject_getfileinfo_basic.phpt @@ -18,16 +18,16 @@ var_dump($fi = $d->getFileInfo(), (string)$fi); --EXPECTF-- object(SplFileInfo)#2 (2) { [u"pathName":u"SplFileInfo":private]=> - %s(%d) "%sext%espl%etests" - [u"fileName":u"SplFileInfo":private]=> %s(%d) "%sext%espl%etests%efileobject_getfileinfo_basic.php" + [u"fileName":u"SplFileInfo":private]=> + %s(%d) "fileobject_getfileinfo_basic.php" } %s(%d) "%sext%espl%etests%efileobject_getfileinfo_basic.php" object(SplFileInfo)#4 (2) { [u"pathName":u"SplFileInfo":private]=> - %s(%d) "%sext%espl" + %s(%d) "%sext%espl%stests" [u"fileName":u"SplFileInfo":private]=> - %s(%d) "%sext%espl%etests" + %s(%d) "tests" } %s(%d) "%sext%espl%etests"