tony2001                Mon Nov 13 20:18:12 2006 UTC

  Added files:                 (Branch: PHP_5_2)
    /php-src/ext/standard/tests/strings get_meta_tags.phpt 

  Modified files:              
    /php-src/ext/standard       file.c 
  Log:
  MFH: 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.409.2.6.2.7&r2=1.409.2.6.2.8&diff_format=u
Index: php-src/ext/standard/file.c
diff -u php-src/ext/standard/file.c:1.409.2.6.2.7 
php-src/ext/standard/file.c:1.409.2.6.2.8
--- php-src/ext/standard/file.c:1.409.2.6.2.7   Fri Oct 13 01:42:19 2006
+++ php-src/ext/standard/file.c Mon Nov 13 20:18:12 2006
@@ -21,7 +21,7 @@
    +----------------------------------------------------------------------+
  */
 
-/* $Id: file.c,v 1.409.2.6.2.7 2006/10/13 01:42:19 iliaa Exp $ */
+/* $Id: file.c,v 1.409.2.6.2.8 2006/11/13 20:18:12 tony2001 Exp $ */
 
 /* Synced with php 3.0 revision 1.218 1999-06-16 [ssb] */
 
@@ -399,6 +399,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);
 
@@ -411,6 +412,7 @@
 
                                        have_name = 1;
                                } else if (saw_content) {
+                                       STR_FREE(value);
                                        /* Get the CONTENT attr (Single word 
attr, non-quoted) */
                                        if (PG(magic_quotes_runtime)) {
                                                value = 
php_addslashes(md.token_data, 0, &md.token_len, 0 TSRMLS_CC);
@@ -437,6 +439,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);
 
@@ -449,6 +452,7 @@
 
                                have_name = 1;
                        } else if (saw_content) {
+                               STR_FREE(value);
                                /* Get the CONTENT attr (Single word attr, 
non-quoted) */
                                if (PG(magic_quotes_runtime)) {
                                        value = php_addslashes(md.token_data, 
0, &md.token_len, 0 TSRMLS_CC);
@@ -472,12 +476,13 @@
                                /* For BC */
                                php_strtolower(name, strlen(name));
                                if (have_content) {
-                                       add_assoc_string(return_value, name, 
value, 0); 
+                                       add_assoc_string(return_value, name, 
value, 1); 
                                } else {
                                        add_assoc_string(return_value, name, 
"", 1);
                                }
 
                                efree(name);
+                               efree(value);
                        } else if (have_content) {
                                efree(value);
                        }
@@ -499,6 +504,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

Reply via email to