diff options
Diffstat (limited to 'ext/standard/string.c')
-rw-r--r-- | ext/standard/string.c | 24 |
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) { |