summaryrefslogtreecommitdiff
path: root/ext/standard/string.c
diff options
context:
space:
mode:
Diffstat (limited to 'ext/standard/string.c')
-rw-r--r--ext/standard/string.c24
1 files changed, 10 insertions, 14 deletions
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) {