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