summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CHANGELOG3
-rw-r--r--program/lib/html2text.php28
2 files changed, 24 insertions, 7 deletions
diff --git a/CHANGELOG b/CHANGELOG
index b47b1d4b2..0b6bcc633 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 325a1c941..48df4592c 100644
--- a/program/lib/html2text.php
+++ b/program/lib/html2text.php
@@ -572,9 +572,16 @@ class html2text
*/
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 @@ class html2text
*
* @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 @@ 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
*
* @param string
* @return string
- * @access private
*/
- function _strtoupper($str)
+ private function _strtoupper($str)
{
if (function_exists('mb_strtoupper'))
return mb_strtoupper($str);