replaceSmiliesHtml template compilation error

ivp

Active member
Affected version
2.3.5
After upgrade from 2.2.17 to 2.3.5 seeing couple of errors shown below.

I've attached example content causing the issue. Avoid using copy&paste, but import the file just like it is, just change post_id.

Code:
TypeError: Macro public:post_macros :: post_user_content() error: XF\Str\Formatter::replaceSmiliesHtml(): Argument #1 ($text) must be of type string, null given, called in /home/forum/src/XF/BbCode/Renderer/Html.php on line 448 src/XF/Str/Formatter.php:230

Stack trace
#0 src/XF/BbCode/Renderer/Html.php(448): XF\Str\Formatter->replaceSmiliesHtml(NULL, 'default')
#1 src/XF/BbCode/Renderer/Html.php(426): XF\BbCode\Renderer\Html->filterString(NULL, Array)
#2 src/XF/BbCode/Traverser.php(67): XF\BbCode\Renderer\Html->renderString([invalid], Array)
#3 src/XF/BbCode/Traverser.php(39): XF\BbCode\Traverser->renderSubTree(Array, Array)
#4 src/XF/BbCode/Traverser.php(22): XF\BbCode\Traverser->renderAst(Array, Object(SV\SignupAbuseBlocking\XF\BbCode\RuleSet), Array)
#5 src/XF/SubContainer/BbCode.php(236): XF\BbCode\Traverser->render('[IMG]https://lh...', Object(XF\BbCode\Parser), Object(SV\SignupAbuseBlocking\XF\BbCode\RuleSet), Array)
#6 src/XF/Template/Templater.php(2608): XF\SubContainer\BbCode->render('[IMG]https://lh...', 'html', 'profile_post', Object(XF\Entity\ProfilePost), Array)
#7 src/XF/Template/Templater.php(1220): XF\Template\Templater->fnBbCode(Object(SV\StandardLib\XF\Template\Templater), false, '[IMG]https://lh...', 'profile_post', Object(XF\Entity\ProfilePost))
#8 internal_data/code_cache/templates/l2/s2/public/profile_post_macros.php(131): XF\Template\Templater->func('bb_code', Array, false)
#9 src/XF/Template/Templater.php(922): XF\Template\Templater->{closure}(Object(SV\StandardLib\XF\Template\Templater), Array, NULL)
#10 internal_data/code_cache/templates/l2/s2/public/member_view.php(403): XF\Template\Templater->callMacro('profile_post_ma...', 'profile_post', Array, Array)
#11 src/XF/Template/Templater.php(1800): XF\Template\Templater->{closure}(Object(SV\StandardLib\XF\Template\Templater), Array, NULL)
#12 src/addons/MaZ/AUN/XF/Template/Templater.php(39): XF\Template\Templater->renderTemplate('member_view', Array, true, NULL)
#13 src/XF/Template/Template.php(24): MaZ\AUN\XF\Template\Templater->renderTemplate('public:member_v...', Array)
#14 src/XF/Mvc/Renderer/Html.php(50): XF\Template\Template->render()
#15 src/XF/Mvc/Dispatcher.php(471): XF\Mvc\Renderer\Html->renderView('XF:Member\\View', 'public:member_v...', Array)
#16 src/XF/Mvc/Dispatcher.php(453): XF\Mvc\Dispatcher->renderView(Object(XF\Mvc\Renderer\Html), Object(XF\Mvc\Reply\View))
#17 src/XF/Mvc/Dispatcher.php(412): XF\Mvc\Dispatcher->renderReply(Object(XF\Mvc\Renderer\Html), Object(XF\Mvc\Reply\View))
#18 src/XF/Mvc/Dispatcher.php(66): XF\Mvc\Dispatcher->render(Object(XF\Mvc\Reply\View), 'html')
#19 src/XF/App.php(2826): XF\Mvc\Dispatcher->run()
#20 src/XF.php(806): XF\App->run()
#21 index.php(23): XF::runApp('XF\\Pub\\App')
#22 {main}

Request state
array(4) {
  ["url"] => string(56) "/threads/abc.779796/page-2"
  ["referrer"] => bool(false)
  ["_GET"] => array(1) {
    ["/abc_779796/page-2"] => string(0) ""
  }
  ["_POST"] => array(0) {
  }
}

Code:
TypeError: Macro public:profile_post_macros :: profile_post() error: XF\Str\Formatter::replaceSmiliesHtml(): Argument #1 ($text) must be of type string, null given, called in /home/forum/src/XF/BbCode/Renderer/Html.php on line 448 src/XF/Str/Formatter.php:230

