From d483cd78988494b207dfa885d17a82ff4c7d39cc Mon Sep 17 00:00:00 2001 From: alecpl <alec@alec.pl> Date: Fri, 08 Apr 2011 03:22:07 -0400 Subject: [PATCH] - Fix bug where some content would cause hang on html2text conversion (#1487863) --- CHANGELOG | 3 ++- program/lib/html2text.php | 28 ++++++++++++++++++++++------ 2 files changed, 24 insertions(+), 7 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index b47b1d4..0b6bcc6 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,8 +1,9 @@ CHANGELOG Roundcube Webmail =========================== +- Fix bug where some content would cause hang on html2text conversion (#1487863) - Improve space-stuffing handling in format=flowed messages (#1487861) -- Fixed bug where some dates would produce SQL error in MySQL (#1487856) +- Fix bug where some dates would produce SQL error in MySQL (#1487856) - Added workaround for some IMAP server with broken STATUS response (#1487859) - Fix bug where default_charset was not used for text messages (#1487836) - Enable TinyMCE's contextmenu (#1487014) diff --git a/program/lib/html2text.php b/program/lib/html2text.php index 325a1c9..48df459 100644 --- a/program/lib/html2text.php +++ b/program/lib/html2text.php @@ -572,9 +572,16 @@ */ function _convert_pre(&$text) { + // get the content of PRE element while (preg_match('/<pre[^>]*>(.*)<\/pre>/ismU', $text, $matches)) { - $result = preg_replace($this->pre_search, $this->pre_replace, $matches[1]); - $text = preg_replace('/<pre[^>]*>.*<\/pre>/ismU', '<div><br>' . $result . '<br></div>', $text, 1); + // convert the content + $this->pre_content = sprintf('<div><br>%s<br></div>', + 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[^>]*>.*<\/pre>/ismU', + array('html2text', '_preg_pre_callback'), $text, 1); + // free memory + $this->pre_content = ''; } } @@ -639,9 +646,8 @@ * * @param array PREG matches * @return string - * @access private */ - function _preg_callback($matches) + private function _preg_callback($matches) { switch($matches[1]) { case 'b': @@ -659,13 +665,23 @@ } /** + * 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 * * @param string * @return string - * @access private */ - function _strtoupper($str) + private function _strtoupper($str) { if (function_exists('mb_strtoupper')) return mb_strtoupper($str); -- Gitblit v1.9.1