From: Antony Dovgal Date: Mon, 17 Jul 2006 06:45:08 +0000 (+0000) Subject: MFH X-Git-Tag: php-5.2.0RC1~86 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=f3f44275f4d07fb7b723a7fda997263e9ea5346a;p=php MFH --- diff --git a/ext/standard/string.c b/ext/standard/string.c index cc3fba9fc0..3323f306af 100644 --- a/ext/standard/string.c +++ b/ext/standard/string.c @@ -1341,7 +1341,7 @@ PHP_FUNCTION(pathinfo) { zval *tmp; char *path, *ret = NULL; - int path_len; + int path_len, have_basename; size_t ret_len; long opt = PHP_PATHINFO_ALL; @@ -1349,6 +1349,8 @@ PHP_FUNCTION(pathinfo) return; } + have_basename = ((opt & PHP_PATHINFO_BASENAME) == PHP_PATHINFO_BASENAME); + MAKE_STD_ZVAL(tmp); array_init(tmp); @@ -1359,19 +1361,18 @@ PHP_FUNCTION(pathinfo) add_assoc_string(tmp, "dirname", ret, 1); } efree(ret); + ret = NULL; } - if ((opt & PHP_PATHINFO_BASENAME) == PHP_PATHINFO_BASENAME) { + if (have_basename) { php_basename(path, path_len, NULL, 0, &ret, &ret_len TSRMLS_CC); add_assoc_stringl(tmp, "basename", ret, ret_len, 0); - } + } if ((opt & PHP_PATHINFO_EXTENSION) == PHP_PATHINFO_EXTENSION) { char *p; int idx; - int have_basename = ((opt & PHP_PATHINFO_BASENAME) == PHP_PATHINFO_BASENAME); - /* Have we alrady looked up the basename? */ if (!have_basename) { php_basename(path, path_len, NULL, 0, &ret, &ret_len TSRMLS_CC); } @@ -1382,19 +1383,14 @@ PHP_FUNCTION(pathinfo) idx = p - ret; add_assoc_stringl(tmp, "extension", ret + idx + 1, ret_len - idx - 1, 1); } - - if (!have_basename) { - efree(ret); - } } if ((opt & PHP_PATHINFO_FILENAME) == PHP_PATHINFO_FILENAME) { char *p; int idx; - int have_basename = ((opt & PHP_PATHINFO_BASENAME) == PHP_PATHINFO_BASENAME); /* Have we alrady looked up the basename? */ - if (!have_basename) { + if (!have_basename && !ret) { php_basename(path, path_len, NULL, 0, &ret, &ret_len TSRMLS_CC); } @@ -1402,10 +1398,10 @@ PHP_FUNCTION(pathinfo) idx = p ? (p - ret) : ret_len; add_assoc_stringl(tmp, "filename", ret, idx, 1); + } - if (!have_basename) { - efree(ret); - } + if (!have_basename && ret) { + efree(ret); } if (opt == PHP_PATHINFO_ALL) { diff --git a/ext/standard/tests/strings/pathinfo.phpt b/ext/standard/tests/strings/pathinfo.phpt new file mode 100644 index 0000000000..c1d58f05b3 --- /dev/null +++ b/ext/standard/tests/strings/pathinfo.phpt @@ -0,0 +1,108 @@ +--TEST-- +pathinfo() tests +--FILE-- + +--EXPECTF-- +Warning: pathinfo() expects at least 1 parameter, 0 given in %s on line %d +NULL +array(2) { + ["basename"]=> + string(0) "" + ["filename"]=> + string(0) "" +} +array(4) { + ["dirname"]=> + string(1) "." + ["basename"]=> + string(1) "." + ["extension"]=> + string(0) "" + ["filename"]=> + string(0) "" +} +array(4) { + ["dirname"]=> + string(1) "." + ["basename"]=> + string(2) ".." + ["extension"]=> + string(0) "" + ["filename"]=> + string(1) "." +} +array(3) { + ["dirname"]=> + string(1) "/" + ["basename"]=> + string(0) "" + ["filename"]=> + string(0) "" +} +array(4) { + ["dirname"]=> + string(1) "." + ["basename"]=> + string(1) "." + ["extension"]=> + string(0) "" + ["filename"]=> + string(0) "" +} +array(4) { + ["dirname"]=> + string(1) "/" + ["basename"]=> + string(1) "." + ["extension"]=> + string(0) "" + ["filename"]=> + string(0) "" +} +array(4) { + ["dirname"]=> + string(1) "." + ["basename"]=> + string(10) ".cvsignore" + ["extension"]=> + string(9) "cvsignore" + ["filename"]=> + string(0) "" +} +string(12) "pathinfo.php" +string(8) "pathinfo" +string(3) "php" +string(%d) "%s/strings" +string(%d) "%s/strings" +string(12) "pathinfo.php" +string(3) "php" +string(12) "pathinfo.php" +string(%d) "%s/strings" +string(12) "pathinfo.php" +string(%d) "%s/strings" +string(%d) "%s/strings" +Done