Stack trace
#0 src/XF/BbCode/Renderer/Html.php(448): XF\Str\Formatter->replaceSmiliesHtml(NULL, 'default')
#1 src/XF/BbCode/Renderer/Html.php(426): XF\BbCode\Renderer\Html->filterString(NULL, Array)
#2 src/XF/BbCode/Traverser.php(67): XF\BbCode\Renderer\Html->renderString([invalid], Array)
#3 src/XF/BbCode/Traverser.php(39): XF\BbCode\Traverser->renderSubTree(Array, Array)
#4 src/XF/BbCode/Traverser.php(22): XF\BbCode\Traverser->renderAst(Array, Object(SV\SignupAbuseBlocking\XF\BbCode\RuleSet), Array)
#5 src/XF/SubContainer/BbCode.php(236): XF\BbCode\Traverser->render('[IMG]https://lh...', Object(XF\BbCode\Parser), Object(SV\SignupAbuseBlocking\XF\BbCode\RuleSet), Array)
#6 src/XF/Template/Templater.php(2608): XF\SubContainer\BbCode->render('[IMG]https://lh...', 'html', 'profile_post', Object(XF\Entity\ProfilePost), Array)
#7 src/XF/Template/Templater.php(1220): XF\Template\Templater->fnBbCode(Object(SV\StandardLib\XF\Template\Templater), false, '[IMG]https://lh...', 'profile_post', Object(XF\Entity\ProfilePost))
#8 internal_data/code_cache/templates/l2/s2/public/profile_post_macros.php(131): XF\Template\Templater->func('bb_code', Array, false)
#9 src/XF/Template/Templater.php(922): XF\Template\Templater->{closure}(Object(SV\StandardLib\XF\Template\Templater), Array, NULL)
#10 internal_data/code_cache/templates/l2/s2/public/member_view.php(403): XF\Template\Templater->callMacro('profile_post_ma...', 'profile_post', Array, Array)
#11 src/XF/Template/Templater.php(1800): XF\Template\Templater->{closure}(Object(SV\StandardLib\XF\Template\Templater), Array, NULL)
#12 src/addons/MaZ/AUN/XF/Template/Templater.php(39): XF\Template\Templater->renderTemplate('member_view', Array, true, NULL)
#13 src/XF/Template/Template.php(24): MaZ\AUN\XF\Template\Templater->renderTemplate('public:member_v...', Array)
#14 src/XF/Mvc/Renderer/Html.php(50): XF\Template\Template->render()
#15 src/XF/Mvc/Dispatcher.php(471): XF\Mvc\Renderer\Html->renderView('XF:Member\\View', 'public:member_v...', Array)
#16 src/XF/Mvc/Dispatcher.php(453): XF\Mvc\Dispatcher->renderView(Object(XF\Mvc\Renderer\Html), Object(XF\Mvc\Reply\View))
#17 src/XF/Mvc/Dispatcher.php(412): XF\Mvc\Dispatcher->renderReply(Object(XF\Mvc\Renderer\Html), Object(XF\Mvc\Reply\View))
#18 src/XF/Mvc/Dispatcher.php(66): XF\Mvc\Dispatcher->render(Object(XF\Mvc\Reply\View), 'html')
#19 src/XF/App.php(2826): XF\Mvc\Dispatcher->run()
#20 src/XF.php(806): XF\App->run()
#21 index.php(23): XF::runApp('XF\\Pub\\App')
#22 {main}

Request state
array(4) {
  ["url"] => string(32) "/members/abc.387717/page-57"
  ["referrer"] => bool(false)
  ["_GET"] => array(1) {
    ["/members/abc_387717/page-57"] => string(0) ""
  }
  ["_POST"] => array(0) {
  }
}
 

Attachments

Here's a quick-and-dirty fix for cleaning up badly encoded messages.

Important: It forces conversion to Latin characters and strips everything else.

List such messages:
Code:
SELECT
    post_id,
    message    
FROM
    xf_post
WHERE
    message LIKE BINARY CONCAT('%', _binary 0xed, '%');
    
SELECT
    profile_post_id,
    message
FROM
    xf_profile_post
WHERE
    message LIKE BINARY CONCAT('%', _binary 0xed, '%');

SELECT
    profile_post_comment_id,
    message
FROM
    xf_profile_post_comment
WHERE
    message LIKE BINARY CONCAT('%', _binary 0xed, '%');

SELECT
    message_id,
    message
FROM
    xf_conversation_message
WHERE
    message LIKE BINARY CONCAT('%', _binary 0xed, '%');

Fix such messages:
Code:
UPDATE
    xf_post
SET
    message = CONVERT(
        CONVERT(message USING latin1) USING utf8mb4
    )
WHERE
    message LIKE BINARY CONCAT('%', _binary 0xed, '%');
    
UPDATE
    xf_profile_post
SET
    message = CONVERT(
        CONVERT(message USING latin1) USING utf8mb4
    )
WHERE
    message LIKE BINARY CONCAT('%', _binary 0xed, '%');

UPDATE
    xf_profile_post_comment
SET
    message = CONVERT(
        CONVERT(message USING latin1) USING utf8mb4
    )
WHERE
    message LIKE BINARY CONCAT('%', _binary 0xed, '%');

UPDATE
    xf_conversation_message
SET
    message = CONVERT(
        CONVERT(message USING latin1) USING utf8mb4
    )
WHERE
    message LIKE BINARY CONCAT('%', _binary 0xed, '%');
 
@ivp that looks to be a invalid utf8 encoding, not sure how the heck that got into the database but it is definitely going to cause "fun" issues. Have you made database changes recently?
 
Haven’t touched the database lately, so this came out of nowhere.

Could be leftovers from a vBulletin import ages ago, or as a consequence of running php cmd.php xf:convert-utf8mb4.

Interesting that phpMyAdmin also couldn’t update the values and returned something like "JSON encoding failed" error.

Since regex and alternative approaches failed on MariaDB, converting to Latin1 was the only solution that resolved the issue.

Fortunately, only about 500 records were impacted.
 
Back
Top Bottom