From e60d8e5a422ffc128e6b4dd6c7b320b863e47d8e Mon Sep 17 00:00:00 2001 From: Justin Filip Date: Wed, 14 Dec 2011 11:36:40 -0500 Subject: [PATCH 1/2] MDL-30741 Fix the handling of PRE tags with the latest code from upstream: http://trac.roundcube.net/browser/trunk/roundcubemail/program/lib/html2text.php?rev=5497 --- lib/html2text.php | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/lib/html2text.php b/lib/html2text.php index 9cc213ddd60..e360b2c47d2 100644 --- a/lib/html2text.php +++ b/lib/html2text.php @@ -543,9 +543,15 @@ class html2text */ function _convert_pre(&$text) { - while(preg_match('/]*>(.*)<\/pre>/ismU', $text, $matches)) { - $result = preg_replace($this->pre_search, $this->pre_replace, $matches[1]); - $text = preg_replace('/]*>.*<\/pre>/ismU', '

' . $result . '
', $text, 1); + while (preg_match('/]*>(.*)<\/pre>/ismU', $text, $matches)) { + // convert the content + $this->pre_content = sprintf('

%s
', + preg_replace($this->pre_search, $this->pre_replace, $matches[1])); + // replace the content (use callback because content can contain $0 variable) + $text = preg_replace_callback('/]*>.*<\/pre>/ismU', + array('html2text', '_preg_pre_callback'), $text, 1); + // free memory + $this->pre_content = ''; } } @@ -573,6 +579,17 @@ class html2text } } + /** + * Callback function for preg_replace_callback use in PRE content handler. + * + * @param array PREG matches + * @return string + */ + private function _preg_pre_callback($matches) + { + return $this->pre_content; + } + /** * Strtoupper multibyte wrapper function * From e0b587be49246206cf6690a321e94666ef7a323a Mon Sep 17 00:00:00 2001 From: Justin Filip Date: Wed, 14 Dec 2011 11:37:45 -0500 Subject: [PATCH 2/2] MDL-30741 Adding a new test to check for incorrect parsing of complicate HTML with a PRE tag. --- lib/simpletest/testweblib.php | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/lib/simpletest/testweblib.php b/lib/simpletest/testweblib.php index cf2c84bc8b5..27359ce88a5 100644 --- a/lib/simpletest/testweblib.php +++ b/lib/simpletest/testweblib.php @@ -139,6 +139,27 @@ class web_test extends UnitTestCase { $this->assertIdentical('0', html_to_text('0')); } + public function test_html_to_text_pre_parsing_problem() { + $strorig = 'Consider the following function:
void FillMeUp(char* in_string) {'.
+                   '
int i = 0;
while (in_string[i] != \'\0\') {
in_string[i] = \'X\';
i++;
}
'. + '}
What would happen if a non-terminated string were input to this function?

'; + + $strconv = 'Consider the following function: + +void FillMeUp(char* in_string) { + int i = 0; + while (in_string[i] != \'\0\') { + in_string[i] = \'X\'; + i++; + } +} +What would happen if a non-terminated string were input to this function? + +'; + + $this->assertIdentical($strconv, html_to_text($strorig)); + } + public function test_clean_text() { $text = "lala xx"; $this->assertEqual($text, clean_text($text, FORMAT_PLAIN));