tony2001 Mon Jul 17 06:44:45 2006 UTC
Added files:
/php-src/ext/standard/tests/strings pathinfo.phpt
Modified files:
/php-src/ext/standard string.c
Log:
fix access to freed memory in pathinfo()
add test
http://cvs.php.net/viewvc.cgi/php-src/ext/standard/string.c?r1=1.553&r2=1.554&diff_format=u
Index: php-src/ext/standard/string.c
diff -u php-src/ext/standard/string.c:1.553 php-src/ext/standard/string.c:1.554
--- php-src/ext/standard/string.c:1.553 Sun Jul 16 15:56:00 2006
+++ php-src/ext/standard/string.c Mon Jul 17 06:44:45 2006
@@ -18,7 +18,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: string.c,v 1.553 2006/07/16 15:56:00 pajoye Exp $ */
+/* $Id: string.c,v 1.554 2006/07/17 06:44:45 tony2001 Exp $ */
/* Synced with php 3.0 revision 1.193 1999-06-16 [ssb] */
@@ -1901,7 +1901,7 @@
{
zval *tmp;
char *path, *ret = NULL;
- int path_len;
+ int path_len, have_basename;
size_t ret_len;
long opt = PHP_PATHINFO_ALL;
@@ -1909,6 +1909,8 @@
return;
}
+ have_basename = ((opt & PHP_PATHINFO_BASENAME) ==
PHP_PATHINFO_BASENAME);
+
MAKE_STD_ZVAL(tmp);
array_init(tmp);
@@ -1919,22 +1921,18 @@
add_assoc_rt_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_rt_stringl(tmp, "basename", ret, ret_len, 0);
- if (UG(unicode)) {
- efree(ret);
- }
}
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);
}
@@ -1945,19 +1943,14 @@
idx = p - ret;
add_assoc_rt_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);
}
@@ -1965,10 +1958,10 @@
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) {
http://cvs.php.net/viewvc.cgi/php-src/ext/standard/tests/strings/pathinfo.phpt?view=markup&rev=1.1
Index: php-src/ext/standard/tests/strings/pathinfo.phpt
+++ php-src/ext/standard/tests/strings/pathinfo.phpt
--TEST--
pathinfo() tests
--FILE--
<?php
var_dump(pathinfo());
var_dump(pathinfo(""));
var_dump(pathinfo("."));
var_dump(pathinfo(".."));
var_dump(pathinfo("/"));
var_dump(pathinfo("./"));
var_dump(pathinfo("/."));
var_dump(pathinfo(".cvsignore"));
var_dump(pathinfo(__FILE__, PATHINFO_BASENAME));
var_dump(pathinfo(__FILE__, PATHINFO_FILENAME));
var_dump(pathinfo(__FILE__, PATHINFO_EXTENSION));
var_dump(pathinfo(__FILE__, PATHINFO_DIRNAME));
var_dump(pathinfo(__FILE__,
PATHINFO_EXTENSION|PATHINFO_FILENAME|PATHINFO_DIRNAME));
var_dump(pathinfo(__FILE__,
PATHINFO_EXTENSION|PATHINFO_FILENAME|PATHINFO_BASENAME));
var_dump(pathinfo(__FILE__, PATHINFO_EXTENSION|PATHINFO_FILENAME));
var_dump(pathinfo(__FILE__, PATHINFO_EXTENSION|PATHINFO_BASENAME));
var_dump(pathinfo(__FILE__, PATHINFO_FILENAME|PATHINFO_DIRNAME));
var_dump(pathinfo(__FILE__, PATHINFO_FILENAME|PATHINFO_BASENAME));
var_dump(pathinfo(__FILE__, PATHINFO_DIRNAME|PATHINFO_EXTENSION));
var_dump(pathinfo(__FILE__, PATHINFO_DIRNAME|PATHINFO_BASENAME));
echo "Done\n";
?>
--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
--UEXPECTF--
Warning: pathinfo() expects at least 1 parameter, 0 given in %s on line %d
NULL
array(2) {
[u"basename"]=>
unicode(0) ""
[u"filename"]=>
string(0) ""
}
array(4) {
[u"dirname"]=>
unicode(1) "."
[u"basename"]=>
unicode(1) "."
[u"extension"]=>
unicode(0) ""
[u"filename"]=>
string(0) ""
}
array(4) {
[u"dirname"]=>
unicode(1) "."
[u"basename"]=>
unicode(2) ".."
[u"extension"]=>
unicode(0) ""
[u"filename"]=>
string(1) "."
}
array(3) {
[u"dirname"]=>
unicode(1) "/"
[u"basename"]=>
unicode(0) ""
[u"filename"]=>
string(0) ""
}
array(4) {
[u"dirname"]=>
unicode(1) "."
[u"basename"]=>
unicode(1) "."
[u"extension"]=>
unicode(0) ""
[u"filename"]=>
string(0) ""
}
array(4) {
[u"dirname"]=>
unicode(1) "/"
[u"basename"]=>
unicode(1) "."
[u"extension"]=>
unicode(0) ""
[u"filename"]=>
string(0) ""
}
array(4) {
[u"dirname"]=>
unicode(1) "."
[u"basename"]=>
unicode(10) ".cvsignore"
[u"extension"]=>
unicode(9) "cvsignore"
[u"filename"]=>
string(0) ""
}
unicode(12) "pathinfo.php"
string(8) "pathinfo"
unicode(3) "php"
unicode(%d) "%s/strings"
unicode(%d) "%s/strings"
unicode(12) "pathinfo.php"
unicode(3) "php"
unicode(12) "pathinfo.php"
unicode(%d) "%s/strings"
unicode(12) "pathinfo.php"
unicode(%d) "%s/strings"
unicode(%d) "%s/strings"
Done
--
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php