tony2001 Mon Nov 13 20:17:06 2006 UTC
Added files:
/php-src/ext/standard/tests/strings get_meta_tags.phpt
Modified files:
/php-src/ext/standard file.c
Log:
fix leaks in get_meta_tags() when used with b0rked HTML
add test
http://cvs.php.net/viewvc.cgi/php-src/ext/standard/file.c?r1=1.465&r2=1.466&diff_format=u
Index: php-src/ext/standard/file.c
diff -u php-src/ext/standard/file.c:1.465 php-src/ext/standard/file.c:1.466
--- php-src/ext/standard/file.c:1.465 Wed Oct 25 17:28:20 2006
+++ php-src/ext/standard/file.c Mon Nov 13 20:17:05 2006
@@ -21,7 +21,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: file.c,v 1.465 2006/10/25 17:28:20 andrei Exp $ */
+/* $Id: file.c,v 1.466 2006/11/13 20:17:05 tony2001 Exp $ */
/* Synced with php 3.0 revision 1.218 1999-06-16 [ssb] */
@@ -425,6 +425,7 @@
}
} else if (tok_last == TOK_EQUAL && looking_for_val) {
if (saw_name) {
+ STR_FREE(name);
/* Get the NAME attr (Single word attr,
non-quoted) */
temp = name = estrndup(md.token_data,
md.token_len);
@@ -437,6 +438,7 @@
have_name = 1;
} else if (saw_content) {
+ STR_FREE(value);
/* Get the CONTENT attr (Single word
attr, non-quoted) */
value = estrndup(md.token_data,
md.token_len);
@@ -459,6 +461,7 @@
}
} else if (tok == TOK_STRING && tok_last == TOK_EQUAL &&
looking_for_val) {
if (saw_name) {
+ STR_FREE(name);
/* Get the NAME attr (Quoted single/double) */
temp = name = estrndup(md.token_data,
md.token_len);
@@ -471,6 +474,7 @@
have_name = 1;
} else if (saw_content) {
+ STR_FREE(value);
/* Get the CONTENT attr (Single word attr,
non-quoted) */
value = estrndup(md.token_data, md.token_len);
@@ -490,12 +494,13 @@
/* For BC */
php_strtolower(name, strlen(name));
if (have_content) {
- add_assoc_utf8_string(return_value,
name, value, 0);
+ add_assoc_utf8_string(return_value,
name, value, 1);
} else {
add_assoc_utf8_string(return_value,
name, "", 1);
}
efree(name);
+ efree(value);
} else if (have_content) {
efree(value);
}
@@ -517,6 +522,8 @@
md.token_data = NULL;
}
+ STR_FREE(value);
+ STR_FREE(name);
php_stream_close(md.stream);
}
http://cvs.php.net/viewvc.cgi/php-src/ext/standard/tests/strings/get_meta_tags.phpt?view=markup&rev=1.1
Index: php-src/ext/standard/tests/strings/get_meta_tags.phpt
+++ php-src/ext/standard/tests/strings/get_meta_tags.phpt
--TEST--
get_meta_tags() tests
--FILE--
<?php
$filename = dirname(__FILE__)."/get_meta_tags.html";
$data = <<<DATA
<meta name="author" content="name">
<meta name="keywords" content="php documentation">
<meta name="DESCRIPTION" content="a php manual">
<meta name="geo.position" content="49.33;-86.59">
</head> <!-- parsing stops here -->
DATA;
$data1 = <<<DATA
<html>
<head>
<meta name="author" content="name">
<meta name="keywords" content="php documentation">
<meta name="DESCRIPTION" content="a php manual">
<meta name="geo.position" content="49.33;-86.59">
</head>
<body>
<meta name="author" content="name1">
<meta name="keywords" content="php documentation1">
<meta name="DESCRIPTION" content="a php manual1">
<meta name="geo.position" content="49.33;-86.591">
</body>
</html>
DATA;
$data2 = <<<DATA
<meta name="author" content="name"
<meta name="keywords" content="php documentation">
DATA;
$data3 = <<<DATA
<meta <meta name="keywords" content="php documentation">
DATA;
$data4 = <<<DATA
<meta name="author" content="name"
<meta name="keywords" content="php documentation"
DATA;
$array = array($data, $data1, $data2, $data3, $data4, "", "<>", "<meta<<<<<");
foreach ($array as $html) {
file_put_contents($filename, $html);
var_dump(get_meta_tags($filename));
}
@unlink($filename);
echo "Done\n";
?>
--EXPECTF--
array(4) {
["author"]=>
string(4) "name"
["keywords"]=>
string(17) "php documentation"
["description"]=>
string(12) "a php manual"
["geo_position"]=>
string(12) "49.33;-86.59"
}
array(4) {
["author"]=>
string(4) "name"
["keywords"]=>
string(17) "php documentation"
["description"]=>
string(12) "a php manual"
["geo_position"]=>
string(12) "49.33;-86.59"
}
array(1) {
["keywords"]=>
string(17) "php documentation"
}
array(1) {
["keywords"]=>
string(17) "php documentation"
}
array(0) {
}
array(0) {
}
array(0) {
}
array(0) {
}
Done
--UEXPECTF--
array(4) {
["author"]=>
unicode(4) "name"
["keywords"]=>
unicode(17) "php documentation"
["description"]=>
unicode(12) "a php manual"
["geo_position"]=>
unicode(12) "49.33;-86.59"
}
array(4) {
["author"]=>
unicode(4) "name"
["keywords"]=>
unicode(17) "php documentation"
["description"]=>
unicode(12) "a php manual"
["geo_position"]=>
unicode(12) "49.33;-86.59"
}
array(1) {
["keywords"]=>
unicode(17) "php documentation"
}
array(1) {
["keywords"]=>
unicode(17) "php documentation"
}
array(0) {
}
array(0) {
}
array(0) {
}
array(0) {
}
Done
--
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php